From 6bc3bada6b9b649296a5380782b53abe4f4dddfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Kol=C3=A1=C5=99?= Date: Mon, 4 Mar 2024 18:05:35 +0100 Subject: [PATCH] qr code detector, marker detector --- .nvmrc | 1 + package-lock.json | 30 +- package.json | 2 + src/nodes/MarkerDetector.ts | 186 + src/nodes/QRCodeDetector.ts | 157 + src/nodes/index.ts | 2 + vendor/ts-aruco/.eslintrc.js | 22 + .../.github/workflows/publish-to-pages.yml | 44 + vendor/ts-aruco/.gitignore | 1 + vendor/ts-aruco/LICENSE.txt | 152 + vendor/ts-aruco/README.md | 126 + vendor/ts-aruco/package-lock.json | 5362 +++++++++++++++++ vendor/ts-aruco/package.json | 35 + vendor/ts-aruco/samples/.gitignore | 24 + vendor/ts-aruco/samples/debug-posit.html | 41 + vendor/ts-aruco/samples/debug.html | 21 + vendor/ts-aruco/samples/getusermedia.html | 19 + vendor/ts-aruco/samples/index.html | 18 + vendor/ts-aruco/samples/package-lock.json | 1226 ++++ vendor/ts-aruco/samples/package.json | 19 + vendor/ts-aruco/samples/public/earth.jpg | Bin 0 -> 127481 bytes vendor/ts-aruco/samples/src/debug-posit.ts | 264 + vendor/ts-aruco/samples/src/debug.ts | 170 + vendor/ts-aruco/samples/src/getusermedia.ts | 97 + vendor/ts-aruco/samples/src/vite-env.d.ts | 1 + vendor/ts-aruco/samples/tsconfig.json | 23 + vendor/ts-aruco/samples/vite.config.js | 16 + vendor/ts-aruco/src/aruco.ts | 284 + vendor/ts-aruco/src/cv.ts | 697 +++ vendor/ts-aruco/src/posit1.ts | 516 ++ vendor/ts-aruco/src/posit2.ts | 497 ++ vendor/ts-aruco/src/svd.ts | 283 + vendor/ts-aruco/tsconfig.json | 109 + 33 files changed, 10444 insertions(+), 1 deletion(-) create mode 100644 .nvmrc create mode 100644 src/nodes/MarkerDetector.ts create mode 100644 src/nodes/QRCodeDetector.ts create mode 100644 vendor/ts-aruco/.eslintrc.js create mode 100644 vendor/ts-aruco/.github/workflows/publish-to-pages.yml create mode 100644 vendor/ts-aruco/.gitignore create mode 100644 vendor/ts-aruco/LICENSE.txt create mode 100644 vendor/ts-aruco/README.md create mode 100644 vendor/ts-aruco/package-lock.json create mode 100644 vendor/ts-aruco/package.json create mode 100644 vendor/ts-aruco/samples/.gitignore create mode 100644 vendor/ts-aruco/samples/debug-posit.html create mode 100644 vendor/ts-aruco/samples/debug.html create mode 100644 vendor/ts-aruco/samples/getusermedia.html create mode 100644 vendor/ts-aruco/samples/index.html create mode 100644 vendor/ts-aruco/samples/package-lock.json create mode 100644 vendor/ts-aruco/samples/package.json create mode 100644 vendor/ts-aruco/samples/public/earth.jpg create mode 100644 vendor/ts-aruco/samples/src/debug-posit.ts create mode 100644 vendor/ts-aruco/samples/src/debug.ts create mode 100644 vendor/ts-aruco/samples/src/getusermedia.ts create mode 100644 vendor/ts-aruco/samples/src/vite-env.d.ts create mode 100644 vendor/ts-aruco/samples/tsconfig.json create mode 100644 vendor/ts-aruco/samples/vite.config.js create mode 100644 vendor/ts-aruco/src/aruco.ts create mode 100644 vendor/ts-aruco/src/cv.ts create mode 100644 vendor/ts-aruco/src/posit1.ts create mode 100644 vendor/ts-aruco/src/posit2.ts create mode 100644 vendor/ts-aruco/src/svd.ts create mode 100644 vendor/ts-aruco/tsconfig.json diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..da2d398 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +14 \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 3c28fb2..f236255 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "graphfx", - "version": "0.4.4", + "version": "0.8.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -4064,6 +4064,29 @@ "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.21.tgz", "integrity": "sha512-pUrWq3V5PiSGFLeLxoGqReTZmiiXwY3jRkIG5sLLKjyqNxrwm/04b4nw7LSmGWJcKk59XOM/YRTUwOzo4MMlow==" }, + "@zxing/browser": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@zxing/browser/-/browser-0.1.4.tgz", + "integrity": "sha512-WYjaav7St4sj/u/Km2llE4NU2Pq3JFIWnczr0tmyCC1KUlp08rV3qpu7iiEB4kOx/CgcCzrSebNnSmFt5B3IFg==", + "requires": { + "@zxing/text-encoding": "^0.9.0" + } + }, + "@zxing/library": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@zxing/library/-/library-0.20.0.tgz", + "integrity": "sha512-6Ev6rcqVjMakZFIDvbUf0dtpPGeZMTfyxYg4HkVWioWeN7cRcnUWT3bU6sdohc82O1nPXcjq6WiGfXX2Pnit6A==", + "requires": { + "@zxing/text-encoding": "~0.9.0", + "ts-custom-error": "^3.2.1" + } + }, + "@zxing/text-encoding": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz", + "integrity": "sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==", + "optional": true + }, "ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -13219,6 +13242,11 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "ts-custom-error": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/ts-custom-error/-/ts-custom-error-3.3.1.tgz", + "integrity": "sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==" + }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", diff --git a/package.json b/package.json index df73dd7..5464ae7 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,8 @@ "@tensorflow/tfjs-core": "^4.2.0", "@types/css-font-loading-module": "0.0.2", "@types/uuid": "^3.4.6", + "@zxing/browser": "^0.1.4", + "@zxing/library": "^0.20.0", "lodash": "^4.17.21", "uuid": "^3.3.3" }, diff --git a/src/nodes/MarkerDetector.ts b/src/nodes/MarkerDetector.ts new file mode 100644 index 0000000..a3545c8 --- /dev/null +++ b/src/nodes/MarkerDetector.ts @@ -0,0 +1,186 @@ +import { + ImageVar, + NumberVar, + StringVar, +} from './io/AbstractIOSet'; +import Node from "./Node"; +import {canvasPool2D} from "../canvas/CanvasPool"; +import {mediaSize} from './canvas'; +import {waitForMedia} from "../utils"; +import {Detector, Marker} from '../../vendor/ts-aruco/src/aruco' + +enum PivotPoint { + LEFT_TOP = "left_top", + RIGHT_TOP = "right_top", + LEFT_BOTTOM = "left_bottom", + RIGHT_BOTTOM = "right_bottom", + CENTER = "center", +} + +const inputs = { + image: { + type: 'Image' + } as ImageVar, + markerId: { + type: 'Number', + } as NumberVar, + pivotPoint: { + type: 'String', + enum: [ + PivotPoint.LEFT_TOP, + PivotPoint.RIGHT_TOP, + PivotPoint.LEFT_BOTTOM, + PivotPoint.RIGHT_BOTTOM, + PivotPoint.CENTER, + ], + } as StringVar, +} + +const outputs = { + image: { + type: 'Image' + } as ImageVar, + markerId: { + type: 'Number' + } as NumberVar, + x: { + type: 'Number' + } as NumberVar, + y: { + type: 'Number' + } as NumberVar, + rotation: { + type: 'Number' + } as NumberVar, + x1: { + type: 'Number' + } as NumberVar, + y1: { + type: 'Number' + } as NumberVar, + x2: { + type: 'Number' + } as NumberVar, + y2: { + type: 'Number' + } as NumberVar, +}; + +type CanvasContext = CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D; + +export default class MarkerDetector extends Node { + detector: Detector; + + constructor(options = {}) { + super('MarkerDetector', inputs, outputs); + this.detector = new Detector(); + } + + async _update() { + await waitForMedia(this.in.image.value); + const {width, height} = mediaSize(this.__in.image.value); + + if (!this.in.image.value) { + return; + } + + const originalImageCanvas = canvasPool2D.createCanvas(); + originalImageCanvas.width = width; + originalImageCanvas.height = height; + originalImageCanvas.acquire(); + const originalImageCanvasCtx = originalImageCanvas.getContext('2d'); + + originalImageCanvasCtx.drawImage(this.in.image.value as CanvasImageSource | OffscreenCanvas, 0, 0); + + let results = this.detector.detect(originalImageCanvasCtx.getImageData(0, 0, width, height)); + + if (this.in.markerId.value) { + results = results.filter((marker) => marker.id === this.in.markerId.value); + } + + if (results.length === 0) { + this.out.image.value = originalImageCanvas; + this.out.markerId.value = undefined; + this.out.x.value = undefined; + this.out.y.value = undefined; + this.out.rotation.value = undefined; + this.out.x1.value = undefined; + this.out.y1.value = undefined; + this.out.x2.value = undefined; + this.out.y2.value = undefined; + return; + } + + const result = results[0]; + + const { + id, + x, + y, + rotation, + x1, + y1, + x2, + y2, + + } = this.calculateOutput(result, this.in.pivotPoint.value as PivotPoint); + + this.out.image.value = originalImageCanvas; + this.out.markerId.value = id; + this.out.x.value = x; + this.out.y.value = y; + this.out.rotation.value = rotation; + this.out.x1.value = x1; + this.out.y1.value = y1; + this.out.x2.value = x2; + this.out.y2.value = y2; + } + + private calculateOutput(marker: Marker, pivot: PivotPoint = PivotPoint.LEFT_TOP) { + const {points} = marker.corners; + + const minX = Math.min(...points.map((p) => p.x)); + const minY = Math.min(...points.map((p) => p.y)); + const maxX = Math.max(...points.map((p) => p.x)); + const maxY = Math.max(...points.map((p) => p.y)); + const w = maxX - minX; + const h = maxY - minY; + + let x: number, y: number; + switch (pivot) { + case PivotPoint.CENTER: + x = minX + w / 2; + y = minY + h / 2; + break; + case PivotPoint.LEFT_TOP: + x = minX; + y = minY; + break; + case PivotPoint.RIGHT_TOP: + x = maxX; + y = minY; + break; + case PivotPoint.LEFT_BOTTOM: + x = minX; + y = maxY; + break; + case PivotPoint.RIGHT_BOTTOM: + x = maxX; + y = maxY; + break; + } + + const rotation = Math.atan2(points[1].y - points[0].y, points[1].x - points[0].x) * (180 / Math.PI); + + return { + id: marker.id, + x, + y, + rotation, + x1: points[0].x, + y1: points[0].y, + x2: points[1].x, + y2: points[1].y, + }; + } +} diff --git a/src/nodes/QRCodeDetector.ts b/src/nodes/QRCodeDetector.ts new file mode 100644 index 0000000..99a016e --- /dev/null +++ b/src/nodes/QRCodeDetector.ts @@ -0,0 +1,157 @@ +import { + ImageVar, + NumberVar, +} from './io/AbstractIOSet'; +import Node from "./Node"; +import {canvasPool2D} from "../canvas/CanvasPool"; +import {mediaSize} from './canvas'; +import {OutputProperties, StringVar} from "graphfx/src/nodes/io/AbstractIOSet"; +import {BrowserQRCodeReader} from "@zxing/browser"; +import {Result, ResultPoint, NotFoundException} from "@zxing/library"; +import {waitForMedia} from "graphfx/src/utils"; + +const inputs = { + image: { + type: 'Image' + } as ImageVar, + filter: { + type: 'String', + } as StringVar, +} + +const outputs = { + image: { + type: 'Image' + } as ImageVar, + rotation: { + type: 'Number', + } as NumberVar, + x: { + type: 'Number', + } as NumberVar, + y: { + type: 'Number', + } as NumberVar, + size: { + type: 'Number', + } as NumberVar, +}; + +type CanvasContext = CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D; + +export default class QRCodeDetector extends Node { + reader: BrowserQRCodeReader; + + constructor(options = {}) { + super('QRCodeDetector', inputs, outputs); + this.reader = new BrowserQRCodeReader(); + } + + async _update() { + await waitForMedia(this.in.image.value); + const {width, height} = mediaSize(this.__in.image.value); + + if (!this.in.image.value) { + return; + } + + const originalImageCanvas = canvasPool2D.createCanvas(); + originalImageCanvas.width = width; + originalImageCanvas.height = height; + originalImageCanvas.acquire(); + const originalCanvasCtx = originalImageCanvas.getContext('2d'); + + originalCanvasCtx.drawImage(this.in.image.value as CanvasImageSource | OffscreenCanvas, 0, 0); + + this.out.rotation.value = 0; + this.out.size.value = 0; + this.out.x.value = 0; + this.out.y.value = 0; + + while (true) { + try { + // @ts-ignore + const result = this.reader.decodeFromCanvas(originalImageCanvas); + const { + rotation, + size, + x, + y, + } = this.coverQRCode(originalCanvasCtx, result); + + if (!this.in.filter.value || result.getText() === this.in.filter.value) { + this.out.rotation.value = rotation; + this.out.size.value = size; + this.out.x.value = x; + this.out.y.value = y; + // this.out.image.value = this.in.image.value; + this.out.image.value = this.in.image.value; + break; + } + } catch (e) { + if (e instanceof NotFoundException) { + break; + } + this.out.image.value = this.in.image.value; + console.log(e); + break; + } + } + } + + private calculateDistance = (point1: ResultPoint, point2: ResultPoint) => { + const dx = point1.getX() - point2.getX(); + const dy = point1.getY() - point2.getY(); + return Math.sqrt(dx * dx + dy * dy); + }; + + private calculateRotation = (point1: ResultPoint, point2: ResultPoint) => { + const dx = point2.getX() - point1.getX(); + const dy = point2.getY() - point1.getY(); + return Math.atan2(dy, dx); + }; + + private coverQRCode(ctx: CanvasContext, result: Result) { + const resultPoints = result.getResultPoints(); + + if (resultPoints.length < 3) { + console.error('Probably not a QR code') + return; + } + + // @ts-ignore estimatedModuleSize is not a part of the public API but we need that value + const qrCodeWidth = this.calculateDistance(resultPoints[0], resultPoints[2]) - resultPoints[0].estimatedModuleSize * 6; + // @ts-ignore estimatedModuleSize is not a part of the public API but we need that value + const finderPatternWidth = resultPoints[0].estimatedModuleSize * 7; + const rotation = this.calculateRotation(resultPoints[0], resultPoints[1]); + + // Save the current context state + ctx.save(); + + // Translate to the center of the top left finder pattern + ctx.translate(resultPoints[0].getX(), resultPoints[0].getY()); + + // Rotate the context + ctx.rotate(rotation); + + // Draw the rectangle + ctx.beginPath(); + ctx.rect(-finderPatternWidth / 2, -finderPatternWidth / 2, qrCodeWidth + finderPatternWidth, qrCodeWidth + finderPatternWidth); + ctx.fillStyle = '#FF0000'; + ctx.fill(); + + // Restore the context state + ctx.restore(); + + const x = (resultPoints[0].getX() + resultPoints[2].getX()) / 2; + const y = (resultPoints[0].getY() + resultPoints[2].getY()) / 2; + + return { + // rotation here is in radians and I know it's -90deg, so I need to add 90deg to it + rotation: rotation + Math.PI / 2, + size: qrCodeWidth, + x, + y, + } + } +} diff --git a/src/nodes/index.ts b/src/nodes/index.ts index 2c72add..140f07e 100644 --- a/src/nodes/index.ts +++ b/src/nodes/index.ts @@ -31,3 +31,5 @@ export {default as BodySegmentation} from './AI/BodySegmentation'; export {default as BodyPartSegmentation} from './AI/BodyPartSegmentation'; export {default as FaceFeaturePosition} from './AI/FaceFeaturePosition'; export {default as Eval} from './Eval'; +export {default as QRCodeDetector} from './QRCodeDetector'; +export {default as MarkerDetector} from './MarkerDetector'; diff --git a/vendor/ts-aruco/.eslintrc.js b/vendor/ts-aruco/.eslintrc.js new file mode 100644 index 0000000..77e8ee2 --- /dev/null +++ b/vendor/ts-aruco/.eslintrc.js @@ -0,0 +1,22 @@ +module.exports = { + ignorePatterns: [ + "dist", + "node_modules", + ".eslintrc.js", + "samples/vite.config.js", + ], + env: { + browser: true, + es2021: true, + }, + extends: "standard-with-typescript", + + overrides: [], + parserOptions: { + ecmaVersion: "latest", + sourceType: "module", + }, + rules: { + "@typescript-eslint/semi": [2, "always"], + }, +}; diff --git a/vendor/ts-aruco/.github/workflows/publish-to-pages.yml b/vendor/ts-aruco/.github/workflows/publish-to-pages.yml new file mode 100644 index 0000000..b171e3c --- /dev/null +++ b/vendor/ts-aruco/.github/workflows/publish-to-pages.yml @@ -0,0 +1,44 @@ +name: Publish to github pages +run-name: ${{ github.actor }} is publishing to GitHub Actions 🚀 +on: [push, workflow_dispatch] +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Check out repository code + uses: actions/checkout@v4 + - name: Build examples + run: | + cd samples + npm ci + npm run build + # - name: Fix permissions + # run: | + # chmod -c -R +rX "_site/" | while read line; do + # echo "::warning title=Invalid file permissions automatically fixed::$line" + # done + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@v3 + with: + path: "samples/dist" + + deploy: + # Add a dependency to the build job + needs: build + + # Grant GITHUB_TOKEN the permissions required to make a Pages deployment + permissions: + pages: write # to deploy to Pages + id-token: write # to verify the deployment originates from an appropriate source + + # Deploy to the github-pages environment + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + + # Specify runner + deployment step + runs-on: ubuntu-latest + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 # or the latest "vX.X.X" version tag for this action diff --git a/vendor/ts-aruco/.gitignore b/vendor/ts-aruco/.gitignore new file mode 100644 index 0000000..07e6e47 --- /dev/null +++ b/vendor/ts-aruco/.gitignore @@ -0,0 +1 @@ +/node_modules diff --git a/vendor/ts-aruco/LICENSE.txt b/vendor/ts-aruco/LICENSE.txt new file mode 100644 index 0000000..65b518d --- /dev/null +++ b/vendor/ts-aruco/LICENSE.txt @@ -0,0 +1,152 @@ +Copyright (c) 2011 Juan Mellado + +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. + + +ArUco +==== +BSD License + + +OpenCV +====== + IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. + + By downloading, copying, installing or using the software you agree to this license. + If you do not agree to this license, do not download, install, + copy or use the software. + + + License Agreement + For Open Source Computer Vision Library + +Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +Copyright (C) 2009, Willow Garage Inc., all rights reserved. +Third party copyrights are property of their respective owners. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistribution's of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistribution's 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. + + * The name of the copyright holders may not 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 Intel Corporation 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. + + +AForge.NET +======== +GNU LESSER GENERAL PUBLIC LICENSE + +Version 3, 29 June 2007 + +Copyright © 2007 Free Software Foundation, Inc. + +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + +This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. + +0. Additional Definitions. +As used herein, “this License” refers to version 3 of the GNU Lesser General Public License, and the “GNU GPL” refers to version 3 of the GNU General Public License. + +“The Library” refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. + +An “Application” is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. + +A “Combined Work” is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the “Linked Version”. + +The “Minimal Corresponding Source” for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. + +The “Corresponding Application Code” for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. + +1. Exception to Section 3 of the GNU GPL. +You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. + +2. Conveying Modified Versions. +If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: + +a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or +b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. +3. Object Code Incorporating Material from Library Header Files. +The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: + +a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. +b) Accompany the object code with a copy of the GNU GPL and this license document. +4. Combined Works. +You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: + +a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. +b) Accompany the Combined Work with a copy of the GNU GPL and this license document. +c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. +d) Do one of the following: +0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. +1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. +e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) +5. Combined Libraries. +You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: + +a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. +b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. +6. Revised Versions of the GNU Lesser General Public License. +The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. + +If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. + + +StackBoxBlur +========== +Copyright (c) 2010 Mario Klingemann + +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/vendor/ts-aruco/README.md b/vendor/ts-aruco/README.md new file mode 100644 index 0000000..f594c78 --- /dev/null +++ b/vendor/ts-aruco/README.md @@ -0,0 +1,126 @@ +**js-aruco** is a port to JavaScript of the ArUco library. + +[ArUco](http://www.uco.es/investiga/grupos/ava/node/26) is a minimal library for Augmented Reality applications based on OpenCv. + +### Demos ### + +100% JavaScript (see details bellow): + +- [Webcam live demo!](https://jcmellado.github.io/js-aruco/getusermedia/getusermedia.html) + +3D Pose Estimation: + +- [3D Earth!](https://jcmellado.github.io/js-aruco/debug-posit/debug-posit.html) + +Visual Debugging: + +- [Debug session jam!](https://jcmellado.github.io/js-aruco/debug/debug.html) + +Flash camera access (see details bellow): + +- [Webcam live demo!](https://jcmellado.github.io/js-aruco/webcam/webcam.html) + +### Videos ### + +Webcam video adquisition: + +[![js-aruco](http://img.youtube.com/vi/_wzPupbww4I/0.jpg)](http://www.youtube.com/watch?v=_wzPupbww4I) + +3D Pose estimation: + +[![js-aruco](http://img.youtube.com/vi/9WD4wR3_-JM/0.jpg)](http://www.youtube.com/watch?v=9WD4wR3_-JM) + +Visual Debugging: + +[![js-aruco](http://img.youtube.com/vi/xvTMRdgySUQ/0.jpg)](http://www.youtube.com/watch?v=xvTMRdgySUQ) + +### Markers ### + +A 7x7 grid with an external unused black border. Internal 5x5 cells contains id information. + +Each row must follow any of the following patterns: + +`white - black - black - black - black` + +`white - black - white - white - white` + +`black - white - black - black - white` + +`black - white - white - white - black` + +Example: + +![Marker](http://www.inmensia.com/files/pictures/external/1001.png) + +### Usage ### +Create an `AR.Detector` object: + +``` +var detector = new AR.Detector(); +``` + +Call `detect` function: + +``` +var markers = detector.detect(imageData); +``` + +`markers` result will be an array of `AR.Marker` objects with detected markers. + +`AR.Marker` objects have two properties: + + * `id`: Marker id. + * `corners`: 2D marker corners. + +`imageData` argument must be a valid `ImageData` canvas object. + +``` +var canvas = document.getElementById("canvas"); + +var context = canvas.getContext("2d"); + +var imageData = context.getImageData(0, 0, width, height); +``` + +### 3D Pose Estimation ### +Create an `POS.Posit` object: + +``` +var posit = new POS.Posit(modelSize, canvas.width); +``` + +`modelSize` argument must be the real marker size (millimeters). + +Call `pose` function: + +``` +var pose = posit.pose(corners); +``` + +`corners` must be centered on canvas: + +``` +var corners = marker.corners; + +for (var i = 0; i < corners.length; ++ i){ + var corner = corners[i]; + + corner.x = corner.x - (canvas.width / 2); + corner.y = (canvas.height / 2) - corner.y; +} +``` + +`pose` result will be a `POS.Pose` object with two estimated pose (if any): + + * `bestError`: Error of the best estimated pose. + * `bestRotation`: 3x3 rotation matrix of the best estimated pose. + * `bestTranslation`: Translation vector of the best estimated pose. + * `alternativeError`: Error of the alternative estimated pose. + * `alternativeRotation`: 3x3 rotation matrix of the alternative estimated pose. + * `alternativeTranslation`: Translation vector of the alternative estimated pose. + +Note: POS namespace can be taken from posit1.js or posit2.js. + +### Flash Demo (deprecated) ### + +It uses [Flashcam](https://github.com/jcmellado/flashcam), a minimal Flash library to capture video. diff --git a/vendor/ts-aruco/package-lock.json b/vendor/ts-aruco/package-lock.json new file mode 100644 index 0000000..f893292 --- /dev/null +++ b/vendor/ts-aruco/package-lock.json @@ -0,0 +1,5362 @@ +{ + "name": "ts-aruco", + "version": "0.0.1", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "ts-aruco", + "version": "0.0.1", + "license": "ISC", + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^6.21.0", + "eslint": "^8.57.0", + "eslint-config-standard-with-typescript": "^43.0.1", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-n": "^16.6.2", + "eslint-plugin-promise": "^6.1.1", + "typescript": "^5.3.3" + } + }, + "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/@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/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/@eslint/eslintrc/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/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/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/@humanwhocodes/config-array/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/@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.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "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/@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/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "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/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "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/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-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/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/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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.filter": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", + "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", + "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "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/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/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/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/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "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/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/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/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/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/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/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/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/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/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/es-abstract": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.4.tgz", + "integrity": "sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "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.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.1", + "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.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "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/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/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@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-compat-utils": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz", + "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "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-with-typescript": { + "version": "43.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-43.0.1.tgz", + "integrity": "sha512-WfZ986+qzIzX6dcr4yGUyVb/l9N3Z8wPXCc5z/70fljs3UbWhhV+WxrfgsqMToRzuuyX9MqZ974pq2UPhDTOcA==", + "dev": true, + "dependencies": { + "@typescript-eslint/parser": "^6.4.0", + "eslint-config-standard": "17.1.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^6.4.0", + "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", + "typescript": "*" + } + }, + "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-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-plugin-es-x": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz", + "integrity": "sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.6.0", + "eslint-compat-utils": "^0.1.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": ">=8" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "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.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/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/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/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/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": "16.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz", + "integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "builtins": "^5.0.1", + "eslint-plugin-es-x": "^7.5.0", + "get-tsconfig": "^4.7.0", + "globals": "^13.24.0", + "ignore": "^5.2.4", + "is-builtin-module": "^3.2.1", + "is-core-module": "^2.12.1", + "minimatch": "^3.1.2", + "resolve": "^1.22.2", + "semver": "^7.5.3" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-n/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/eslint-plugin-n/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/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-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-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/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/eslint/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/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/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/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/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/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/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-glob/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/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.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "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-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/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/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/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": 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/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/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.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/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "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": "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/glob/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/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/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "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.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "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.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "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/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/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/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "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-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-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-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-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-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-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-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-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "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/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/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "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/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-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": "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/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/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/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/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/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/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/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/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/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/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/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-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.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.2", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", + "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", + "dev": true, + "dependencies": { + "array.prototype.filter": "^1.0.3", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0" + } + }, + "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/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/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/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": "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/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/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-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/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/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "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/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/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/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-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-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "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": "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/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/safe-array-concat": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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/side-channel": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", + "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/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": "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/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": "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/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/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/ts-api-utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", + "integrity": "sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "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/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/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "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/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/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-typed-array": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/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/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" + } + } + }, + "dependencies": { + "@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 + }, + "@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, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@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 + }, + "@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "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, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "dependencies": { + "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, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "@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 + }, + "@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true + }, + "@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, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@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 + }, + "@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, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@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 + }, + "@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 + }, + "@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + } + }, + "@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 + }, + "acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true + }, + "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, + "requires": {} + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "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 + }, + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "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 + }, + "array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + } + }, + "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, + "requires": { + "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" + } + }, + "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 + }, + "array.prototype.filter": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", + "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + } + }, + "array.prototype.findlastindex": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", + "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "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, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "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, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + } + }, + "available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "requires": { + "possible-typed-array-names": "^1.0.0" + } + }, + "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 + }, + "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, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true + }, + "builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "requires": { + "semver": "^7.0.0" + } + }, + "call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "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, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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 + }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, + "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, + "requires": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "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, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "es-abstract": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.4.tgz", + "integrity": "sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "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.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.1", + "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.14" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true + }, + "es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + } + }, + "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, + "requires": { + "hasown": "^2.0.0" + } + }, + "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, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "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 + }, + "eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@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" + }, + "dependencies": { + "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, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "eslint-compat-utils": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz", + "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==", + "dev": true, + "requires": {} + }, + "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, + "requires": {} + }, + "eslint-config-standard-with-typescript": { + "version": "43.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-43.0.1.tgz", + "integrity": "sha512-WfZ986+qzIzX6dcr4yGUyVb/l9N3Z8wPXCc5z/70fljs3UbWhhV+WxrfgsqMToRzuuyX9MqZ974pq2UPhDTOcA==", + "dev": true, + "requires": { + "@typescript-eslint/parser": "^6.4.0", + "eslint-config-standard": "17.1.0" + } + }, + "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, + "requires": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "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, + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-es-x": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz", + "integrity": "sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.6.0", + "eslint-compat-utils": "^0.1.2" + } + }, + "eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "requires": { + "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.15.0" + }, + "dependencies": { + "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, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "eslint-plugin-n": { + "version": "16.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz", + "integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "builtins": "^5.0.1", + "eslint-plugin-es-x": "^7.5.0", + "get-tsconfig": "^4.7.0", + "globals": "^13.24.0", + "ignore": "^5.2.4", + "is-builtin-module": "^3.2.1", + "is-core-module": "^2.12.1", + "minimatch": "^3.1.2", + "resolve": "^1.22.2", + "semver": "^7.5.3" + }, + "dependencies": { + "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, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "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, + "requires": {} + }, + "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, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "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 + }, + "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, + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "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, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "@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" + }, + "dependencies": { + "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, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "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 + }, + "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 + }, + "fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "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, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "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, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "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, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "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, + "requires": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "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, + "requires": { + "is-callable": "^1.1.3" + } + }, + "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 + }, + "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 + }, + "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, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + } + }, + "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 + }, + "get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, + "get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + } + }, + "get-tsconfig": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "dev": true, + "requires": { + "resolve-pkg-maps": "^1.0.0" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "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, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "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, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "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" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "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 + }, + "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 + }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true + }, + "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 + }, + "has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.3" + } + }, + "hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, + "ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true + }, + "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, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "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, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + } + }, + "is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "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, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "requires": { + "builtin-modules": "^3.3.0" + } + }, + "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 + }, + "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, + "requires": { + "hasown": "^2.0.0" + } + }, + "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, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "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, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "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 + }, + "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, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "requires": { + "call-bind": "^1.0.7" + } + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "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, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "requires": { + "which-typed-array": "^1.1.14" + } + }, + "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, + "requires": { + "call-bind": "^1.0.2" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "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, + "requires": { + "argparse": "^2.0.1" + } + }, + "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 + }, + "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 + }, + "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 + }, + "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, + "requires": { + "minimist": "^1.2.0" + } + }, + "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, + "requires": { + "json-buffer": "3.0.1" + } + }, + "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, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "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, + "requires": { + "p-locate": "^5.0.0" + } + }, + "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 + }, + "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, + "requires": { + "yallist": "^4.0.0" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "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 + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "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 + }, + "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 + }, + "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, + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "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, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "object.groupby": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", + "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", + "dev": true, + "requires": { + "array.prototype.filter": "^1.0.3", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0" + } + }, + "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, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "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, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "requires": { + "@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" + } + }, + "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, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "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, + "requires": { + "p-limit": "^3.0.2" + } + }, + "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, + "requires": { + "callsites": "^3.0.0" + } + }, + "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 + }, + "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 + }, + "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 + }, + "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 + }, + "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 + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true + }, + "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 + }, + "punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true + }, + "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 + }, + "regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + } + }, + "resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "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 + }, + "resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "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, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-array-concat": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + } + }, + "safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + } + }, + "semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dev": true, + "requires": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + } + }, + "set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + } + }, + "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, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "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 + }, + "side-channel": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", + "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "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, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "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, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "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, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "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, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "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 + }, + "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 + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + }, + "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 + }, + "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 + }, + "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, + "requires": { + "is-number": "^7.0.0" + } + }, + "ts-api-utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", + "integrity": "sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==", + "dev": true, + "requires": {} + }, + "tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "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, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "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 + }, + "typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + } + }, + "typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true + }, + "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, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "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, + "requires": { + "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" + } + }, + "which-typed-array": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" + } + }, + "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 + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "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 + } + } +} diff --git a/vendor/ts-aruco/package.json b/vendor/ts-aruco/package.json new file mode 100644 index 0000000..e2accb6 --- /dev/null +++ b/vendor/ts-aruco/package.json @@ -0,0 +1,35 @@ +{ + "name": "ts-aruco", + "version": "0.0.1", + "description": "TypeScript port of jcmellado's ArUco library", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/axeljaeger/ts-aruco.git" + }, + "keywords": [ + "aruco", + "markers", + "augmented", + "reality", + "typescript" + ], + "author": "Axel Jäger", + "license": "ISC", + "bugs": { + "url": "https://github.com/axeljaeger/ts-aruco/issues" + }, + "homepage": "https://github.com/axeljaeger/ts-aruco#readme", + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^6.21.0", + "eslint": "^8.57.0", + "eslint-config-standard-with-typescript": "^43.0.1", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-n": "^16.6.2", + "eslint-plugin-promise": "^6.1.1", + "typescript": "^5.3.3" + } +} diff --git a/vendor/ts-aruco/samples/.gitignore b/vendor/ts-aruco/samples/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/vendor/ts-aruco/samples/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/vendor/ts-aruco/samples/debug-posit.html b/vendor/ts-aruco/samples/debug-posit.html new file mode 100644 index 0000000..0626a4c --- /dev/null +++ b/vendor/ts-aruco/samples/debug-posit.html @@ -0,0 +1,41 @@ + + + + Augmented Reality + + + + + + + + + + + +
-= Augmented Reality =-
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Powered by js-aruco and Three.js
+ + + + \ No newline at end of file diff --git a/vendor/ts-aruco/samples/debug.html b/vendor/ts-aruco/samples/debug.html new file mode 100644 index 0000000..feb05fc --- /dev/null +++ b/vendor/ts-aruco/samples/debug.html @@ -0,0 +1,21 @@ + + + + Augmented Reality Marker Detector + + + + + + +
+
-= Augmented Reality Marker Detector =-
+ + +
Powered by js-aruco +
+
+ + + + \ No newline at end of file diff --git a/vendor/ts-aruco/samples/getusermedia.html b/vendor/ts-aruco/samples/getusermedia.html new file mode 100644 index 0000000..54f1af6 --- /dev/null +++ b/vendor/ts-aruco/samples/getusermedia.html @@ -0,0 +1,19 @@ + + + + Augmented Reality Marker Detector + + + + +
+
-= Augmented Reality Marker Detector =-
+ + +
Powered by js-aruco +
+
+ + + + \ No newline at end of file diff --git a/vendor/ts-aruco/samples/index.html b/vendor/ts-aruco/samples/index.html new file mode 100644 index 0000000..66d59a3 --- /dev/null +++ b/vendor/ts-aruco/samples/index.html @@ -0,0 +1,18 @@ + + + + + + + + Aruco Examples ported to typescript + + + +

Aruco demos

+ Debug + Debug Posit + Get user media + + + \ No newline at end of file diff --git a/vendor/ts-aruco/samples/package-lock.json b/vendor/ts-aruco/samples/package-lock.json new file mode 100644 index 0000000..e18c7c5 --- /dev/null +++ b/vendor/ts-aruco/samples/package-lock.json @@ -0,0 +1,1226 @@ +{ + "name": "samples", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "samples", + "version": "0.0.0", + "dependencies": { + "three": "^0.161.0" + }, + "devDependencies": { + "@types/three": "^0.161.2", + "typescript": "^5.2.2", + "vite": "^5.1.4" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", + "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", + "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", + "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", + "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", + "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", + "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", + "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", + "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", + "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", + "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", + "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", + "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", + "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/stats.js": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.3.tgz", + "integrity": "sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==", + "dev": true + }, + "node_modules/@types/three": { + "version": "0.161.2", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.161.2.tgz", + "integrity": "sha512-DazpZ+cIfBzbW/p0zm6G8CS03HBMd748A3R1ZOXHpqaXZLv2I5zNgQUrRG//UfJ6zYFp2cUoCQaOLaz8ubH07w==", + "dev": true, + "dependencies": { + "@types/stats.js": "*", + "@types/webxr": "*", + "fflate": "~0.6.10", + "meshoptimizer": "~0.18.1" + } + }, + "node_modules/@types/webxr": { + "version": "0.5.14", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.14.tgz", + "integrity": "sha512-UEMMm/Xn3DtEa+gpzUrOcDj+SJS1tk5YodjwOxcqStNhCfPcwgyC5Srg2ToVKyg2Fhq16Ffpb0UWUQHqoT9AMA==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/fflate": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", + "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==", + "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/meshoptimizer": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", + "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "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/postcss": { + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", + "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.12.0", + "@rollup/rollup-android-arm64": "4.12.0", + "@rollup/rollup-darwin-arm64": "4.12.0", + "@rollup/rollup-darwin-x64": "4.12.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.12.0", + "@rollup/rollup-linux-arm64-gnu": "4.12.0", + "@rollup/rollup-linux-arm64-musl": "4.12.0", + "@rollup/rollup-linux-riscv64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-musl": "4.12.0", + "@rollup/rollup-win32-arm64-msvc": "4.12.0", + "@rollup/rollup-win32-ia32-msvc": "4.12.0", + "@rollup/rollup-win32-x64-msvc": "4.12.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/three": { + "version": "0.161.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.161.0.tgz", + "integrity": "sha512-LC28VFtjbOyEu5b93K0bNRLw1rQlMJ85lilKsYj6dgTu+7i17W+JCCEbvrpmNHF1F3NAUqDSWq50UD7w9H2xQw==" + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/vite": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.4.tgz", + "integrity": "sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.35", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + } + }, + "dependencies": { + "@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-android-arm-eabi": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", + "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", + "dev": true, + "optional": true + }, + "@rollup/rollup-android-arm64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", + "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-arm64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", + "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-x64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", + "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", + "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", + "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-musl": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", + "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-riscv64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", + "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", + "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-musl": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", + "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", + "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-ia32-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", + "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-x64-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", + "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", + "dev": true, + "optional": true + }, + "@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "@types/stats.js": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.3.tgz", + "integrity": "sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==", + "dev": true + }, + "@types/three": { + "version": "0.161.2", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.161.2.tgz", + "integrity": "sha512-DazpZ+cIfBzbW/p0zm6G8CS03HBMd748A3R1ZOXHpqaXZLv2I5zNgQUrRG//UfJ6zYFp2cUoCQaOLaz8ubH07w==", + "dev": true, + "requires": { + "@types/stats.js": "*", + "@types/webxr": "*", + "fflate": "~0.6.10", + "meshoptimizer": "~0.18.1" + } + }, + "@types/webxr": { + "version": "0.5.14", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.14.tgz", + "integrity": "sha512-UEMMm/Xn3DtEa+gpzUrOcDj+SJS1tk5YodjwOxcqStNhCfPcwgyC5Srg2ToVKyg2Fhq16Ffpb0UWUQHqoT9AMA==", + "dev": true + }, + "esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "fflate": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", + "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==", + "dev": true + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "meshoptimizer": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", + "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==", + "dev": true + }, + "nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "postcss": { + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "dev": true, + "requires": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "rollup": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", + "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", + "dev": true, + "requires": { + "@rollup/rollup-android-arm-eabi": "4.12.0", + "@rollup/rollup-android-arm64": "4.12.0", + "@rollup/rollup-darwin-arm64": "4.12.0", + "@rollup/rollup-darwin-x64": "4.12.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.12.0", + "@rollup/rollup-linux-arm64-gnu": "4.12.0", + "@rollup/rollup-linux-arm64-musl": "4.12.0", + "@rollup/rollup-linux-riscv64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-musl": "4.12.0", + "@rollup/rollup-win32-arm64-msvc": "4.12.0", + "@rollup/rollup-win32-ia32-msvc": "4.12.0", + "@rollup/rollup-win32-x64-msvc": "4.12.0", + "@types/estree": "1.0.5", + "fsevents": "~2.3.2" + } + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "three": { + "version": "0.161.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.161.0.tgz", + "integrity": "sha512-LC28VFtjbOyEu5b93K0bNRLw1rQlMJ85lilKsYj6dgTu+7i17W+JCCEbvrpmNHF1F3NAUqDSWq50UD7w9H2xQw==" + }, + "typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true + }, + "vite": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.4.tgz", + "integrity": "sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==", + "dev": true, + "requires": { + "esbuild": "^0.19.3", + "fsevents": "~2.3.3", + "postcss": "^8.4.35", + "rollup": "^4.2.0" + } + } + } +} diff --git a/vendor/ts-aruco/samples/package.json b/vendor/ts-aruco/samples/package.json new file mode 100644 index 0000000..6a44875 --- /dev/null +++ b/vendor/ts-aruco/samples/package.json @@ -0,0 +1,19 @@ +{ + "name": "samples", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "@types/three": "^0.161.2", + "typescript": "^5.2.2", + "vite": "^5.1.4" + }, + "dependencies": { + "three": "^0.161.0" + } +} diff --git a/vendor/ts-aruco/samples/public/earth.jpg b/vendor/ts-aruco/samples/public/earth.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4b28d5b056bc1b7393f856e2c56cd66f597495da GIT binary patch literal 127481 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

&SG0s!#o4KvYvV9ZW-o_*y%1= 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

)A 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 e1f5vtUgYB{xRk2@*i-}`_`d+wVYHY4 literal 0 HcmV?d00001 diff --git a/vendor/ts-aruco/samples/src/debug-posit.ts b/vendor/ts-aruco/samples/src/debug-posit.ts new file mode 100644 index 0000000..da480dc --- /dev/null +++ b/vendor/ts-aruco/samples/src/debug-posit.ts @@ -0,0 +1,264 @@ +import { Detector, type Marker } from '../../src/aruco'; +import { type CVPoint } from '../../src/cv'; +import { Posit } from '../../src/posit1'; + +import * as THREE from 'three'; + +let video: HTMLVideoElement; +let canvas: HTMLCanvasElement; +let context: CanvasRenderingContext2D; + +let imageData: ImageData; +let detector: Detector; +let posit: Posit; +let renderer1: THREE.WebGLRenderer; +let renderer2: THREE.WebGLRenderer; +let renderer3: THREE.WebGLRenderer; +let scene1: THREE.Scene; +let scene2: THREE.Scene; +let scene3: THREE.Scene; +let scene4: THREE.Scene; + +let camera1: THREE.PerspectiveCamera; +let camera2: THREE.PerspectiveCamera; +let camera3: THREE.OrthographicCamera; +let camera4: THREE.PerspectiveCamera; + +let plane1: THREE.Object3D; +let plane2: THREE.Object3D; +let model: THREE.Object3D; +let texture: THREE.Object3D; +let step = 0.0; + +const modelSize = 35.0; // millimeters + +function onLoad(): void { + video = document.getElementById('video') as HTMLVideoElement; + canvas = document.getElementById('canvas') as HTMLCanvasElement; + context = canvas.getContext('2d') as CanvasRenderingContext2D; + + canvas.width = parseInt(canvas.style.width); + canvas.height = parseInt(canvas.style.height); + + navigator.mediaDevices + .getUserMedia({ video: true }) + .then(function (stream) { + video.srcObject = stream; + }) + .catch(function (err) { + console.log(err.name + ': ' + err.message); + } + ); + + detector = new Detector(); + posit = new Posit(modelSize, canvas.width); + + createRenderers(); + createScenes(); + + requestAnimationFrame(tick); +}; + +function tick(): void { + requestAnimationFrame(tick); + + if (video.readyState === video.HAVE_ENOUGH_DATA) { + snapshot(); + + const markers: Marker[] = detector.detect(imageData); + drawCorners(markers); + updateScenes(markers); + + render(); + } +}; + +function snapshot(): void { + context.drawImage(video, 0, 0, canvas.width, canvas.height); + imageData = context.getImageData(0, 0, canvas.width, canvas.height); +}; + +function drawCorners(markers: Marker[]): void { + context.lineWidth = 3; + + for (let i = 0; i < markers.length; ++i) { + const corners = markers[i].corners; + + context.strokeStyle = 'red'; + context.beginPath(); + + for (let j = 0; j < corners.points.length; ++j) { + let corner: CVPoint = corners.points[j]; + context.moveTo(corner.x, corner.y); + corner = corners.points[(j + 1) % corners.points.length]; + context.lineTo(corner.x, corner.y); + } + + context.stroke(); + context.closePath(); + + context.strokeStyle = 'green'; + context.strokeRect(corners.points[0].x - 2, corners.points[0].y - 2, 4, 4); + } +}; + +function createRenderers(): void { + renderer1 = new THREE.WebGLRenderer(); + renderer1.setClearColor(0xffff00, 1); + renderer1.setSize(canvas.width, canvas.height); + document.getElementById('container1')!.appendChild(renderer1.domElement); + scene1 = new THREE.Scene(); + camera1 = new THREE.PerspectiveCamera(40, canvas.width / canvas.height, 1, 1000); + scene1.add(camera1); + + renderer2 = new THREE.WebGLRenderer(); + renderer2.setClearColor(0xffff00, 1); + renderer2.setSize(canvas.width, canvas.height); + document.getElementById('container2')!.appendChild(renderer2.domElement); + scene2 = new THREE.Scene(); + camera2 = new THREE.PerspectiveCamera(40, canvas.width / canvas.height, 1, 1000); + scene2.add(camera2); + + renderer3 = new THREE.WebGLRenderer(); + renderer3.setClearColor(0xffffff, 1); + renderer3.setSize(canvas.width, canvas.height); + document.getElementById('container')!.appendChild(renderer3.domElement); + + scene3 = new THREE.Scene(); + camera3 = new THREE.OrthographicCamera(-0.5, 0.5, 0.5, -0.5); + scene3.add(camera3); + + scene4 = new THREE.Scene(); + camera4 = new THREE.PerspectiveCamera(40, canvas.width / canvas.height, 1, 1000); + scene4.add(camera4); +}; + +function render(): void { + renderer1.clear(); + renderer1.render(scene1, camera1); + + renderer2.clear(); + renderer2.render(scene2, camera2); + + renderer3.autoClear = false; + renderer3.clear(); + renderer3.render(scene3, camera3); + renderer3.render(scene4, camera4); +}; + +function createScenes(): void { + plane1 = createPlane(); + scene1.add(plane1); + + plane2 = createPlane(); + scene2.add(plane2); + + texture = createTexture(); + scene3.add(texture); + + model = createModel(); + scene4.add(model); +}; + +function createPlane(): THREE.Object3D { + const object = new THREE.Object3D(); + const geometry = new THREE.PlaneGeometry(1, 1); + const material = new THREE.MeshNormalMaterial(); + const mesh = new THREE.Mesh(geometry, material); + + object.rotation.order = 'YXZ'; + + object.add(mesh); + + return object; +}; + +function createTexture(): THREE.Object3D { + const texture = new THREE.VideoTexture(video); + const object = new THREE.Object3D(); + const geometry = new THREE.PlaneGeometry(1.0, 1.0); + const material = new THREE.MeshBasicMaterial({ map: texture, depthTest: false, depthWrite: false }); + const mesh = new THREE.Mesh(geometry, material); + + object.position.z = -1; + + object.add(mesh); + + return object; +}; + +function createModel(): THREE.Object3D { + const object = new THREE.Object3D(); + const geometry = new THREE.SphereGeometry(0.5, 15, 15, Math.PI); + + const texture = new THREE.TextureLoader().load('earth.jpg'); + const material = new THREE.MeshBasicMaterial({ map: texture }); + const mesh = new THREE.Mesh(geometry, material); + + object.add(mesh); + + return object; +}; + +function updateScenes(markers: Marker[]): void { + if (markers.length > 0) { + const corners = markers[0].corners; + + for (let i = 0; i < corners.points.length; ++i) { + const corner = corners.points[i]; + + corner.x = corner.x - (canvas.width / 2); + corner.y = (canvas.height / 2) - corner.y; + } + + const pose = posit.pose(corners.points); + + updateObject(plane1, pose.bestRotation, pose.bestTranslation); + updateObject(plane2, pose.alternativeRotation, pose.alternativeTranslation); + updateObject(model, pose.bestRotation, pose.bestTranslation); + + updatePose('pose1', pose.bestError, pose.bestRotation, pose.bestTranslation); + updatePose('pose2', pose.alternativeError, pose.alternativeRotation, pose.alternativeTranslation); + + step += 0.025; + + model.rotation.z -= step; + } + // //@ts-ignore + //texture.children[0].material.map.needsUpdate = true; +}; + +function updateObject(object: THREE.Object3D, rotation: number[][], translation: number[]): void { + object.scale.x = modelSize; + object.scale.y = modelSize; + object.scale.z = modelSize; + + object.rotation.x = -Math.asin(-rotation[1][2]); + object.rotation.y = -Math.atan2(rotation[0][2], rotation[2][2]); + object.rotation.z = Math.atan2(rotation[1][0], rotation[1][1]); + + object.position.x = translation[0]; + object.position.y = translation[1]; + object.position.z = -translation[2]; +}; + +function updatePose(id: string, error: number, rotation: number[][], translation: number[]): void { + const yaw = -Math.atan2(rotation[0][2], rotation[2][2]); + const pitch = -Math.asin(-rotation[1][2]); + const roll = Math.atan2(rotation[1][0], rotation[1][1]); + + const d = document.getElementById(id); + if (d !== null) { + d.innerHTML = ' error: ' + error + + '
' + + ' x: ' + (translation[0] | 0) + + ' y: ' + (translation[1] | 0) + + ' z: ' + (translation[2] | 0) + + '
' + + ' yaw: ' + Math.round(-yaw * 180.0 / Math.PI) + + ' pitch: ' + Math.round(-pitch * 180.0 / Math.PI) + + ' roll: ' + Math.round(roll * 180.0 / Math.PI); + } +}; + +window.onload = onLoad; diff --git a/vendor/ts-aruco/samples/src/debug.ts b/vendor/ts-aruco/samples/src/debug.ts new file mode 100644 index 0000000..33dc045 --- /dev/null +++ b/vendor/ts-aruco/samples/src/debug.ts @@ -0,0 +1,170 @@ +import { Detector, type Marker } from '../../src/aruco.ts'; +import { type CVContour, otsu, threshold, warp } from '../../src/cv.ts'; + +let camera: HTMLVideoElement; +let canvas: HTMLCanvasElement; +let context: CanvasRenderingContext2D; +let imageData: ImageData; +let detector: Detector; + +let debugImage: ImageData; +let warpImage: ImageData; +let homographyImage: ImageData; + +export const onLoad = (): void => { + camera = document.getElementById('video') as HTMLVideoElement; + canvas = document.getElementById('canvas') as HTMLCanvasElement; + context = canvas!.getContext('2d')!; + + camera.width = 320; + camera.height = 240; + + canvas.width = parseInt(canvas.style.width); + canvas.height = parseInt(canvas.style.height); + + navigator.mediaDevices + .getUserMedia({ video: true }) + .then((stream) => { + camera.srcObject = stream; + }) + .catch(function (err) { + console.log(err.name + ': ' + err.message); + } + ); + + imageData = context.getImageData(0, 0, camera.width, camera.height); + detector = new Detector(); + + debugImage = context.createImageData(camera.width, camera.height); + warpImage = context.createImageData(49, 49); + + requestAnimationFrame(tick); +}; + +const tick = (): void => { + requestAnimationFrame(tick); + + if (camera.readyState === camera.HAVE_ENOUGH_DATA) { + snapshot(); + + const markers = detector.detect(imageData); + drawDebug(); + drawCorners(markers); + drawId(markers); + } +}; + +const snapshot = (): void => { + context.drawImage(camera, 0, 0, camera.width, camera.height); + imageData = context.getImageData(0, 0, camera.width, camera.height); +}; + +const drawDebug = (): void => { + const width = camera.width; const height = camera.height; + + context.clearRect(0, 0, canvas.width, canvas.height); + + context.putImageData(imageData, 0, 0); + context.putImageData(createImage(detector.grey!, debugImage), width, 0); + context.putImageData(createImage(detector.thres!, debugImage), width * 2, 0); + + drawContours(detector.contours, 0, height, function (hole: any) { return hole ? 'magenta' : 'blue'; }); + drawContours(detector.polys, width, height, function () { return 'green'; }); + drawContours(detector.candidates, width * 2, height, function () { return 'red'; }); + + drawWarps(detector.grey!, detector.candidates, height * 2 + 20); +}; + +const drawContours = (contours: CVContour[], x: number, y: number, fn: any): void => { + let i = contours.length; let j; let contour; let point; + + while (i--) { + contour = contours[i]; + + context.strokeStyle = fn(contour.hole); + context.beginPath(); + + for (j = 0; j < contour.points?.length; ++j) { + point = contour.points[j]; + context.moveTo(x + point.x, y + point.y); + point = contour.points[(j + 1) % contour.points.length]; + context.lineTo(x + point.x, y + point.y); + } + + context.stroke(); + context.closePath(); + } +}; + +const drawWarps = (imageSrc: ImageData, contours: CVContour[], y: number): void => { + let i = contours.length; + let contour; + + const offset = (canvas.width - ((warpImage.width + 10) * contours.length)) / 2; + while (i--) { + contour = contours[i]; + + homographyImage = warp(imageSrc, contour, warpImage.width); + context.putImageData(createImage(homographyImage, warpImage), offset + i * (warpImage.width + 10), y); + + homographyImage = threshold(homographyImage, otsu(homographyImage)); + context.putImageData(createImage(homographyImage, warpImage), offset + i * (warpImage.width + 10), y + 60); + } +}; + +const drawCorners = (markers: Marker[]): void => { + context.lineWidth = 3; + + for (let i = 0; i !== markers.length; ++i) { + const corners = markers[i].corners.points; + + context.strokeStyle = 'red'; + context.beginPath(); + + for (let j = 0; j !== corners.length; ++j) { + let corner = corners[j]; + context.moveTo(corner.x, corner.y); + corner = corners[(j + 1) % corners.length]; + context.lineTo(corner.x, corner.y); + } + + context.stroke(); + context.closePath(); + + context.strokeStyle = 'green'; + context.strokeRect(corners[0].x - 2, corners[0].y - 2, 4, 4); + } +}; + +const drawId = (markers: Marker[]): void => { + context.strokeStyle = 'blue'; + context.lineWidth = 1; + + for (let i = 0; i !== markers.length; ++i) { + const corners = markers[i].corners.points; + + let x = Infinity; + let y = Infinity; + + for (let j = 0; j !== corners.length; ++j) { + const corner = corners[j]; + x = Math.min(x, corner.x); + y = Math.min(y, corner.y); + } + + context.strokeText(`${markers[i].id}`, x, y); + } +}; + +const createImage = (src: ImageData, dst: ImageData): ImageData => { + let i = src.data.length; let j = (i * 4) + 3; + + while (i--) { + dst.data[j -= 4] = 255; + dst.data[j - 1] = dst.data[j - 2] = dst.data[j - 3] = src.data[i]; + } + + return dst; +}; + +window.onload = onLoad; diff --git a/vendor/ts-aruco/samples/src/getusermedia.ts b/vendor/ts-aruco/samples/src/getusermedia.ts new file mode 100644 index 0000000..1d9183b --- /dev/null +++ b/vendor/ts-aruco/samples/src/getusermedia.ts @@ -0,0 +1,97 @@ +import { Detector, type Marker } from '../../src/aruco.ts'; + +let video: HTMLVideoElement; +let canvas: HTMLCanvasElement; +let context: CanvasRenderingContext2D; +let imageData: ImageData; +let detector: Detector; + +const onLoad = (): void => { + video = document.getElementById('video')! as HTMLVideoElement; + canvas = document.getElementById('canvas')! as HTMLCanvasElement; + context = canvas.getContext('2d')!; + + canvas.width = parseInt(canvas.style.width); + canvas.height = parseInt(canvas.style.height); + + navigator.mediaDevices + .getUserMedia({ video: true }) + .then(function (stream) { + video.srcObject = stream; + }) + .catch(function (err) { + console.log(err.name + ': ' + err.message); + } + ); + + detector = new Detector(); + + requestAnimationFrame(tick); +}; + +const tick = (): void => { + requestAnimationFrame(tick); + + if (video.readyState === video.HAVE_ENOUGH_DATA) { + snapshot(); + const markers = detector.detect(imageData); + drawCorners(markers); + drawId(markers); + } +}; + +const snapshot = (): void => { + context.drawImage(video, 0, 0, canvas.width, canvas.height); + imageData = context.getImageData(0, 0, canvas.width, canvas.height); +}; + +const drawCorners = (markers: Marker[]): void => { + let corners, corner, i, j; + + context.lineWidth = 3; + + for (i = 0; i !== markers.length; ++i) { + corners = markers[i].corners.points; + + context.strokeStyle = 'red'; + context.beginPath(); + + for (j = 0; j !== corners.length; ++j) { + corner = corners[j]; + context.moveTo(corner.x, corner.y); + corner = corners[(j + 1) % corners.length]; + context.lineTo(corner.x, corner.y); + } + + context.stroke(); + context.closePath(); + + context.strokeStyle = 'green'; + context.strokeRect(corners[0].x - 2, corners[0].y - 2, 4, 4); + } +}; + +const drawId = (markers: Marker[]): void => { + let corners, corner, x, y, i, j; + + context.strokeStyle = 'blue'; + context.lineWidth = 1; + + for (i = 0; i !== markers.length; ++i) { + corners = markers[i].corners.points; + + x = Infinity; + y = Infinity; + + for (j = 0; j !== corners.length; ++j) { + corner = corners[j]; + + x = Math.min(x, corner.x); + y = Math.min(y, corner.y); + } + + context.strokeText(`${markers[i].id}`, x, y); + } +}; + +window.onload = onLoad; diff --git a/vendor/ts-aruco/samples/src/vite-env.d.ts b/vendor/ts-aruco/samples/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/vendor/ts-aruco/samples/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/vendor/ts-aruco/samples/tsconfig.json b/vendor/ts-aruco/samples/tsconfig.json new file mode 100644 index 0000000..75abdef --- /dev/null +++ b/vendor/ts-aruco/samples/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/vendor/ts-aruco/samples/vite.config.js b/vendor/ts-aruco/samples/vite.config.js new file mode 100644 index 0000000..4c4a122 --- /dev/null +++ b/vendor/ts-aruco/samples/vite.config.js @@ -0,0 +1,16 @@ +import { resolve } from "path"; +import { defineConfig } from "vite"; + +export default defineConfig({ + base: "https://axeljaeger.github.io/ts-aruco/", + build: { + rollupOptions: { + input: { + index: resolve(__dirname, "index.html"), + getusermedia: resolve(__dirname, "getusermedia.html"), + debug: resolve(__dirname, "debug.html"), + debugPosit: resolve(__dirname, "debug-posit.html"), + }, + }, + }, +}); diff --git a/vendor/ts-aruco/src/aruco.ts b/vendor/ts-aruco/src/aruco.ts new file mode 100644 index 0000000..0f1ac81 --- /dev/null +++ b/vendor/ts-aruco/src/aruco.ts @@ -0,0 +1,284 @@ +/* +Copyright (c) 2011 Juan Mellado + +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. +*/ + +/* +References: +- "ArUco: a minimal library for Augmented Reality applications based on OpenCv" + http://www.uco.es/investiga/grupos/ava/node/26 +*/ + +import { type CVContour, adaptiveThreshold, approxPolyDP, countNonZero, findContours, grayscale, isContourConvex, minEdgeLength, otsu, perimeter, threshold, warp } from './cv'; + +export interface Marker { + id: number + corners: CVContour +} + +export class Detector { + binary: number[] = []; + contours: CVContour[] = []; + polys: CVContour[] = []; + candidates: CVContour[] = []; + grey: ImageData | null = null; + thres: ImageData | null = null; + + detect (image: ImageData): Marker[] { + this.grey = grayscale(image); + this.thres = adaptiveThreshold(this.grey, 2, 7); + + this.contours = findContours(this.thres, this.binary); + + this.candidates = this.findCandidates(this.contours, image.width * 0.20, 0.05, 10); + this.candidates = this.clockwiseCorners(this.candidates); + this.candidates = this.notTooNear(this.candidates, 10); + + return this.findMarkers(this.grey, this.candidates, 49); + } + + findCandidates (contours: CVContour[], minSize: number, epsilon: number, minLength: number): CVContour[] { + const candidates: CVContour[] = []; + + const len = contours.length; + let contour; + + this.polys = []; + + for (let i = 0; i < len; ++i) { + contour = contours[i]; + + if (contour.points.length >= minSize) { + const poly = approxPolyDP(contour.points, contour.points.length * epsilon); + + this.polys.push({ + points: poly, + hole: false, + tooNear: false + }); + + if ((poly.length === 4) && (isContourConvex(poly))) { + if (minEdgeLength(poly) >= minLength) { + candidates.push({ + points: poly, + hole: false, + tooNear: false + }); + } + } + } + } + + return candidates; + }; + + clockwiseCorners (candidates: CVContour[]): CVContour[] { + const len = candidates.length; + + for (let i = 0; i < len; ++i) { + const candidatePoints = candidates[i].points; + const dx1 = candidatePoints[1]?.x - candidatePoints[0].x; + const dy1 = candidatePoints[1]?.y - candidatePoints[0].y; + const dx2 = candidatePoints[2]?.x - candidatePoints[0].x; + const dy2 = candidatePoints[2]?.y - candidatePoints[0].y; + + if ((dx1 * dy2 - dy1 * dx2) < 0) { + const swap = candidatePoints[1]; + candidatePoints[1] = candidatePoints[3]; + candidatePoints[3] = swap; + } + } + + return candidates; + }; + + notTooNear (candidates: CVContour[], minDist: number): CVContour[] { + const notTooNear: CVContour[] = []; + const len = candidates.length; + for (let i = 0; i < len; ++i) { + for (let j = i + 1; j < len; ++j) { + let dist = 0; + + for (let k = 0; k < 4; ++k) { + const dx = candidates[i].points[k].x - candidates[j].points[k].x; + const dy = candidates[i].points[k].y - candidates[j].points[k].y; + + dist += dx * dx + dy * dy; + } + + if ((dist / 4) < (minDist * minDist)) { + if (perimeter(candidates[i]) < perimeter(candidates[j])) { + candidates[i].tooNear = true; + } else { + candidates[j].tooNear = true; + } + } + } + } + + for (let i = 0; i < len; ++i) { + if (!candidates[i].tooNear) { + notTooNear.push(candidates[i]); + } + } + + return notTooNear; + }; + + findMarkers (imageSrc: ImageData, candidates: CVContour[], warpSize: number): Marker[] { + const markers: Marker[] = []; + const len = candidates.length; + + for (let i = 0; i < len; ++i) { + const candidate = candidates[i]; + + const warped = warp(imageSrc, candidate, warpSize); + const threshhold = threshold(warped, otsu(warped)); + + const marker = this.getMarker(threshhold, candidate); + if (marker !== null) { + markers.push(marker); + } + } + + return markers; + } + + getMarker (imageSrc: ImageData, candidate: CVContour): Marker | null { + const width = (imageSrc.width / 7) >>> 0; + const minZero = (width * width) >> 1; + const bits: number[][] = []; + const rotations: number[][][] = []; + const distances: number[] = []; + let square; + let inc; + + for (let i = 0; i < 7; ++i) { + inc = (i === 0 || i === 6) ? 1 : 6; + + for (let j = 0; j < 7; j += inc) { + square = { x: j * width, y: i * width, width, height: width }; + if (countNonZero(imageSrc, square) > minZero) { + return null; + } + } + } + + for (let i = 0; i < 5; ++i) { + bits[i] = []; + + for (let j = 0; j < 5; ++j) { + square = { x: (j + 1) * width, y: (i + 1) * width, width, height: width }; + + bits[i][j] = countNonZero(imageSrc, square) > minZero ? 1 : 0; + } + } + + rotations[0] = bits; + distances[0] = this.hammingDistance(rotations[0]); + + const pair = { first: distances[0], second: 0 }; + + for (let i = 1; i < 4; ++i) { + rotations[i] = this.rotate(rotations[i - 1]); + distances[i] = this.hammingDistance(rotations[i]); + + if (distances[i] < pair.first) { + pair.first = distances[i]; + pair.second = i; + } + } + + if (pair.first !== 0) { + return null; + } + + return { + id: this.mat2id(rotations[pair.second]), + corners: this.rotate2(candidate, 4 - pair.second) + }; + }; + + hammingDistance (bits: number[][]): number { + const ids = [[1, 0, 0, 0, 0], [1, 0, 1, 1, 1], [0, 1, 0, 0, 1], [0, 1, 1, 1, 0]]; + let dist = 0; + + for (let i = 0; i < 5; ++i) { + let minSum = Infinity; + + for (let j = 0; j < 4; ++j) { + let sum = 0; + + for (let k = 0; k < 5; ++k) { + sum += bits[i][k] === ids[j][k] ? 0 : 1; + } + + if (sum < minSum) { + minSum = sum; + } + } + + dist += minSum; + } + + return dist; + }; + + mat2id (bits: number[][]): number { + let id = 0; + + for (let i = 0; i < 5; ++i) { + id <<= 1; + id |= bits[i][1]; + id <<= 1; + id |= bits[i][3]; + } + + return id; + } + + rotate (src: number[][]): number[][] { + const dst: number[][] = []; + const len = src.length; + + for (let i = 0; i < len; ++i) { + dst[i] = []; + for (let j = 0; j < src[i].length; ++j) { + dst[i][j] = src[src[i].length - j - 1][i]; + } + } + + return dst; + } + + rotate2 (src: CVContour, rotation: number): CVContour { + const dst: CVContour = { + points: [], + hole: false, + tooNear: false + }; + const len = src.points.length; + + for (let i = 0; i < len; ++i) { + dst.points[i] = src.points[(rotation + i) % len]; + } + return dst; + } +} diff --git a/vendor/ts-aruco/src/cv.ts b/vendor/ts-aruco/src/cv.ts new file mode 100644 index 0000000..0bf726e --- /dev/null +++ b/vendor/ts-aruco/src/cv.ts @@ -0,0 +1,697 @@ +/* +Copyright (c) 2011 Juan Mellado + +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. +*/ + +/* +References: +- "OpenCV: Open Computer Vision Library" + http://sourceforge.net/projects/opencvlibrary/ +- "Stack Blur: Fast But Goodlooking" + http://incubator.quasimondo.com/processing/fast_blur_deluxe.php +*/ + +interface CVSlice { + start_index: number + end_index: number +}; + +export interface CVPoint { + x: number + y: number +}; + +export interface CVContour { + points: CVPoint[] + hole: boolean + tooNear: boolean +} + +export const grayscale = (imageSrc: ImageData): ImageData => { + const imageDst = new ImageData(imageSrc.width, imageSrc.height); + + const src = imageSrc.data; + const dst = imageDst.data; + const len = src.length; + let j = 0; + + for (let i = 0; i < len; i += 4) { + dst[j++] = + (src[i] * 0.299 + src[i + 1] * 0.587 + src[i + 2] * 0.114 + 0.5) & 0xff; + } + + return imageDst; +}; + +export const threshold = (imageSrc: ImageData, threshold: number): ImageData => { + const src = imageSrc.data; + const imageDst = new ImageData(imageSrc.width, imageSrc.height); + + const dst = imageDst.data; + const len = src.length; + const tab: number[] = []; + + for (let i = 0; i < 256; ++i) { + tab[i] = i <= threshold ? 0 : 255; + } + + for (let i = 0; i < len; ++i) { + dst[i] = tab[src[i]]; + } + + return imageDst; +}; + +export const adaptiveThreshold = (imageSrc: ImageData, kernelSize: number, threshold: number): ImageData => { + const src = imageSrc.data; + const imageDst = new ImageData(imageSrc.width, imageSrc.height); + + const dst = imageDst.data; + const len = src.length; + const tab: number[] = []; + + stackBoxBlur(imageSrc, imageDst, kernelSize); + + for (let i = 0; i < 768; ++i) { + tab[i] = (i - 255 <= -threshold) ? 255 : 0; + } + + for (let i = 0; i < len; ++i) { + dst[i] = tab[src[i] - dst[i] + 255]; + } + + return imageDst; +}; + +export const otsu = (imageSrc: ImageData): number => { + const src = imageSrc.data; + const len = src.length; + const hist: number[] = []; + let threshold = 0; + let sum = 0; + let sumB = 0; + let wB = 0; + let wF = 0; + let max = 0; + + for (let i = 0; i < 256; ++i) { + hist[i] = 0; + } + + for (let i = 0; i < len; ++i) { + hist[src[i]]++; + } + + for (let i = 0; i < 256; ++i) { + sum += hist[i] * i; + } + + for (let i = 0; i < 256; ++i) { + wB += hist[i]; + if (wB !== 0) { + wF = len - wB; + if (wF === 0) { + break; + } + + sumB += hist[i] * i; + + const mu = (sumB / wB) - ((sum - sumB) / wF); + const between = wB * wF * mu * mu; + + if (between > max) { + max = between; + threshold = i; + } + } + } + + return threshold; +}; + +const stackBoxBlurMult = + [1, 171, 205, 293, 57, 373, 79, 137, 241, 27, 391, 357, 41, 19, 283, 265]; + +const stackBoxBlurShift = + [0, 9, 10, 11, 9, 12, 10, 11, 12, 9, 13, 13, 10, 9, 13, 13]; + +class BlurStack { + color: number = 0; + next: BlurStack | null = null; +}; + +export const stackBoxBlur = (imageSrc: ImageData, imageDst: ImageData, kernelSize: number): ImageData => { + const src = imageSrc.data; + const dst = imageDst.data; + const height = imageSrc.height; + const width = imageSrc.width; + const heightMinus1 = height - 1; + const widthMinus1 = width - 1; + const size = kernelSize + kernelSize + 1; + const radius = kernelSize + 1; + const mult = stackBoxBlurMult[kernelSize]; + const shift = stackBoxBlurShift[kernelSize]; + let stack: BlurStack | null; + let stackStart: BlurStack | null; + let color: number; + let sum: number; + let pos: number; + let start: number; + let p: number; + + stack = stackStart = new BlurStack(); + for (let i = 1; i < size; ++i) { + stack = stack.next = new BlurStack(); + } + stack.next = stackStart; + + pos = 0; + + for (let y = 0; y < height; ++y) { + start = pos; + + color = src[pos]; + sum = radius * color; + + stack = stackStart; + for (let i = 0; i < radius; ++i) { + stack!.color = color; + stack = stack!.next; + } + for (let i = 1; i < radius; ++i) { + stack!.color = src[pos + i]; + sum += stack!.color; + stack = stack!.next; + } + + stack = stackStart; + for (let x = 0; x < width; ++x) { + dst[pos++] = (sum * mult) >>> shift; + + p = x + radius; + p = start + (p < widthMinus1 ? p : widthMinus1); + sum -= stack!.color - src[p]; + + stack!.color = src[p]; + stack = stack!.next; + } + } + + for (let x = 0; x < width; ++x) { + pos = x; + start = pos + width; + + color = dst[pos]; + sum = radius * color; + + stack = stackStart; + for (let i = 0; i < radius; ++i) { + stack!.color = color; + stack = stack!.next; + } + for (let i = 1; i < radius; ++i) { + stack!.color = dst[start]; + sum += stack!.color; + stack = stack!.next; + + start += width; + } + + stack = stackStart; + for (let y = 0; y < height; ++y) { + dst[pos] = (sum * mult) >>> shift; + + p = y + radius; + p = x + ((p < heightMinus1 ? p : heightMinus1) * width); + sum -= stack!.color - dst[p]; + + stack!.color = dst[p]; + stack = stack!.next; + + pos += width; + } + } + + return imageDst; +}; + +export const findContours = (imageSrc: ImageData, binary: number[]): CVContour[] => { + const width = imageSrc.width; + const height = imageSrc.height; + const contours: CVContour[] = []; + let pix: number; + + const src = binaryBorder(imageSrc, binary); + + const deltas = neighborhoodDeltas(width + 2); + + let pos = width + 3; + let nbd = 1; + + for (let i = 0; i < height; ++i, pos += 2) { + for (let j = 0; j < width; ++j, ++pos) { + pix = src[pos]; + + if (pix !== 0) { + let outer: boolean; + let hole: boolean; + + outer = hole = false; + + if (pix === 1 && src[pos - 1] === 0) { + outer = true; + } else if (pix >= 1 && src[pos + 1] === 0) { + hole = true; + } + + if (outer || hole) { + ++nbd; + + contours.push(borderFollowing(src, pos, nbd, { x: j, y: i }, hole, deltas)); + } + } + } + } + + return contours; +}; + +const borderFollowing = (src: number[], pos: number, nbd: number, point: CVPoint, hole: boolean, deltas: number[]): CVContour => { + const contour: CVContour = { + hole: false, + points: [], + tooNear: false + }; + let pos1: number; + let pos3: number; + let pos4: number; + let s: number; + let s_end: number; + + contour.hole = hole; + + s = s_end = hole ? 0 : 4; + do { + s = (s - 1) & 7; + pos1 = pos + deltas[s]; + if (src[pos1] !== 0) { + break; + } + } while (s !== s_end); + + if (s === s_end) { + src[pos] = -nbd; + contour.points.push({ x: point.x, y: point.y }); + } else { + pos3 = pos; + + while (true) { + s_end = s; + + do { + pos4 = pos3 + deltas[++s]; + } while (src[pos4] === 0); + + s &= 7; + + if (((s - 1) >>> 0) < (s_end >>> 0)) { + src[pos3] = -nbd; + } else if (src[pos3] === 1) { + src[pos3] = nbd; + } + + contour.points.push({ x: point.x, y: point.y }); + + point.x += neighborhood[s][0]; + point.y += neighborhood[s][1]; + + if ((pos4 === pos) && (pos3 === pos1)) { + break; + } + + pos3 = pos4; + s = (s + 4) & 7; + } + } + + return contour; +}; + +const neighborhood = + [[1, 0], [1, -1], [0, -1], [-1, -1], [-1, 0], [-1, 1], [0, 1], [1, 1]]; + +const neighborhoodDeltas = (width: number): number[] => { + const deltas: number[] = []; + const len = neighborhood.length; + + for (let i = 0; i < len; ++i) { + deltas[i] = neighborhood[i][0] + (neighborhood[i][1] * width); + } + + return deltas.concat(deltas); +}; + +export const approxPolyDP = (contour: CVPoint[], epsilon: number): CVPoint[] => { + let slice: CVSlice = { start_index: 0, end_index: 0 }; + const right_slice: CVSlice = { start_index: 0, end_index: 0 }; + const poly: CVPoint[] = []; + const stack: CVSlice[] = []; + const len = contour.length; + let start_pt: CVPoint; + let end_pt: CVPoint; + let dist: number; let max_dist: number; let le_eps: boolean; + + let dx: number; + let dy: number; let k: number; + + epsilon *= epsilon; + + k = 0; + + for (let i = 0; i < 3; ++i) { + max_dist = 0; + + k = (k + right_slice.start_index) % len; + start_pt = contour[k]; + if (++k === len) { k = 0; } + + for (let j = 1; j < len; ++j) { + const pt = contour[k]; + if (++k === len) { k = 0; } + + dx = pt.x - start_pt.x; + dy = pt.y - start_pt.y; + dist = dx * dx + dy * dy; + + if (dist > max_dist) { + max_dist = dist; + right_slice.start_index = j; + } + } + } + + if (max_dist! <= epsilon) { + poly.push({ x: start_pt!.x, y: start_pt!.y }); + } else { + slice.start_index = k; + slice.end_index = (right_slice.start_index += slice.start_index); + + right_slice.start_index -= right_slice.start_index >= len ? len : 0; + right_slice.end_index = slice.start_index; + if (right_slice.end_index < right_slice.start_index) { + right_slice.end_index += len; + } + + stack.push({ start_index: right_slice.start_index, end_index: right_slice.end_index }); + stack.push({ start_index: slice.start_index, end_index: slice.end_index }); + } + + while (stack.length !== 0) { + slice = stack.pop()!; + + end_pt = contour[slice.end_index % len]; + start_pt = contour[k = slice.start_index % len]; + if (++k === len) { k = 0; } + + if (slice.end_index <= slice.start_index + 1) { + le_eps = true; + } else { + max_dist = 0; + + dx = end_pt.x - start_pt.x; + dy = end_pt.y - start_pt.y; + + for (let i = slice.start_index + 1; i < slice.end_index; ++i) { + const pt = contour[k]; + if (++k === len) { k = 0; } + + dist = Math.abs((pt.y - start_pt.y) * dx - (pt.x - start_pt.x) * dy); + + if (dist > max_dist) { + max_dist = dist; + right_slice.start_index = i; + } + } + + le_eps = max_dist * max_dist <= epsilon * (dx * dx + dy * dy); + } + + if (le_eps) { + poly.push({ x: start_pt.x, y: start_pt.y }); + } else { + right_slice.end_index = slice.end_index; + slice.end_index = right_slice.start_index; + + stack.push({ start_index: right_slice.start_index, end_index: right_slice.end_index }); + stack.push({ start_index: slice.start_index, end_index: slice.end_index }); + } + } + + return poly; +}; + +export const warp = (imageSrc: ImageData, contour: CVContour, warpSize: number): ImageData => { + const imageDst = new ImageData(warpSize, warpSize); + const src = imageSrc.data; const dst = imageDst.data; + const width = imageSrc.width; const height = imageSrc.height; + + let pos = 0; + let p1: number; let p2: number; let p3: number; let p4: number; + let r: number; let s: number; let t: number; let u: number; let v: number; let w: number; + + const m = getPerspectiveTransform(contour, warpSize - 1); + + r = m[8]; + s = m[2]; + t = m[5]; + + for (let i = 0; i < warpSize; ++i) { + r += m[7]; + s += m[1]; + t += m[4]; + + u = r; + v = s; + w = t; + + for (let j = 0; j < warpSize; ++j) { + u += m[6]; + v += m[0]; + w += m[3]; + + const x = v / u; + const y = w / u; + + const sx1 = x >>> 0; + const sx2 = (sx1 === width - 1) ? sx1 : sx1 + 1; + const dx1 = x - sx1; + const dx2 = 1.0 - dx1; + + const sy1 = y >>> 0; + const sy2 = (sy1 === height - 1) ? sy1 : sy1 + 1; + const dy1 = y - sy1; + const dy2 = 1.0 - dy1; + + p1 = p2 = sy1 * width; + p3 = p4 = sy2 * width; + + dst[pos++] = + (dy2 * (dx2 * src[p1 + sx1] + dx1 * src[p2 + sx2]) + + dy1 * (dx2 * src[p3 + sx1] + dx1 * src[p4 + sx2])) & 0xff; + } + } + + return imageDst; +}; + +const getPerspectiveTransform = (src: CVContour, size: number): number[] => { + const rq = square2quad(src); + + rq[0] /= size; + rq[1] /= size; + rq[3] /= size; + rq[4] /= size; + rq[6] /= size; + rq[7] /= size; + + return rq; +}; + +const square2quad = (srcC: CVContour): number[] => { + const sq: number[] = []; + const src = srcC.points; + + const px = src[0].x - src[1].x + src[2].x - src[3].x; + const py = src[0].y - src[1].y + src[2].y - src[3].y; + + if (px === 0 && py === 0) { + sq[0] = src[1].x - src[0].x; + sq[1] = src[2].x - src[1].x; + sq[2] = src[0].x; + sq[3] = src[1].y - src[0].y; + sq[4] = src[2].y - src[1].y; + sq[5] = src[0].y; + sq[6] = 0; + sq[7] = 0; + sq[8] = 1; + } else { + const dx1 = src[1].x - src[2].x; + const dx2 = src[3].x - src[2].x; + const dy1 = src[1].y - src[2].y; + const dy2 = src[3].y - src[2].y; + const den = dx1 * dy2 - dx2 * dy1; + + sq[6] = (px * dy2 - dx2 * py) / den; + sq[7] = (dx1 * py - px * dy1) / den; + sq[8] = 1; + sq[0] = src[1].x - src[0].x + sq[6] * src[1].x; + sq[1] = src[3].x - src[0].x + sq[7] * src[3].x; + sq[2] = src[0].x; + sq[3] = src[1].y - src[0].y + sq[6] * src[1].y; + sq[4] = src[3].y - src[0].y + sq[7] * src[3].y; + sq[5] = src[0].y; + } + + return sq; +}; + +export const isContourConvex = (contour: CVPoint[]): boolean => { + let orientation = 0; let convex = true; + const len = contour.length; + let j = 0; + let cur_pt: CVPoint; + let prev_pt: CVPoint; + let dx0: number; + let dy0: number; + + prev_pt = contour[len - 1]; + cur_pt = contour[0]; + + dx0 = cur_pt.x - prev_pt.x; + dy0 = cur_pt.y - prev_pt.y; + + for (let i = 0; i < len; ++i) { + if (++j === len) { j = 0; } + + prev_pt = cur_pt; + cur_pt = contour[j]; + + const dx = cur_pt.x - prev_pt.x; + const dy = cur_pt.y - prev_pt.y; + const dxdy0 = dx * dy0; + const dydx0 = dy * dx0; + + orientation |= dydx0 > dxdy0 ? 1 : (dydx0 < dxdy0 ? 2 : 3); + + if (orientation === 3) { + convex = false; + break; + } + + dx0 = dx; + dy0 = dy; + } + + return convex; +}; + +export const perimeter = (poly: CVContour): number => { + const len = poly.points.length; + let j = len - 1; + let p = 0.0; + + for (let i = 0; i < len; j = i++) { + const dx = poly.points[i].x - poly.points[j].x; + const dy = poly.points[i].y - poly.points[j].y; + + p += Math.sqrt(dx * dx + dy * dy); + } + + return p; +}; + +export const minEdgeLength = (poly: CVPoint[]): number => { + const len = poly.length; + let j = len - 1; + let min = Infinity; + + for (let i = 0; i < len; j = i++) { + const dx = poly[i].x - poly[j].x; + const dy = poly[i].y - poly[j].y; + + const d = dx * dx + dy * dy; + + if (d < min) { + min = d; + } + } + + return Math.sqrt(min); +}; + +export const countNonZero = (imageSrc: ImageData, square: { height: any, width: any, x: number, y: number }): number => { + const src = imageSrc.data; + const height = square.height; + const width = square.width; + const span = imageSrc.width - width; + let pos = square.x + (square.y * imageSrc.width); + let nz = 0; + + for (let i = 0; i < height; ++i) { + for (let j = 0; j < width; ++j) { + if (src[pos++] !== 0) { + ++nz; + } + } + + pos += span; + } + + return nz; +}; + +const binaryBorder = (imageSrc: ImageData, dst: number[]): number[] => { + const src = imageSrc.data; + const height = imageSrc.height; + const width = imageSrc.width; + + let posSrc = 0; + let posDst = 0; + + for (let j = -2; j < width; ++j) { + dst[posDst++] = 0; + } + + for (let i = 0; i < height; ++i) { + dst[posDst++] = 0; + + for (let j = 0; j < width; ++j) { + dst[posDst++] = (src[posSrc++] === 0 ? 0 : 1); + } + + dst[posDst++] = 0; + } + + for (let j = -2; j < width; ++j) { + dst[posDst++] = 0; + } + + return dst; +}; diff --git a/vendor/ts-aruco/src/posit1.ts b/vendor/ts-aruco/src/posit1.ts new file mode 100644 index 0000000..82cb349 --- /dev/null +++ b/vendor/ts-aruco/src/posit1.ts @@ -0,0 +1,516 @@ +/* +Copyright (c) 2012 Juan Mellado + +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. +*/ + +import { type CVPoint } from './cv'; +import { svdcmp } from './svd'; + +/* +References: +- "Iterative Pose Estimation using Coplanar Feature Points" + Denis Oberkampf, Daniel F. DeMenthon, Larry S. Davis + http://www.cfar.umd.edu/~daniel/daniel_papersfordownload/CoplanarPts.pdf +*/ + +class Pose { + bestError: any; + bestRotation: any; + bestTranslation: any; + alternativeError: any; + alternativeRotation: any; + alternativeTranslation: any; + + constructor(error1: number, rotation1: number[][], translation1: number[], error2: number, rotation2: number[][], translation2: number[]) { + this.bestError = error1; + this.bestRotation = rotation1; + this.bestTranslation = translation1; + this.alternativeError = error2; + this.alternativeRotation = rotation2; + this.alternativeTranslation = translation2; + } +} + +export class Posit { + objectPoints: number[][]; + focalLength: number; + objectVectors: number[][]; + objectNormal: number[]; + objectMatrix: number[][]; + + constructor(modelSize: number, focalLength: number) { + this.objectPoints = this.buildModel(modelSize); + this.focalLength = focalLength; + + this.objectVectors = []; + this.objectNormal = []; + this.objectMatrix = [[], [], []]; + + this.init(); + }; + + buildModel(modelSize: number): number[][] { + const half = modelSize / 2.0; + + return [ + [-half, half, 0.0], + [half, half, 0.0], + [half, -half, 0.0], + [-half, -half, 0.0]]; + } + + init(): void { + const np = this.objectPoints.length; + const vectors: number[][] = []; const n: any[] = []; let len = 0.0; let row = 2; + + for (let i = 0; i < np; ++i) { + this.objectVectors[i] = [this.objectPoints[i][0] - this.objectPoints[0][0], + this.objectPoints[i][1] - this.objectPoints[0][1], + this.objectPoints[i][2] - this.objectPoints[0][2]]; + + vectors[i] = [this.objectVectors[i][0], + this.objectVectors[i][1], + this.objectVectors[i][2]]; + } + + while (len === 0.0) { + n[0] = this.objectVectors[1][1] * this.objectVectors[row][2] - + this.objectVectors[1][2] * this.objectVectors[row][1]; + n[1] = this.objectVectors[1][2] * this.objectVectors[row][0] - + this.objectVectors[1][0] * this.objectVectors[row][2]; + n[2] = this.objectVectors[1][0] * this.objectVectors[row][1] - + this.objectVectors[1][1] * this.objectVectors[row][0]; + + len = Math.sqrt(n[0] * n[0] + n[1] * n[1] + n[2] * n[2]); + + ++row; + } + + for (let i = 0; i < 3; ++i) { + this.objectNormal[i] = n[i] / len; + } + + this.pseudoInverse(vectors, np, this.objectMatrix); + } + + pose(imagePoints: CVPoint[]): Pose { + const posRotation1 = [[], [], []]; const posRotation2 = [[], [], []]; + const posTranslation: number[] = []; + const rotation1 = [[], [], []]; const rotation2 = [[], [], []]; + const translation1: number[] = []; + const translation2: number[] = []; + let error1; let error2; let i; let j; + + this.pos(imagePoints, posRotation1, posRotation2, posTranslation); + + const valid1 = this.isValid(posRotation1, posTranslation); + if (valid1) { + error1 = this.iterate(imagePoints, posRotation1, posTranslation, rotation1, translation1); + } else { + error1 = { euclidean: -1.0, pixels: -1, maximum: -1.0 }; + } + + const valid2 = this.isValid(posRotation2, posTranslation); + if (valid2) { + error2 = this.iterate(imagePoints, posRotation2, posTranslation, rotation2, translation2); + } else { + error2 = { euclidean: -1.0, pixels: -1, maximum: -1.0 }; + } + + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + if (valid1) { + translation1[i] -= rotation1[i][j] * this.objectPoints[0][j]; + } + if (valid2) { + translation2[i] -= rotation2[i][j] * this.objectPoints[0][j]; + } + } + } + + return error1.euclidean < error2.euclidean + ? new Pose(error1.pixels, rotation1, translation1, error2.pixels, rotation2, translation2) + : new Pose(error2.pixels, rotation2, translation2, error1.pixels, rotation1, translation1); + }; + + pos(imagePoints: CVPoint[], rotation1: number[][], rotation2: number[][], translation: number[]): void { + const np = this.objectPoints.length; const imageVectors: any[] = []; + const i0: number[] = []; const j0: number[] = []; const ivec: number[] = []; const jvec: number[] = []; const row1: number[] = []; const row2: number[] = []; const row3: number[] = []; + let i0i0; let j0j0; let i0j0; let delta; let q; let lambda; let mu; let scale; let i; let j; + + for (i = 0; i < np; ++i) { + imageVectors[i] = [imagePoints[i].x - imagePoints[0].x, + imagePoints[i].y - imagePoints[0].y]; + } + + // i0 and j0 + for (i = 0; i < 3; ++i) { + i0[i] = 0.0; + j0[i] = 0.0; + for (j = 0; j < np; ++j) { + i0[i] += this.objectMatrix[i][j] * imageVectors[j][0]; + j0[i] += this.objectMatrix[i][j] * imageVectors[j][1]; + } + } + + i0i0 = i0[0] * i0[0] + i0[1] * i0[1] + i0[2] * i0[2]; + j0j0 = j0[0] * j0[0] + j0[1] * j0[1] + j0[2] * j0[2]; + i0j0 = i0[0] * j0[0] + i0[1] * j0[1] + i0[2] * j0[2]; + + // Lambda and mu + delta = (j0j0 - i0i0) * (j0j0 - i0i0) + 4.0 * (i0j0 * i0j0); + + if (j0j0 - i0i0 >= 0.0) { + q = (j0j0 - i0i0 + Math.sqrt(delta)) / 2.0; + } else { + q = (j0j0 - i0i0 - Math.sqrt(delta)) / 2.0; + } + + if (q >= 0.0) { + lambda = Math.sqrt(q); + if (lambda === 0.0) { + mu = 0.0; + } else { + mu = -i0j0 / lambda; + } + } else { + lambda = Math.sqrt(-(i0j0 * i0j0) / q); + if (lambda === 0.0) { + mu = Math.sqrt(i0i0 - j0j0); + } else { + mu = -i0j0 / lambda; + } + } + + // First rotation + for (i = 0; i < 3; ++i) { + ivec[i] = i0[i] + lambda * this.objectNormal[i]; + jvec[i] = j0[i] + mu * this.objectNormal[i]; + } + + scale = Math.sqrt(ivec[0] * ivec[0] + ivec[1] * ivec[1] + ivec[2] * ivec[2]); + + for (i = 0; i < 3; ++i) { + row1[i] = ivec[i] / scale; + row2[i] = jvec[i] / scale; + } + + row3[0] = row1[1] * row2[2] - row1[2] * row2[1]; + row3[1] = row1[2] * row2[0] - row1[0] * row2[2]; + row3[2] = row1[0] * row2[1] - row1[1] * row2[0]; + + for (i = 0; i < 3; ++i) { + rotation1[0][i] = row1[i]; + rotation1[1][i] = row2[i]; + rotation1[2][i] = row3[i]; + } + + // Second rotation + for (i = 0; i < 3; ++i) { + ivec[i] = i0[i] - lambda * this.objectNormal[i]; + jvec[i] = j0[i] - mu * this.objectNormal[i]; + } + + for (i = 0; i < 3; ++i) { + row1[i] = ivec[i] / scale; + row2[i] = jvec[i] / scale; + } + + row3[0] = row1[1] * row2[2] - row1[2] * row2[1]; + row3[1] = row1[2] * row2[0] - row1[0] * row2[2]; + row3[2] = row1[0] * row2[1] - row1[1] * row2[0]; + + for (i = 0; i < 3; ++i) { + rotation2[0][i] = row1[i]; + rotation2[1][i] = row2[i]; + rotation2[2][i] = row3[i]; + } + + // Translation + translation[0] = imagePoints[0].x / scale; + translation[1] = imagePoints[0].y / scale; + translation[2] = this.focalLength / scale; + } + + isValid(rotation: number[][], translation: number[]): boolean { + const np = this.objectPoints.length; let zmin = Infinity; let i = 0; let zi; + + for (; i < np; ++i) { + zi = translation[2] + + (rotation[2][0] * this.objectVectors[i][0] + + rotation[2][1] * this.objectVectors[i][1] + + rotation[2][2] * this.objectVectors[i][2]); + if (zi < zmin) { + zmin = zi; + } + } + + return zmin >= 0.0; + } + + iterate(imagePoints: CVPoint[], posRotation: any[][], posTranslation: any[], rotation: number[][], translation: number[]) { + const np = this.objectPoints.length; + const oldSopImagePoints: CVPoint[] = []; const sopImagePoints: CVPoint[] = []; + const rotation1 = [[], [], []]; const rotation2 = [[], [], []]; + const translation1: number[] = []; const translation2: number[] = []; + let converged = false; let iteration = 0; + let oldImageDifference; let imageDifference; let factor; + let error; let error1; let error2; let delta; let i; let j; + + for (i = 0; i < np; ++i) { + oldSopImagePoints[i] = { + x: imagePoints[i].x, + y: imagePoints[i].y + }; + } + + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + rotation[i][j] = posRotation[i][j]; + } + translation[i] = posTranslation[i]; + } + + for (i = 0; i < np; ++i) { + factor = 0.0; + for (j = 0; j < 3; ++j) { + factor += this.objectVectors[i][j] * rotation[2][j] / translation[2]; + } + sopImagePoints[i] = { + x: (1.0 + factor) * imagePoints[i].x, + y: (1.0 + factor) * imagePoints[i].y + }; + } + + imageDifference = 0.0; + + for (i = 0; i < np; ++i) { + imageDifference += Math.abs(sopImagePoints[i].x - oldSopImagePoints[i].x); + imageDifference += Math.abs(sopImagePoints[i].y - oldSopImagePoints[i].y); + } + + for (i = 0; i < 3; ++i) { + translation1[i] = translation[i] - + (rotation[i][0] * this.objectPoints[0][0] + + rotation[i][1] * this.objectPoints[0][1] + + rotation[i][2] * this.objectPoints[0][2]); + } + + error = error1 = this.error(imagePoints, rotation, translation1); + + // Convergence + converged = (error1.pixels === 0.0) || (imageDifference < 0.01); + + while (iteration++ < 100 && !converged) { + for (i = 0; i < np; ++i) { + oldSopImagePoints[i].x = sopImagePoints[i].x; + oldSopImagePoints[i].y = sopImagePoints[i].y; + } + + this.pos(sopImagePoints, rotation1, rotation2, translation); + + for (i = 0; i < 3; ++i) { + translation1[i] = translation[i] - + (rotation1[i][0] * this.objectPoints[0][0] + + rotation1[i][1] * this.objectPoints[0][1] + + rotation1[i][2] * this.objectPoints[0][2]); + + translation2[i] = translation[i] - + (rotation2[i][0] * this.objectPoints[0][0] + + rotation2[i][1] * this.objectPoints[0][1] + + rotation2[i][2] * this.objectPoints[0][2]); + } + + error1 = this.error(imagePoints, rotation1, translation1); + error2 = this.error(imagePoints, rotation2, translation2); + + if ((error1.euclidean >= 0.0) && (error2.euclidean >= 0.0)) { + if (error2.euclidean < error1.euclidean) { + error = error2; + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + rotation[i][j] = rotation2[i][j]; + } + } + } else { + error = error1; + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + rotation[i][j] = rotation1[i][j]; + } + } + } + } + + if ((error1.euclidean < 0.0) && (error2.euclidean >= 0.0)) { + error = error2; + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + rotation[i][j] = rotation2[i][j]; + } + } + } + + if ((error2.euclidean < 0.0) && (error1.euclidean >= 0.0)) { + error = error1; + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + rotation[i][j] = rotation1[i][j]; + } + } + } + + for (i = 0; i < np; ++i) { + factor = 0.0; + for (j = 0; j < 3; ++j) { + factor += this.objectVectors[i][j] * rotation[2][j] / translation[2]; + } + sopImagePoints[i].x = (1.0 + factor) * imagePoints[i].x; + sopImagePoints[i].y = (1.0 + factor) * imagePoints[i].y; + } + + oldImageDifference = imageDifference; + imageDifference = 0.0; + + for (i = 0; i < np; ++i) { + imageDifference += Math.abs(sopImagePoints[i].x - oldSopImagePoints[i].x); + imageDifference += Math.abs(sopImagePoints[i].y - oldSopImagePoints[i].y); + } + + delta = Math.abs(imageDifference - oldImageDifference); + + converged = (error.pixels === 0.0) || (delta < 0.01); + } + + return error; + } + + error(imagePoints: CVPoint[], rotation: number[][], translation: number[]) { + const np = this.objectPoints.length; + const move: number[][] = []; const projection: number[][] = []; const errorvec: number[][] = []; + let euclidean = 0.0; let pixels = 0.0; let maximum = 0.0; + let i; let j; let k; + + if (!this.isValid(rotation, translation)) { + return { euclidean: -1.0, pixels: -1, maximum: -1.0 }; + } + + for (i = 0; i < np; ++i) { + move[i] = []; + for (j = 0; j < 3; ++j) { + move[i][j] = translation[j]; + } + } + + for (i = 0; i < np; ++i) { + for (j = 0; j < 3; ++j) { + for (k = 0; k < 3; ++k) { + move[i][j] += rotation[j][k] * this.objectPoints[i][k]; + } + } + } + + for (i = 0; i < np; ++i) { + projection[i] = []; + for (j = 0; j < 2; ++j) { + projection[i][j] = this.focalLength * move[i][j] / move[i][2]; + } + } + + for (i = 0; i < np; ++i) { + errorvec[i] = [projection[i][0] - imagePoints[i].x, + projection[i][1] - imagePoints[i].y]; + } + + for (i = 0; i < np; ++i) { + euclidean += Math.sqrt(errorvec[i][0] * errorvec[i][0] + + errorvec[i][1] * errorvec[i][1]); + + pixels += Math.abs(Math.round(projection[i][0]) - Math.round(imagePoints[i].x)) + + Math.abs(Math.round(projection[i][1]) - Math.round(imagePoints[i].y)); + + if (Math.abs(errorvec[i][0]) > maximum) { + maximum = Math.abs(errorvec[i][0]); + } + if (Math.abs(errorvec[i][1]) > maximum) { + maximum = Math.abs(errorvec[i][1]); + } + } + + return { euclidean: euclidean / np, pixels, maximum }; + } + + pseudoInverse(a: number[][], n: number, b: number[][]): void { + const w: number[] = []; const v = [[], [], []]; const s: number[][] = [[], [], []]; + let wmax = 0.0; let cn = 0; + let i: number; let j: number; let k: number; + + svdcmp(a, n, 3, w, v); + + for (i = 0; i < 3; ++i) { + if (w[i] > wmax) { + wmax = w[i]; + } + } + + wmax *= 0.01; + + for (i = 0; i < 3; ++i) { + if (w[i] < wmax) { + w[i] = 0.0; + } + } + + for (j = 0; j < 3; ++j) { + if (w[j] === 0.0) { + ++cn; + for (k = j; k < 2; ++k) { + for (i = 0; i < n; ++i) { + a[i][k] = a[i][k + 1]; + } + for (i = 0; i < 3; ++i) { + v[i][k] = v[i][k + 1]; + } + } + } + } + + for (j = 0; j < 2; ++j) { + if (w[j] === 0.0) { + w[j] = w[j + 1]; + } + } + + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3 - cn; ++j) { + s[i][j] = v[i][j] / w[j]; + } + } + + for (i = 0; i < 3; ++i) { + for (j = 0; j < n; ++j) { + b[i][j] = 0.0; + for (k = 0; k < 3 - cn; ++k) { + b[i][j] += s[i][k] * a[j][k]; + } + } + } + } +} diff --git a/vendor/ts-aruco/src/posit2.ts b/vendor/ts-aruco/src/posit2.ts new file mode 100644 index 0000000..b46408f --- /dev/null +++ b/vendor/ts-aruco/src/posit2.ts @@ -0,0 +1,497 @@ +/* +Copyright (c) 2012 Juan Mellado + +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. +*/ + +import { svdcmp } from './svd'; + +/* +References: +- "3D Pose Estimation" + Andrew Kirillow + http://www.aforgenet.com/articles/posit/ +*/ + +var POS = POS || {}; + +POS.Posit = function (modelSize, focalLength) { + this.model = this.buildModel(modelSize); + this.focalLength = focalLength; + + this.init(); +}; + +POS.Posit.prototype.buildModel = function (modelSize) { + const half = modelSize / 2.0; + + return [ + new Vec3(-half, half, 0.0), + new Vec3(half, half, 0.0), + new Vec3(half, -half, 0.0), + new Vec3(-half, -half, 0.0)]; +}; + +POS.Posit.prototype.init = function () { + const d = new Vec3(); const v = new Mat3(); let u; + + this.modelVectors = Mat3.fromRows( + Vec3.sub(this.model[1], this.model[0]), + Vec3.sub(this.model[2], this.model[0]), + Vec3.sub(this.model[3], this.model[0])); + + u = Mat3.clone(this.modelVectors); + + svdcmp(u.m, 3, 3, d.v, v.m); + + this.modelPseudoInverse = Mat3.mult( + Mat3.mult(v, Mat3.fromDiagonal(Vec3.inverse(d))), Mat3.transpose(u)); + + this.modelNormal = v.column(d.minIndex()); +}; + +POS.Posit.prototype.pose = function (points) { + const eps = new Vec3(1.0, 1.0, 1.0); + const rotation1 = new Mat3(); const rotation2 = new Mat3(); + const translation1 = new Vec3(); const translation2 = new Vec3(); + let error1; let error2; + + this.pos(points, eps, rotation1, rotation2, translation1, translation2); + + error1 = this.iterate(points, rotation1, translation1); + error2 = this.iterate(points, rotation2, translation2); + + return error1 < error2 + ? new POS.Pose(error1, rotation1.m, translation1.v, error2, rotation2.m, translation2.v) + : new POS.Pose(error2, rotation2.m, translation2.v, error1, rotation1.m, translation1.v); +}; + +POS.Posit.prototype.pos = function (points, eps, rotation1, rotation2, translation1, translation2) { + const xi = new Vec3(points[1].x, points[2].x, points[3].x); + const yi = new Vec3(points[1].y, points[2].y, points[3].y); + const xs = Vec3.addScalar(Vec3.mult(xi, eps), -points[0].x); + const ys = Vec3.addScalar(Vec3.mult(yi, eps), -points[0].y); + const i0 = Mat3.multVector(this.modelPseudoInverse, xs); + const j0 = Mat3.multVector(this.modelPseudoInverse, ys); + const s = j0.square() - i0.square(); + const ij = Vec3.dot(i0, j0); + let r = 0.0; let theta = 0.0; + let i; let j; let k; let inorm; let jnorm; let scale; let temp; let lambda; let mu; + + if (s === 0.0) { + r = Math.sqrt(Math.abs(2.0 * ij)); + theta = (-Math.PI / 2.0) * (ij < 0.0 ? -1 : (ij > 0.0 ? 1.0 : 0.0)); + } else { + r = Math.sqrt(Math.sqrt(s * s + 4.0 * ij * ij)); + theta = Math.atan(-2.0 * ij / s); + if (s < 0.0) { + theta += Math.PI; + } + theta /= 2.0; + } + + lambda = r * Math.cos(theta); + mu = r * Math.sin(theta); + + // First possible rotation/translation + i = Vec3.add(i0, Vec3.multScalar(this.modelNormal, lambda)); + j = Vec3.add(j0, Vec3.multScalar(this.modelNormal, mu)); + inorm = i.normalize(); + jnorm = j.normalize(); + k = Vec3.cross(i, j); + rotation1.copy(Mat3.fromRows(i, j, k)); + + scale = (inorm + jnorm) / 2.0; + temp = Mat3.multVector(rotation1, this.model[0]); + translation1.v = [ + points[0].x / scale - temp.v[0], + points[0].y / scale - temp.v[1], + this.focalLength / scale]; + + // Second possible rotation/translation + i = Vec3.sub(i0, Vec3.multScalar(this.modelNormal, lambda)); + j = Vec3.sub(j0, Vec3.multScalar(this.modelNormal, mu)); + inorm = i.normalize(); + jnorm = j.normalize(); + k = Vec3.cross(i, j); + rotation2.copy(Mat3.fromRows(i, j, k)); + + scale = (inorm + jnorm) / 2.0; + temp = Mat3.multVector(rotation2, this.model[0]); + translation2.v = [ + points[0].x / scale - temp.v[0], + points[0].y / scale - temp.v[1], + this.focalLength / scale]; +}; + +POS.Posit.prototype.iterate = function (points, rotation, translation) { + let prevError = Infinity; + const rotation1 = new Mat3(); const rotation2 = new Mat3(); + const translation1 = new Vec3(); const translation2 = new Vec3(); + let i = 0; let eps; let error; let error1; let error2; + + for (; i < 100; ++i) { + eps = Vec3.addScalar(Vec3.multScalar( + Mat3.multVector(this.modelVectors, rotation.row(2)), 1.0 / translation.v[2]), 1.0); + + this.pos(points, eps, rotation1, rotation2, translation1, translation2); + + error1 = this.getError(points, rotation1, translation1); + error2 = this.getError(points, rotation2, translation2); + + if (error1 < error2) { + rotation.copy(rotation1); + translation.copy(translation1); + error = error1; + } else { + rotation.copy(rotation2); + translation.copy(translation2); + error = error2; + } + + if ((error <= 2.0) || (error > prevError)) { + break; + } + + prevError = error; + } + + return error; +}; + +POS.Posit.prototype.getError = function (points, rotation, translation) { + let v1 = Vec3.add(Mat3.multVector(rotation, this.model[0]), translation); + let v2 = Vec3.add(Mat3.multVector(rotation, this.model[1]), translation); + let v3 = Vec3.add(Mat3.multVector(rotation, this.model[2]), translation); + let v4 = Vec3.add(Mat3.multVector(rotation, this.model[3]), translation); + let modeled; let ia1; let ia2; let ia3; let ia4; let ma1; let ma2; let ma3; let ma4; + + v1 = v1.v; v2 = v2.v; v3 = v3.v; v4 = v4.v; + + v1[0] *= this.focalLength / v1[2]; + v1[1] *= this.focalLength / v1[2]; + v2[0] *= this.focalLength / v2[2]; + v2[1] *= this.focalLength / v2[2]; + v3[0] *= this.focalLength / v3[2]; + v3[1] *= this.focalLength / v3[2]; + v4[0] *= this.focalLength / v4[2]; + v4[1] *= this.focalLength / v4[2]; + + modeled = [ + { x: v1[0], y: v1[1] }, + { x: v2[0], y: v2[1] }, + { x: v3[0], y: v3[1] }, + { x: v4[0], y: v4[1] } + ]; + + ia1 = this.angle(points[0], points[1], points[3]); + ia2 = this.angle(points[1], points[2], points[0]); + ia3 = this.angle(points[2], points[3], points[1]); + ia4 = this.angle(points[3], points[0], points[2]); + + ma1 = this.angle(modeled[0], modeled[1], modeled[3]); + ma2 = this.angle(modeled[1], modeled[2], modeled[0]); + ma3 = this.angle(modeled[2], modeled[3], modeled[1]); + ma4 = this.angle(modeled[3], modeled[0], modeled[2]); + + return (Math.abs(ia1 - ma1) + + Math.abs(ia2 - ma2) + + Math.abs(ia3 - ma3) + + Math.abs(ia4 - ma4)) / 4.0; +}; + +POS.Posit.prototype.angle = function (a, b, c) { + const x1 = b.x - a.x; const y1 = b.y - a.y; + const x2 = c.x - a.x; const y2 = c.y - a.y; + + return Math.acos((x1 * x2 + y1 * y2) / + (Math.sqrt(x1 * x1 + y1 * y1) * Math.sqrt(x2 * x2 + y2 * y2))) * 180.0 / Math.PI; +}; + +POS.Pose = function (error1, rotation1, translation1, error2, rotation2, translation2) { + this.bestError = error1; + this.bestRotation = rotation1; + this.bestTranslation = translation1; + this.alternativeError = error2; + this.alternativeRotation = rotation2; + this.alternativeTranslation = translation2; +}; + +var Vec3 = function (x, y, z) { + this.v = [x || 0.0, y || 0.0, z || 0.0]; +}; + +Vec3.prototype.copy = function (a) { + const v = this.v; + + a = a.v; + + v[0] = a[0]; + v[1] = a[1]; + v[2] = a[2]; + + return this; +}; + +Vec3.add = function (a, b) { + const vector = new Vec3(); const v = vector.v; + + a = a.v; b = b.v; + + v[0] = a[0] + b[0]; + v[1] = a[1] + b[1]; + v[2] = a[2] + b[2]; + + return vector; +}; + +Vec3.sub = function (a, b) { + const vector = new Vec3(); const v = vector.v; + + a = a.v; b = b.v; + + v[0] = a[0] - b[0]; + v[1] = a[1] - b[1]; + v[2] = a[2] - b[2]; + + return vector; +}; + +Vec3.mult = function (a, b) { + const vector = new Vec3(); const v = vector.v; + + a = a.v; b = b.v; + + v[0] = a[0] * b[0]; + v[1] = a[1] * b[1]; + v[2] = a[2] * b[2]; + + return vector; +}; + +Vec3.addScalar = function (a, b) { + const vector = new Vec3(); const v = vector.v; + + a = a.v; + + v[0] = a[0] + b; + v[1] = a[1] + b; + v[2] = a[2] + b; + + return vector; +}; + +Vec3.multScalar = function (a, b) { + const vector = new Vec3(); const v = vector.v; + + a = a.v; + + v[0] = a[0] * b; + v[1] = a[1] * b; + v[2] = a[2] * b; + + return vector; +}; + +Vec3.dot = function (a, b) { + a = a.v; b = b.v; + + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; +}; + +Vec3.cross = function (a, b) { + a = a.v; b = b.v; + + return new Vec3( + a[1] * b[2] - a[2] * b[1], + a[2] * b[0] - a[0] * b[2], + a[0] * b[1] - a[1] * b[0]); +}; + +Vec3.prototype.normalize = function () { + const v = this.v; + const len = Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); + + if (len > 0.0) { + v[0] /= len; + v[1] /= len; + v[2] /= len; + } + + return len; +}; + +Vec3.inverse = function (a) { + const vector = new Vec3(); const v = vector.v; + + a = a.v; + + if (a[0] !== 0.0) { + v[0] = 1.0 / a[0]; + } + if (a[1] !== 0.0) { + v[1] = 1.0 / a[1]; + } + if (a[2] !== 0.0) { + v[2] = 1.0 / a[2]; + } + + return vector; +}; + +Vec3.prototype.square = function () { + const v = this.v; + + return v[0] * v[0] + v[1] * v[1] + v[2] * v[2]; +}; + +Vec3.prototype.minIndex = function () { + const v = this.v; + + return v[0] < v[1] ? (v[0] < v[2] ? 0 : 2) : (v[1] < v[2] ? 1 : 2); +}; + +var Mat3 = function () { + this.m = [[0.0, 0.0, 0.0], + [0.0, 0.0, 0.0], + [0.0, 0.0, 0.0]]; +}; + +Mat3.clone = function (a) { + const matrix = new Mat3(); const m = matrix.m; + + a = a.m; + + m[0][0] = a[0][0]; + m[0][1] = a[0][1]; + m[0][2] = a[0][2]; + m[1][0] = a[1][0]; + m[1][1] = a[1][1]; + m[1][2] = a[1][2]; + m[2][0] = a[2][0]; + m[2][1] = a[2][1]; + m[2][2] = a[2][2]; + + return matrix; +}; + +Mat3.prototype.copy = function (a) { + const m = this.m; + + a = a.m; + + m[0][0] = a[0][0]; + m[0][1] = a[0][1]; + m[0][2] = a[0][2]; + m[1][0] = a[1][0]; + m[1][1] = a[1][1]; + m[1][2] = a[1][2]; + m[2][0] = a[2][0]; + m[2][1] = a[2][1]; + m[2][2] = a[2][2]; + + return this; +}; + +Mat3.fromRows = function (a, b, c) { + const matrix = new Mat3(); const m = matrix.m; + + a = a.v; b = b.v; c = c.v; + + m[0][0] = a[0]; + m[0][1] = a[1]; + m[0][2] = a[2]; + m[1][0] = b[0]; + m[1][1] = b[1]; + m[1][2] = b[2]; + m[2][0] = c[0]; + m[2][1] = c[1]; + m[2][2] = c[2]; + + return matrix; +}; + +Mat3.fromDiagonal = function (a) { + const matrix = new Mat3(); const m = matrix.m; + + a = a.v; + + m[0][0] = a[0]; + m[1][1] = a[1]; + m[2][2] = a[2]; + + return matrix; +}; + +Mat3.transpose = function (a) { + const matrix = new Mat3(); const m = matrix.m; + + a = a.m; + + m[0][0] = a[0][0]; + m[0][1] = a[1][0]; + m[0][2] = a[2][0]; + m[1][0] = a[0][1]; + m[1][1] = a[1][1]; + m[1][2] = a[2][1]; + m[2][0] = a[0][2]; + m[2][1] = a[1][2]; + m[2][2] = a[2][2]; + + return matrix; +}; + +Mat3.mult = function (a, b) { + const matrix = new Mat3(); const m = matrix.m; + + a = a.m; b = b.m; + + m[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0] + a[0][2] * b[2][0]; + m[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1] + a[0][2] * b[2][1]; + m[0][2] = a[0][0] * b[0][2] + a[0][1] * b[1][2] + a[0][2] * b[2][2]; + m[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0] + a[1][2] * b[2][0]; + m[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1] + a[1][2] * b[2][1]; + m[1][2] = a[1][0] * b[0][2] + a[1][1] * b[1][2] + a[1][2] * b[2][2]; + m[2][0] = a[2][0] * b[0][0] + a[2][1] * b[1][0] + a[2][2] * b[2][0]; + m[2][1] = a[2][0] * b[0][1] + a[2][1] * b[1][1] + a[2][2] * b[2][1]; + m[2][2] = a[2][0] * b[0][2] + a[2][1] * b[1][2] + a[2][2] * b[2][2]; + + return matrix; +}; + +Mat3.multVector = function (m, a) { + m = m.m; a = a.v; + + return new Vec3( + m[0][0] * a[0] + m[0][1] * a[1] + m[0][2] * a[2], + m[1][0] * a[0] + m[1][1] * a[1] + m[1][2] * a[2], + m[2][0] * a[0] + m[2][1] * a[1] + m[2][2] * a[2]); +}; + +Mat3.prototype.column = function (index) { + const m = this.m; + + return new Vec3(m[0][index], m[1][index], m[2][index]); +}; + +Mat3.prototype.row = function (index) { + const m = this.m; + + return new Vec3(m[index][0], m[index][1], m[index][2]); +}; diff --git a/vendor/ts-aruco/src/svd.ts b/vendor/ts-aruco/src/svd.ts new file mode 100644 index 0000000..787b9d1 --- /dev/null +++ b/vendor/ts-aruco/src/svd.ts @@ -0,0 +1,283 @@ +/* +Copyright (c) 2012 Juan Mellado + +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. +*/ + +/* +References: +- "Numerical Recipes in C - Second Edition" + http://www.nr.com/ +*/ + +export const svdcmp = (a: number[][], m: number, n: number, w: number[], v: number[][]): boolean => { + let flag; let i: number; let its; let j: number; let jj; let k; let l: number = 0; let nm: number = 0; + let anorm = 0.0; let c; let f; let g = 0.0; let h; let s; let scale = 0.0; let x; let y; let z; const rv1: number[] = []; + + // Householder reduction to bidiagonal form + for (i = 0; i < n; ++i) { + l = i + 1; + rv1[i] = scale * g; + g = s = scale = 0.0; + if (i < m) { + for (k = i; k < m; ++k) { + scale += Math.abs(a[k][i]); + } + if (scale !== 0.0) { + for (k = i; k < m; ++k) { + a[k][i] /= scale; + s += a[k][i] * a[k][i]; + } + f = a[i][i]; + g = -sign(Math.sqrt(s), f); + h = f * g - s; + a[i][i] = f - g; + for (j = l; j < n; ++j) { + for (s = 0.0, k = i; k < m; ++k) { + s += a[k][i] * a[k][j]; + } + f = s / h; + for (k = i; k < m; ++k) { + a[k][j] += f * a[k][i]; + } + } + for (k = i; k < m; ++k) { + a[k][i] *= scale; + } + } + } + w[i] = scale * g; + g = s = scale = 0.0; + if ((i < m) && (i !== n - 1)) { + for (k = l; k < n; ++k) { + scale += Math.abs(a[i][k]); + } + if (scale !== 0.0) { + for (k = l; k < n; ++k) { + a[i][k] /= scale; + s += a[i][k] * a[i][k]; + } + f = a[i][l]; + g = -sign(Math.sqrt(s), f); + h = f * g - s; + a[i][l] = f - g; + for (k = l; k < n; ++k) { + rv1[k] = a[i][k] / h; + } + for (j = l; j < m; ++j) { + for (s = 0.0, k = l; k < n; ++k) { + s += a[j][k] * a[i][k]; + } + for (k = l; k < n; ++k) { + a[j][k] += s * rv1[k]; + } + } + for (k = l; k < n; ++k) { + a[i][k] *= scale; + } + } + } + anorm = Math.max(anorm, (Math.abs(w[i]) + Math.abs(rv1[i]))); + } + + // Acumulation of right-hand transformation + for (i = n - 1; i >= 0; --i) { + if (i < n - 1) { + if (g !== 0.0) { + for (j = l; j < n; ++j) { + v[j][i] = (a[i][j] / a[i][l]) / g; + } + for (j = l; j < n; ++j) { + for (s = 0.0, k = l; k < n; ++k) { + s += a[i][k] * v[k][j]; + } + for (k = l; k < n; ++k) { + v[k][j] += s * v[k][i]; + } + } + } + for (j = l; j < n; ++j) { + v[i][j] = v[j][i] = 0.0; + } + } + v[i][i] = 1.0; + g = rv1[i]; + l = i; + } + + // Acumulation of left-hand transformation + for (i = Math.min(n, m) - 1; i >= 0; --i) { + l = i + 1; + g = w[i]; + for (j = l; j < n; ++j) { + a[i][j] = 0.0; + } + if (g !== 0.0) { + g = 1.0 / g; + for (j = l; j < n; ++j) { + for (s = 0.0, k = l; k < m; ++k) { + s += a[k][i] * a[k][j]; + } + f = (s / a[i][i]) * g; + for (k = i; k < m; ++k) { + a[k][j] += f * a[k][i]; + } + } + for (j = i; j < m; ++j) { + a[j][i] *= g; + } + } else { + for (j = i; j < m; ++j) { + a[j][i] = 0.0; + } + } + ++a[i][i]; + } + + // Diagonalization of the bidiagonal form + for (k = n - 1; k >= 0; --k) { + for (its = 1; its <= 30; ++its) { + flag = true; + for (l = k; l >= 0; --l) { + nm = l - 1; + if (Math.abs(rv1[l]) + anorm === anorm) { + flag = false; + break; + } + if (Math.abs(w[nm]) + anorm === anorm) { + break; + } + } + if (flag) { + c = 0.0; + s = 1.0; + for (i = l; i <= k; ++i) { + f = s * rv1[i]; + if (Math.abs(f) + anorm === anorm) { + break; + } + g = w[i]; + h = pythag(f, g); + w[i] = h; + h = 1.0 / h; + c = g * h; + s = -f * h; + for (j = 1; j <= m; ++j) { + y = a[j][nm]; + z = a[j][i]; + a[j][nm] = y * c + z * s; + a[j][i] = z * c - y * s; + } + } + } + + // Convergence + z = w[k]; + if (l === k) { + if (z < 0.0) { + w[k] = -z; + for (j = 0; j < n; ++j) { + v[j][k] = -v[j][k]; + } + } + break; + } + + if (its === 30) { + return false; + } + + // Shift from bottom 2-by-2 minor + x = w[l]; + nm = k - 1; + y = w[nm]; + g = rv1[nm]; + h = rv1[k]; + f = ((y - z) * (y + z) + (g - h) * (g + h)) / (2.0 * h * y); + g = pythag(f, 1.0); + f = ((x - z) * (x + z) + h * ((y / (f + sign(g, f))) - h)) / x; + + // Next QR transformation + c = s = 1.0; + for (j = l; j <= nm; ++j) { + i = j + 1; + g = rv1[i]; + y = w[i]; + h = s * g; + g = c * g; + z = pythag(f, h); + rv1[j] = z; + c = f / z; + s = h / z; + f = x * c + g * s; + g = g * c - x * s; + h = y * s; + y *= c; + for (jj = 0; jj < n; ++jj) { + x = v[jj][j]; + z = v[jj][i]; + v[jj][j] = x * c + z * s; + v[jj][i] = z * c - x * s; + } + z = pythag(f, h); + w[j] = z; + if (z !== 0.0) { + z = 1.0 / z; + c = f * z; + s = h * z; + } + f = c * g + s * y; + x = c * y - s * g; + for (jj = 0; jj < m; ++jj) { + y = a[jj][j]; + z = a[jj][i]; + a[jj][j] = y * c + z * s; + a[jj][i] = z * c - y * s; + } + } + rv1[l] = 0.0; + rv1[k] = f; + w[k] = x; + } + } + + return true; +}; + +const pythag = (a: number, b: number): number => { + const at = Math.abs(a); + const bt = Math.abs(b); + let ct; + + if (at > bt) { + ct = bt / at; + return at * Math.sqrt(1.0 + ct * ct); + } + + if (bt === 0.0) { + return 0.0; + } + + ct = at / bt; + return bt * Math.sqrt(1.0 + ct * ct); +}; + +const sign = (a: number, b: number): number => { + return b >= 0.0 ? Math.abs(a) : -Math.abs(a); +}; diff --git a/vendor/ts-aruco/tsconfig.json b/vendor/ts-aruco/tsconfig.json new file mode 100644 index 0000000..e075f97 --- /dev/null +++ b/vendor/ts-aruco/tsconfig.json @@ -0,0 +1,109 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +}