From 868900e6d5404bec7942e21cddd7f82dc5e497ec Mon Sep 17 00:00:00 2001 From: Asher Date: Thu, 17 Jul 2025 16:51:19 +0300 Subject: [PATCH] Finished cpp impl and made web version --- web/.gitignore | 24 + web/eslint.config.js | 29 + web/index.html | 15 + web/package-lock.json | 3369 ++++++++++++++++++ web/package.json | 29 + web/public/libs/cardcode.js | 6274 +++++++++++++++++++++++++++++++++ web/public/libs/cardcode.wasm | Bin 0 -> 434005 bytes web/src/App.jsx | 336 ++ web/src/components/Card.jsx | 50 + web/src/index.css | 1 + web/src/main.jsx | 13 + web/vite.config.js | 8 + 12 files changed, 10148 insertions(+) create mode 100644 web/.gitignore create mode 100644 web/eslint.config.js create mode 100644 web/index.html create mode 100644 web/package-lock.json create mode 100644 web/package.json create mode 100644 web/public/libs/cardcode.js create mode 100755 web/public/libs/cardcode.wasm create mode 100644 web/src/App.jsx create mode 100644 web/src/components/Card.jsx create mode 100644 web/src/index.css create mode 100644 web/src/main.jsx create mode 100644 web/vite.config.js diff --git a/web/.gitignore b/web/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/web/.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/web/eslint.config.js b/web/eslint.config.js new file mode 100644 index 0000000..cee1e2c --- /dev/null +++ b/web/eslint.config.js @@ -0,0 +1,29 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{js,jsx}'], + extends: [ + js.configs.recommended, + reactHooks.configs['recommended-latest'], + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + parserOptions: { + ecmaVersion: 'latest', + ecmaFeatures: { jsx: true }, + sourceType: 'module', + }, + }, + rules: { + 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }], + }, + }, +]) diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..368d050 --- /dev/null +++ b/web/index.html @@ -0,0 +1,15 @@ + + + + + + + DeckCrypt 🃏 + + +
+ + + + + diff --git a/web/package-lock.json b/web/package-lock.json new file mode 100644 index 0000000..436e7d3 --- /dev/null +++ b/web/package-lock.json @@ -0,0 +1,3369 @@ +{ + "name": "web", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "web", + "version": "0.0.0", + "dependencies": { + "@tailwindcss/vite": "^4.1.11", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "tailwindcss": "^4.1.11" + }, + "devDependencies": { + "@eslint/js": "^9.30.1", + "@types/react": "^19.1.8", + "@types/react-dom": "^19.1.6", + "@vitejs/plugin-react": "^4.6.0", + "eslint": "^9.30.1", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "globals": "^16.3.0", + "vite": "^7.0.4" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", + "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", + "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.6", + "@babel/parser": "^7.28.0", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", + "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.0", + "@babel/types": "^7.28.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", + "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.0", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.1.tgz", + "integrity": "sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.6.tgz", + "integrity": "sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.6.tgz", + "integrity": "sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.6.tgz", + "integrity": "sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.6.tgz", + "integrity": "sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.6.tgz", + "integrity": "sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.6.tgz", + "integrity": "sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.6.tgz", + "integrity": "sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.6.tgz", + "integrity": "sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.6.tgz", + "integrity": "sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.6.tgz", + "integrity": "sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.6.tgz", + "integrity": "sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.6.tgz", + "integrity": "sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.6.tgz", + "integrity": "sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.6.tgz", + "integrity": "sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.6.tgz", + "integrity": "sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.6.tgz", + "integrity": "sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.6.tgz", + "integrity": "sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.6.tgz", + "integrity": "sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.6.tgz", + "integrity": "sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.6.tgz", + "integrity": "sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.6.tgz", + "integrity": "sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.6.tgz", + "integrity": "sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.6.tgz", + "integrity": "sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.6.tgz", + "integrity": "sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.6.tgz", + "integrity": "sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.6.tgz", + "integrity": "sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/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, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", + "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", + "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.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": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.31.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.31.0.tgz", + "integrity": "sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.3.tgz", + "integrity": "sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.19", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz", + "integrity": "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.1.tgz", + "integrity": "sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.1.tgz", + "integrity": "sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.1.tgz", + "integrity": "sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.1.tgz", + "integrity": "sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.1.tgz", + "integrity": "sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.1.tgz", + "integrity": "sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.1.tgz", + "integrity": "sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.1.tgz", + "integrity": "sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.1.tgz", + "integrity": "sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.1.tgz", + "integrity": "sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.1.tgz", + "integrity": "sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.1.tgz", + "integrity": "sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.1.tgz", + "integrity": "sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.1.tgz", + "integrity": "sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.1.tgz", + "integrity": "sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.1.tgz", + "integrity": "sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.1.tgz", + "integrity": "sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.1.tgz", + "integrity": "sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.1.tgz", + "integrity": "sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.1.tgz", + "integrity": "sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.11.tgz", + "integrity": "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.30.1", + "magic-string": "^0.30.17", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.11" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.11.tgz", + "integrity": "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.11", + "@tailwindcss/oxide-darwin-arm64": "4.1.11", + "@tailwindcss/oxide-darwin-x64": "4.1.11", + "@tailwindcss/oxide-freebsd-x64": "4.1.11", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.11", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.11", + "@tailwindcss/oxide-linux-x64-musl": "4.1.11", + "@tailwindcss/oxide-wasm32-wasi": "4.1.11", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.11" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.11.tgz", + "integrity": "sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.11.tgz", + "integrity": "sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.11.tgz", + "integrity": "sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.11.tgz", + "integrity": "sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.11.tgz", + "integrity": "sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.11.tgz", + "integrity": "sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.11.tgz", + "integrity": "sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.11.tgz", + "integrity": "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.11.tgz", + "integrity": "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.11.tgz", + "integrity": "sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@emnapi/wasi-threads": "^1.0.2", + "@napi-rs/wasm-runtime": "^0.2.11", + "@tybys/wasm-util": "^0.9.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.11.tgz", + "integrity": "sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.11.tgz", + "integrity": "sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.11.tgz", + "integrity": "sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.11", + "@tailwindcss/oxide": "4.1.11", + "tailwindcss": "4.1.11" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz", + "integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.6.tgz", + "integrity": "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.6.0.tgz", + "integrity": "sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.19", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "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, + "license": "Python-2.0" + }, + "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, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001727", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz", + "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "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, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "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, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.186", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.186.tgz", + "integrity": "sha512-lur7L4BFklgepaJxj4DqPk7vKbTEl0pajNlg2QjE5shefmlmBLm2HvQ7PMf1R/GvlevT/581cop33/quQcfX3A==", + "dev": true, + "license": "ISC" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", + "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/esbuild": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.6.tgz", + "integrity": "sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.6", + "@esbuild/android-arm": "0.25.6", + "@esbuild/android-arm64": "0.25.6", + "@esbuild/android-x64": "0.25.6", + "@esbuild/darwin-arm64": "0.25.6", + "@esbuild/darwin-x64": "0.25.6", + "@esbuild/freebsd-arm64": "0.25.6", + "@esbuild/freebsd-x64": "0.25.6", + "@esbuild/linux-arm": "0.25.6", + "@esbuild/linux-arm64": "0.25.6", + "@esbuild/linux-ia32": "0.25.6", + "@esbuild/linux-loong64": "0.25.6", + "@esbuild/linux-mips64el": "0.25.6", + "@esbuild/linux-ppc64": "0.25.6", + "@esbuild/linux-riscv64": "0.25.6", + "@esbuild/linux-s390x": "0.25.6", + "@esbuild/linux-x64": "0.25.6", + "@esbuild/netbsd-arm64": "0.25.6", + "@esbuild/netbsd-x64": "0.25.6", + "@esbuild/openbsd-arm64": "0.25.6", + "@esbuild/openbsd-x64": "0.25.6", + "@esbuild/openharmony-arm64": "0.25.6", + "@esbuild/sunos-x64": "0.25.6", + "@esbuild/win32-arm64": "0.25.6", + "@esbuild/win32-ia32": "0.25.6", + "@esbuild/win32-x64": "0.25.6" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.31.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.31.0.tgz", + "integrity": "sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.0", + "@eslint/core": "^0.15.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.31.0", + "@eslint/plugin-kit": "^0.3.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz", + "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "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, + "license": "BSD-2-Clause", + "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, + "license": "BSD-2-Clause", + "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, + "license": "BSD-2-Clause", + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "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, + "license": "MIT", + "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": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "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, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", + "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "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, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "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, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.45.1.tgz", + "integrity": "sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.45.1", + "@rollup/rollup-android-arm64": "4.45.1", + "@rollup/rollup-darwin-arm64": "4.45.1", + "@rollup/rollup-darwin-x64": "4.45.1", + "@rollup/rollup-freebsd-arm64": "4.45.1", + "@rollup/rollup-freebsd-x64": "4.45.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.45.1", + "@rollup/rollup-linux-arm-musleabihf": "4.45.1", + "@rollup/rollup-linux-arm64-gnu": "4.45.1", + "@rollup/rollup-linux-arm64-musl": "4.45.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.45.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.45.1", + "@rollup/rollup-linux-riscv64-gnu": "4.45.1", + "@rollup/rollup-linux-riscv64-musl": "4.45.1", + "@rollup/rollup-linux-s390x-gnu": "4.45.1", + "@rollup/rollup-linux-x64-gnu": "4.45.1", + "@rollup/rollup-linux-x64-musl": "4.45.1", + "@rollup/rollup-win32-arm64-msvc": "4.45.1", + "@rollup/rollup-win32-ia32-msvc": "4.45.1", + "@rollup/rollup-win32-x64-msvc": "4.45.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "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, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz", + "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "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, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "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, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.5.tgz", + "integrity": "sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.6", + "picomatch": "^4.0.2", + "postcss": "^8.5.6", + "rollup": "^4.40.0", + "tinyglobby": "^0.2.14" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "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, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/web/package.json b/web/package.json new file mode 100644 index 0000000..ea65cdb --- /dev/null +++ b/web/package.json @@ -0,0 +1,29 @@ +{ + "name": "web", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@tailwindcss/vite": "^4.1.11", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "tailwindcss": "^4.1.11" + }, + "devDependencies": { + "@eslint/js": "^9.30.1", + "@types/react": "^19.1.8", + "@types/react-dom": "^19.1.6", + "@vitejs/plugin-react": "^4.6.0", + "eslint": "^9.30.1", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "globals": "^16.3.0", + "vite": "^7.0.4" + } +} diff --git a/web/public/libs/cardcode.js b/web/public/libs/cardcode.js new file mode 100644 index 0000000..2fc532d --- /dev/null +++ b/web/public/libs/cardcode.js @@ -0,0 +1,6274 @@ +// This code implements the `-sMODULARIZE` settings by taking the generated +// JS program code (INNER_JS_CODE) and wrapping it in a factory function. + +// Single threaded MINIMAL_RUNTIME programs do not need access to +// document.currentScript, so a simple export declaration is enough. +var createModule = (() => { + // When MODULARIZE this JS may be executed later, + // after document.currentScript is gone, so we save it. + // In EXPORT_ES6 mode we can just use 'import.meta.url'. + var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined; + return async function(moduleArg = {}) { + var moduleRtn; + +// include: shell.js +// The Module object: Our interface to the outside world. We import +// and export values on it. There are various ways Module can be used: +// 1. Not defined. We create it here +// 2. A function parameter, function(moduleArg) => Promise +// 3. pre-run appended it, var Module = {}; ..generated code.. +// 4. External script tag defines var Module. +// We need to check if Module already exists (e.g. case 3 above). +// Substitution will be replaced with actual code on later stage of the build, +// this way Closure Compiler will not mangle it (e.g. case 4. above). +// Note that if you want to run closure, and also to use Module +// after the generated code, you will need to define var Module = {}; +// before the code. Then that object will be used in the code, and you +// can continue to use Module afterwards as well. +var Module = moduleArg; + +// Determine the runtime environment we are in. You can customize this by +// setting the ENVIRONMENT setting at compile time (see settings.js). + +var ENVIRONMENT_IS_WEB = true; +var ENVIRONMENT_IS_WORKER = false; +var ENVIRONMENT_IS_NODE = false; +var ENVIRONMENT_IS_SHELL = false; + +// --pre-jses are emitted after the Module integration code, so that they can +// refer to Module (if they choose; they can also define Module) + + +var arguments_ = []; +var thisProgram = './this.program'; +var quit_ = (status, toThrow) => { + throw toThrow; +}; + +// `/` should be present at the end if `scriptDirectory` is not empty +var scriptDirectory = ''; +function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; +} + +// Hooks that are implemented differently in different runtime environments. +var readAsync, readBinary; + +if (ENVIRONMENT_IS_SHELL) { + + const isNode = typeof process == 'object' && process.versions?.node && process.type != 'renderer'; + if (isNode || typeof window == 'object' || typeof WorkerGlobalScope != 'undefined') throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + +} else + +// Note that this includes Node.js workers when relevant (pthreads is enabled). +// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and +// ENVIRONMENT_IS_NODE. +if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + try { + scriptDirectory = new URL('.', _scriptName).href; // includes trailing slash + } catch { + // Must be a `blob:` or `data:` URL (e.g. `blob:http://site.com/etc/etc`), we cannot + // infer anything from them. + } + + if (!(typeof window == 'object' || typeof WorkerGlobalScope != 'undefined')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + { +// include: web_or_worker_shell_read.js +readAsync = async (url) => { + assert(!isFileURI(url), "readAsync does not work with file:// URLs"); + var response = await fetch(url, { credentials: 'same-origin' }); + if (response.ok) { + return response.arrayBuffer(); + } + throw new Error(response.status + ' : ' + response.url); + }; +// end include: web_or_worker_shell_read.js + } +} else +{ + throw new Error('environment detection error'); +} + +var out = console.log.bind(console); +var err = console.error.bind(console); + +var IDBFS = 'IDBFS is no longer included by default; build with -lidbfs.js'; +var PROXYFS = 'PROXYFS is no longer included by default; build with -lproxyfs.js'; +var WORKERFS = 'WORKERFS is no longer included by default; build with -lworkerfs.js'; +var FETCHFS = 'FETCHFS is no longer included by default; build with -lfetchfs.js'; +var ICASEFS = 'ICASEFS is no longer included by default; build with -licasefs.js'; +var JSFILEFS = 'JSFILEFS is no longer included by default; build with -ljsfilefs.js'; +var OPFS = 'OPFS is no longer included by default; build with -lopfs.js'; + +var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js'; + +// perform assertions in shell.js after we set up out() and err(), as otherwise +// if an assertion fails it cannot print the message + +assert(!ENVIRONMENT_IS_WORKER, 'worker environment detected but not enabled at build time. Add `worker` to `-sENVIRONMENT` to enable.'); + +assert(!ENVIRONMENT_IS_NODE, 'node environment detected but not enabled at build time. Add `node` to `-sENVIRONMENT` to enable.'); + +assert(!ENVIRONMENT_IS_SHELL, 'shell environment detected but not enabled at build time. Add `shell` to `-sENVIRONMENT` to enable.'); + +// end include: shell.js + +// include: preamble.js +// === Preamble library stuff === + +// Documentation for the public APIs defined in this file must be updated in: +// site/source/docs/api_reference/preamble.js.rst +// A prebuilt local version of the documentation is available at: +// site/build/text/docs/api_reference/preamble.js.txt +// You can also build docs locally as HTML or other formats in site/ +// An online HTML version (which may be of a different version of Emscripten) +// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html + +var wasmBinary; + +if (typeof WebAssembly != 'object') { + err('no native wasm support detected'); +} + +// Wasm globals + +//======================================== +// Runtime essentials +//======================================== + +// whether we are quitting the application. no code should run after this. +// set in exit() and abort() +var ABORT = false; + +// set by exit() and abort(). Passed to 'onExit' handler. +// NOTE: This is also used as the process return code code in shell environments +// but only when noExitRuntime is false. +var EXITSTATUS; + +// In STRICT mode, we only define assert() when ASSERTIONS is set. i.e. we +// don't define it at all in release modes. This matches the behaviour of +// MINIMAL_RUNTIME. +// TODO(sbc): Make this the default even without STRICT enabled. +/** @type {function(*, string=)} */ +function assert(condition, text) { + if (!condition) { + abort('Assertion failed' + (text ? ': ' + text : '')); + } +} + +// We used to include malloc/free by default in the past. Show a helpful error in +// builds with assertions. + +/** + * Indicates whether filename is delivered via file protocol (as opposed to http/https) + * @noinline + */ +var isFileURI = (filename) => filename.startsWith('file://'); + +// include: runtime_common.js +// include: runtime_stack_check.js +// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode. +function writeStackCookie() { + var max = _emscripten_stack_get_end(); + assert((max & 3) == 0); + // If the stack ends at address zero we write our cookies 4 bytes into the + // stack. This prevents interference with SAFE_HEAP and ASAN which also + // monitor writes to address zero. + if (max == 0) { + max += 4; + } + // The stack grow downwards towards _emscripten_stack_get_end. + // We write cookies to the final two words in the stack and detect if they are + // ever overwritten. + HEAPU32[((max)>>2)] = 0x02135467; + HEAPU32[(((max)+(4))>>2)] = 0x89BACDFE; + // Also test the global address 0 for integrity. + HEAPU32[((0)>>2)] = 1668509029; +} + +function checkStackCookie() { + if (ABORT) return; + var max = _emscripten_stack_get_end(); + // See writeStackCookie(). + if (max == 0) { + max += 4; + } + var cookie1 = HEAPU32[((max)>>2)]; + var cookie2 = HEAPU32[(((max)+(4))>>2)]; + if (cookie1 != 0x02135467 || cookie2 != 0x89BACDFE) { + abort(`Stack overflow! Stack cookie has been overwritten at ${ptrToString(max)}, expected hex dwords 0x89BACDFE and 0x2135467, but received ${ptrToString(cookie2)} ${ptrToString(cookie1)}`); + } + // Also test the global address 0 for integrity. + if (HEAPU32[((0)>>2)] != 0x63736d65 /* 'emsc' */) { + abort('Runtime error: The application has corrupted its heap memory area (address zero)!'); + } +} +// end include: runtime_stack_check.js +// include: runtime_exceptions.js +// Base Emscripten EH error class +class EmscriptenEH extends Error {} + +class EmscriptenSjLj extends EmscriptenEH {} + +class CppException extends EmscriptenEH { + constructor(excPtr) { + super(excPtr); + this.excPtr = excPtr; + const excInfo = getExceptionMessage(excPtr); + this.name = excInfo[0]; + this.message = excInfo[1]; + } +} +// end include: runtime_exceptions.js +// include: runtime_debug.js +var runtimeDebug = true; // Switch to false at runtime to disable logging at the right times + +// Used by XXXXX_DEBUG settings to output debug messages. +function dbg(...args) { + if (!runtimeDebug && typeof runtimeDebug != 'undefined') return; + // TODO(sbc): Make this configurable somehow. Its not always convenient for + // logging to show up as warnings. + console.warn(...args); +} + +// Endianness check +(() => { + var h16 = new Int16Array(1); + var h8 = new Int8Array(h16.buffer); + h16[0] = 0x6373; + if (h8[0] !== 0x73 || h8[1] !== 0x63) throw 'Runtime error: expected the system to be little-endian! (Run with -sSUPPORT_BIG_ENDIAN to bypass)'; +})(); + +function consumedModuleProp(prop) { + if (!Object.getOwnPropertyDescriptor(Module, prop)) { + Object.defineProperty(Module, prop, { + configurable: true, + set() { + abort(`Attempt to set \`Module.${prop}\` after it has already been processed. This can happen, for example, when code is injected via '--post-js' rather than '--pre-js'`); + + } + }); + } +} + +function makeInvalidEarlyAccess(name) { + return () => assert(false, `call to '${name}' via reference taken before Wasm module initialization`); + +} + +function ignoredModuleProp(prop) { + if (Object.getOwnPropertyDescriptor(Module, prop)) { + abort(`\`Module.${prop}\` was supplied but \`${prop}\` not included in INCOMING_MODULE_JS_API`); + } +} + +// forcing the filesystem exports a few things by default +function isExportedByForceFilesystem(name) { + return name === 'FS_createPath' || + name === 'FS_createDataFile' || + name === 'FS_createPreloadedFile' || + name === 'FS_unlink' || + name === 'addRunDependency' || + // The old FS has some functionality that WasmFS lacks. + name === 'FS_createLazyFile' || + name === 'FS_createDevice' || + name === 'removeRunDependency'; +} + +/** + * Intercept access to a global symbol. This enables us to give informative + * warnings/errors when folks attempt to use symbols they did not include in + * their build, or no symbols that no longer exist. + */ +function hookGlobalSymbolAccess(sym, func) { + // In MODULARIZE mode the generated code runs inside a function scope and not + // the global scope, and JavaScript does not provide access to function scopes + // so we cannot dynamically modify the scrope using `defineProperty` in this + // case. + // + // In this mode we simply ignore requests for `hookGlobalSymbolAccess`. Since + // this is a debug-only feature, skipping it is not major issue. +} + +function missingGlobal(sym, msg) { + hookGlobalSymbolAccess(sym, () => { + warnOnce(`\`${sym}\` is not longer defined by emscripten. ${msg}`); + }); +} + +missingGlobal('buffer', 'Please use HEAP8.buffer or wasmMemory.buffer'); +missingGlobal('asm', 'Please use wasmExports instead'); + +function missingLibrarySymbol(sym) { + hookGlobalSymbolAccess(sym, () => { + // Can't `abort()` here because it would break code that does runtime + // checks. e.g. `if (typeof SDL === 'undefined')`. + var msg = `\`${sym}\` is a library symbol and not included by default; add it to your library.js __deps or to DEFAULT_LIBRARY_FUNCS_TO_INCLUDE on the command line`; + // DEFAULT_LIBRARY_FUNCS_TO_INCLUDE requires the name as it appears in + // library.js, which means $name for a JS name with no prefix, or name + // for a JS name like _name. + var librarySymbol = sym; + if (!librarySymbol.startsWith('_')) { + librarySymbol = '$' + sym; + } + msg += ` (e.g. -sDEFAULT_LIBRARY_FUNCS_TO_INCLUDE='${librarySymbol}')`; + if (isExportedByForceFilesystem(sym)) { + msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you'; + } + warnOnce(msg); + }); + + // Any symbol that is not included from the JS library is also (by definition) + // not exported on the Module object. + unexportedRuntimeSymbol(sym); +} + +function unexportedRuntimeSymbol(sym) { + if (!Object.getOwnPropertyDescriptor(Module, sym)) { + Object.defineProperty(Module, sym, { + configurable: true, + get() { + var msg = `'${sym}' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the Emscripten FAQ)`; + if (isExportedByForceFilesystem(sym)) { + msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you'; + } + abort(msg); + } + }); + } +} + +// end include: runtime_debug.js +var readyPromiseResolve, readyPromiseReject; + +// Memory management + +var wasmMemory; + +var +/** @type {!Int8Array} */ + HEAP8, +/** @type {!Uint8Array} */ + HEAPU8, +/** @type {!Int16Array} */ + HEAP16, +/** @type {!Uint16Array} */ + HEAPU16, +/** @type {!Int32Array} */ + HEAP32, +/** @type {!Uint32Array} */ + HEAPU32, +/** @type {!Float32Array} */ + HEAPF32, +/** @type {!Float64Array} */ + HEAPF64; + +// BigInt64Array type is not correctly defined in closure +var +/** not-@type {!BigInt64Array} */ + HEAP64, +/* BigUint64Array type is not correctly defined in closure +/** not-@type {!BigUint64Array} */ + HEAPU64; + +var runtimeInitialized = false; + + + +function updateMemoryViews() { + var b = wasmMemory.buffer; + HEAP8 = new Int8Array(b); + HEAP16 = new Int16Array(b); + HEAPU8 = new Uint8Array(b); + HEAPU16 = new Uint16Array(b); + HEAP32 = new Int32Array(b); + HEAPU32 = new Uint32Array(b); + HEAPF32 = new Float32Array(b); + HEAPF64 = new Float64Array(b); + HEAP64 = new BigInt64Array(b); + HEAPU64 = new BigUint64Array(b); +} + +// include: memoryprofiler.js +// end include: memoryprofiler.js +// end include: runtime_common.js +assert(typeof Int32Array != 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray != undefined && Int32Array.prototype.set != undefined, + 'JS engine does not provide full typed array support'); + +function preRun() { + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + consumedModuleProp('preRun'); + // Begin ATPRERUNS hooks + callRuntimeCallbacks(onPreRuns); + // End ATPRERUNS hooks +} + +function initRuntime() { + assert(!runtimeInitialized); + runtimeInitialized = true; + + checkStackCookie(); + + // Begin ATINITS hooks + if (!Module['noFSInit'] && !FS.initialized) FS.init(); +TTY.init(); + // End ATINITS hooks + + wasmExports['__wasm_call_ctors'](); + + // Begin ATPOSTCTORS hooks + FS.ignorePermissions = false; + // End ATPOSTCTORS hooks +} + +function postRun() { + checkStackCookie(); + // PThreads reuse the runtime from the main thread. + + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + consumedModuleProp('postRun'); + + // Begin ATPOSTRUNS hooks + callRuntimeCallbacks(onPostRuns); + // End ATPOSTRUNS hooks +} + +// A counter of dependencies for calling run(). If we need to +// do asynchronous work before running, increment this and +// decrement it. Incrementing must happen in a place like +// Module.preRun (used by emcc to add file preloading). +// Note that you can add dependencies in preRun, even though +// it happens right before run - run will be postponed until +// the dependencies are met. +var runDependencies = 0; +var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled +var runDependencyTracking = {}; +var runDependencyWatcher = null; + +function addRunDependency(id) { + runDependencies++; + + Module['monitorRunDependencies']?.(runDependencies); + + if (id) { + assert(!runDependencyTracking[id]); + runDependencyTracking[id] = 1; + if (runDependencyWatcher === null && typeof setInterval != 'undefined') { + // Check for missing dependencies every few seconds + runDependencyWatcher = setInterval(() => { + if (ABORT) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + return; + } + var shown = false; + for (var dep in runDependencyTracking) { + if (!shown) { + shown = true; + err('still waiting on run dependencies:'); + } + err(`dependency: ${dep}`); + } + if (shown) { + err('(end of list)'); + } + }, 10000); + } + } else { + err('warning: run dependency added without ID'); + } +} + +function removeRunDependency(id) { + runDependencies--; + + Module['monitorRunDependencies']?.(runDependencies); + + if (id) { + assert(runDependencyTracking[id]); + delete runDependencyTracking[id]; + } else { + err('warning: run dependency removed without ID'); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); // can add another dependenciesFulfilled + } + } +} + +/** @param {string|number=} what */ +function abort(what) { + Module['onAbort']?.(what); + + what = 'Aborted(' + what + ')'; + // TODO(sbc): Should we remove printing and leave it up to whoever + // catches the exception? + err(what); + + ABORT = true; + + // Use a wasm runtime error, because a JS error might be seen as a foreign + // exception, which means we'd run destructors on it. We need the error to + // simply make the program stop. + // FIXME This approach does not work in Wasm EH because it currently does not assume + // all RuntimeErrors are from traps; it decides whether a RuntimeError is from + // a trap or not based on a hidden field within the object. So at the moment + // we don't have a way of throwing a wasm trap from JS. TODO Make a JS API that + // allows this in the wasm spec. + + // Suppress closure compiler warning here. Closure compiler's builtin extern + // definition for WebAssembly.RuntimeError claims it takes no arguments even + // though it can. + // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure gets fixed. + /** @suppress {checkTypes} */ + var e = new WebAssembly.RuntimeError(what); + + readyPromiseReject?.(e); + // Throw the error whether or not MODULARIZE is set because abort is used + // in code paths apart from instantiation where an exception is expected + // to be thrown when abort is called. + throw e; +} + +function createExportWrapper(name, nargs) { + return (...args) => { + assert(runtimeInitialized, `native function \`${name}\` called before runtime initialization`); + var f = wasmExports[name]; + assert(f, `exported native function \`${name}\` not found`); + // Only assert for too many arguments. Too few can be valid since the missing arguments will be zero filled. + assert(args.length <= nargs, `native function \`${name}\` called with ${args.length} args but expects ${nargs}`); + return f(...args); + }; +} + +var wasmBinaryFile; + +function findWasmBinary() { + return locateFile('cardcode.wasm'); +} + +function getBinarySync(file) { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } + throw 'both async and sync fetching of the wasm failed'; +} + +async function getWasmBinary(binaryFile) { + // If we don't have the binary yet, load it asynchronously using readAsync. + if (!wasmBinary) { + // Fetch the binary using readAsync + try { + var response = await readAsync(binaryFile); + return new Uint8Array(response); + } catch { + // Fall back to getBinarySync below; + } + } + + // Otherwise, getBinarySync should be able to get it synchronously + return getBinarySync(binaryFile); +} + +async function instantiateArrayBuffer(binaryFile, imports) { + try { + var binary = await getWasmBinary(binaryFile); + var instance = await WebAssembly.instantiate(binary, imports); + return instance; + } catch (reason) { + err(`failed to asynchronously prepare wasm: ${reason}`); + + // Warn on some common problems. + if (isFileURI(wasmBinaryFile)) { + err(`warning: Loading from a file URI (${wasmBinaryFile}) is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing`); + } + abort(reason); + } +} + +async function instantiateAsync(binary, binaryFile, imports) { + if (!binary && typeof WebAssembly.instantiateStreaming == 'function' + ) { + try { + var response = fetch(binaryFile, { credentials: 'same-origin' }); + var instantiationResult = await WebAssembly.instantiateStreaming(response, imports); + return instantiationResult; + } catch (reason) { + // We expect the most common failure cause to be a bad MIME type for the binary, + // in which case falling back to ArrayBuffer instantiation should work. + err(`wasm streaming compile failed: ${reason}`); + err('falling back to ArrayBuffer instantiation'); + // fall back of instantiateArrayBuffer below + }; + } + return instantiateArrayBuffer(binaryFile, imports); +} + +function getWasmImports() { + // prepare imports + return { + 'env': wasmImports, + 'wasi_snapshot_preview1': wasmImports, + } +} + +// Create the wasm instance. +// Receives the wasm imports, returns the exports. +async function createWasm() { + // Load the wasm module and create an instance of using native support in the JS engine. + // handle a generated wasm instance, receiving its exports and + // performing other necessary setup + /** @param {WebAssembly.Module=} module*/ + function receiveInstance(instance, module) { + wasmExports = instance.exports; + + + + wasmMemory = wasmExports['memory']; + + assert(wasmMemory, 'memory not found in wasm exports'); + updateMemoryViews(); + + wasmTable = wasmExports['__indirect_function_table']; + + assert(wasmTable, 'table not found in wasm exports'); + + assignWasmExports(wasmExports); + removeRunDependency('wasm-instantiate'); + return wasmExports; + } + // wait for the pthread pool (if any) + addRunDependency('wasm-instantiate'); + + // Prefer streaming instantiation if available. + // Async compilation can be confusing when an error on the page overwrites Module + // (for example, if the order of elements is wrong, and the one defining Module is + // later), so we save Module and check it later. + var trueModule = Module; + function receiveInstantiationResult(result) { + // 'result' is a ResultObject object which has both the module and instance. + // receiveInstance() will swap in the exports (to Module.asm) so they can be called + assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?'); + trueModule = null; + // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line. + // When the regression is fixed, can restore the above PTHREADS-enabled path. + return receiveInstance(result['instance']); + } + + var info = getWasmImports(); + + // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback + // to manually instantiate the Wasm module themselves. This allows pages to + // run the instantiation parallel to any other async startup actions they are + // performing. + // Also pthreads and wasm workers initialize the wasm instance through this + // path. + if (Module['instantiateWasm']) { + return new Promise((resolve, reject) => { + try { + Module['instantiateWasm'](info, (mod, inst) => { + resolve(receiveInstance(mod, inst)); + }); + } catch(e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + reject(e); + } + }); + } + + wasmBinaryFile ??= findWasmBinary(); + var result = await instantiateAsync(wasmBinary, wasmBinaryFile, info); + var exports = receiveInstantiationResult(result); + return exports; +} + +// end include: preamble.js + +// Begin JS library code + + + class ExitStatus { + name = 'ExitStatus'; + constructor(status) { + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + } + + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + // Pass the module as the first argument. + callbacks.shift()(Module); + } + }; + var onPostRuns = []; + var addOnPostRun = (cb) => onPostRuns.push(cb); + + var onPreRuns = []; + var addOnPreRun = (cb) => onPreRuns.push(cb); + + + + /** + * @param {number} ptr + * @param {string} type + */ + function getValue(ptr, type = 'i8') { + if (type.endsWith('*')) type = '*'; + switch (type) { + case 'i1': return HEAP8[ptr]; + case 'i8': return HEAP8[ptr]; + case 'i16': return HEAP16[((ptr)>>1)]; + case 'i32': return HEAP32[((ptr)>>2)]; + case 'i64': return HEAP64[((ptr)>>3)]; + case 'float': return HEAPF32[((ptr)>>2)]; + case 'double': return HEAPF64[((ptr)>>3)]; + case '*': return HEAPU32[((ptr)>>2)]; + default: abort(`invalid type for getValue: ${type}`); + } + } + + var noExitRuntime = true; + + var ptrToString = (ptr) => { + assert(typeof ptr === 'number'); + // With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned. + ptr >>>= 0; + return '0x' + ptr.toString(16).padStart(8, '0'); + }; + + + /** + * @param {number} ptr + * @param {number} value + * @param {string} type + */ + function setValue(ptr, value, type = 'i8') { + if (type.endsWith('*')) type = '*'; + switch (type) { + case 'i1': HEAP8[ptr] = value; break; + case 'i8': HEAP8[ptr] = value; break; + case 'i16': HEAP16[((ptr)>>1)] = value; break; + case 'i32': HEAP32[((ptr)>>2)] = value; break; + case 'i64': HEAP64[((ptr)>>3)] = BigInt(value); break; + case 'float': HEAPF32[((ptr)>>2)] = value; break; + case 'double': HEAPF64[((ptr)>>3)] = value; break; + case '*': HEAPU32[((ptr)>>2)] = value; break; + default: abort(`invalid type for setValue: ${type}`); + } + } + + var stackRestore = (val) => __emscripten_stack_restore(val); + + var stackSave = () => _emscripten_stack_get_current(); + + var warnOnce = (text) => { + warnOnce.shown ||= {}; + if (!warnOnce.shown[text]) { + warnOnce.shown[text] = 1; + err(text); + } + }; + + var UTF8Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder() : undefined; + + var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { + var maxIdx = idx + maxBytesToRead; + if (ignoreNul) return maxIdx; + // TextDecoder needs to know the byte length in advance, it doesn't stop on + // null terminator by itself. + // As a tiny code save trick, compare idx against maxIdx using a negation, + // so that maxBytesToRead=undefined/NaN means Infinity. + while (heapOrArray[idx] && !(idx >= maxIdx)) ++idx; + return idx; + }; + + /** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number=} idx + * @param {number=} maxBytesToRead + * @param {boolean=} ignoreNul - If true, the function will not stop on a NUL character. + * @return {string} + */ + var UTF8ArrayToString = (heapOrArray, idx = 0, maxBytesToRead, ignoreNul) => { + + var endPtr = findStringEnd(heapOrArray, idx, maxBytesToRead, ignoreNul); + + // When using conditional TextDecoder, skip it for short strings as the overhead of the native call is not worth it. + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ''; + // If building with TextDecoder, we have already computed the string length + // above, so test loop end condition against that + while (idx < endPtr) { + // For UTF8 byte structure, see: + // http://en.wikipedia.org/wiki/UTF-8#Description + // https://www.ietf.org/rfc/rfc2279.txt + // https://tools.ietf.org/html/rfc3629 + var u0 = heapOrArray[idx++]; + if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 0xF0) == 0xE0) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte ' + ptrToString(u0) + ' encountered when deserializing a UTF-8 string in wasm memory to a JS string!'); + u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); + } + + if (u0 < 0x10000) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } + } + return str; + }; + + /** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index. + * @param {boolean=} ignoreNul - If true, the function will not stop on a NUL character. + * @return {string} + */ + var UTF8ToString = (ptr, maxBytesToRead, ignoreNul) => { + assert(typeof ptr == 'number', `UTF8ToString expects a number (got ${typeof ptr})`); + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead, ignoreNul) : ''; + }; + var ___assert_fail = (condition, filename, line, func) => + abort(`Assertion failed: ${UTF8ToString(condition)}, at: ` + [filename ? UTF8ToString(filename) : 'unknown filename', line, func ? UTF8ToString(func) : 'unknown function']); + + var exceptionCaught = []; + + + + var uncaughtExceptionCount = 0; + var ___cxa_begin_catch = (ptr) => { + var info = new ExceptionInfo(ptr); + if (!info.get_caught()) { + info.set_caught(true); + uncaughtExceptionCount--; + } + info.set_rethrown(false); + exceptionCaught.push(info); + ___cxa_increment_exception_refcount(ptr); + return ___cxa_get_exception_ptr(ptr); + }; + + + var exceptionLast = 0; + + + var ___cxa_end_catch = () => { + // Clear state flag. + _setThrew(0, 0); + assert(exceptionCaught.length > 0); + // Call destructor if one is registered then clear it. + var info = exceptionCaught.pop(); + + ___cxa_decrement_exception_refcount(info.excPtr); + exceptionLast = 0; // XXX in decRef? + }; + + + class ExceptionInfo { + // excPtr - Thrown object pointer to wrap. Metadata pointer is calculated from it. + constructor(excPtr) { + this.excPtr = excPtr; + this.ptr = excPtr - 24; + } + + set_type(type) { + HEAPU32[(((this.ptr)+(4))>>2)] = type; + } + + get_type() { + return HEAPU32[(((this.ptr)+(4))>>2)]; + } + + set_destructor(destructor) { + HEAPU32[(((this.ptr)+(8))>>2)] = destructor; + } + + get_destructor() { + return HEAPU32[(((this.ptr)+(8))>>2)]; + } + + set_caught(caught) { + caught = caught ? 1 : 0; + HEAP8[(this.ptr)+(12)] = caught; + } + + get_caught() { + return HEAP8[(this.ptr)+(12)] != 0; + } + + set_rethrown(rethrown) { + rethrown = rethrown ? 1 : 0; + HEAP8[(this.ptr)+(13)] = rethrown; + } + + get_rethrown() { + return HEAP8[(this.ptr)+(13)] != 0; + } + + // Initialize native structure fields. Should be called once after allocated. + init(type, destructor) { + this.set_adjusted_ptr(0); + this.set_type(type); + this.set_destructor(destructor); + } + + set_adjusted_ptr(adjustedPtr) { + HEAPU32[(((this.ptr)+(16))>>2)] = adjustedPtr; + } + + get_adjusted_ptr() { + return HEAPU32[(((this.ptr)+(16))>>2)]; + } + } + + + var setTempRet0 = (val) => __emscripten_tempret_set(val); + var findMatchingCatch = (args) => { + var thrown = + exceptionLast?.excPtr; + if (!thrown) { + // just pass through the null ptr + setTempRet0(0); + return 0; + } + var info = new ExceptionInfo(thrown); + info.set_adjusted_ptr(thrown); + var thrownType = info.get_type(); + if (!thrownType) { + // just pass through the thrown ptr + setTempRet0(0); + return thrown; + } + + // can_catch receives a **, add indirection + // The different catch blocks are denoted by different types. + // Due to inheritance, those types may not precisely match the + // type of the thrown object. Find one which matches, and + // return the type of the catch block which should be called. + for (var caughtType of args) { + if (caughtType === 0 || caughtType === thrownType) { + // Catch all clause matched or exactly the same type is caught + break; + } + var adjusted_ptr_addr = info.ptr + 16; + if (___cxa_can_catch(caughtType, thrownType, adjusted_ptr_addr)) { + setTempRet0(caughtType); + return thrown; + } + } + setTempRet0(thrownType); + return thrown; + }; + var ___cxa_find_matching_catch_2 = () => findMatchingCatch([]); + + var ___cxa_find_matching_catch_3 = (arg0) => findMatchingCatch([arg0]); + + + + var ___cxa_rethrow = () => { + var info = exceptionCaught.pop(); + if (!info) { + abort('no exception to throw'); + } + var ptr = info.excPtr; + if (!info.get_rethrown()) { + // Only pop if the corresponding push was through rethrow_primary_exception + exceptionCaught.push(info); + info.set_rethrown(true); + info.set_caught(false); + uncaughtExceptionCount++; + } + exceptionLast = new CppException(ptr); + throw exceptionLast; + }; + + + + var ___cxa_throw = (ptr, type, destructor) => { + var info = new ExceptionInfo(ptr); + // Initialize ExceptionInfo content after it was allocated in __cxa_allocate_exception. + info.init(type, destructor); + exceptionLast = new CppException(ptr); + uncaughtExceptionCount++; + throw exceptionLast; + }; + + var ___cxa_uncaught_exceptions = () => uncaughtExceptionCount; + + var ___resumeException = (ptr) => { + if (!exceptionLast) { + exceptionLast = new CppException(ptr); + } + throw exceptionLast; + }; + + var __abort_js = () => + abort('native code called abort()'); + + var AsciiToString = (ptr) => { + var str = ''; + while (1) { + var ch = HEAPU8[ptr++]; + if (!ch) return str; + str += String.fromCharCode(ch); + } + }; + + var awaitingDependencies = { + }; + + var registeredTypes = { + }; + + var typeDependencies = { + }; + + var BindingError = class BindingError extends Error { constructor(message) { super(message); this.name = 'BindingError'; }}; + var throwBindingError = (message) => { throw new BindingError(message); }; + /** @param {Object=} options */ + function sharedRegisterType(rawType, registeredInstance, options = {}) { + var name = registeredInstance.name; + if (!rawType) { + throwBindingError(`type "${name}" must have a positive integer typeid pointer`); + } + if (registeredTypes.hasOwnProperty(rawType)) { + if (options.ignoreDuplicateRegistrations) { + return; + } else { + throwBindingError(`Cannot register type '${name}' twice`); + } + } + + registeredTypes[rawType] = registeredInstance; + delete typeDependencies[rawType]; + + if (awaitingDependencies.hasOwnProperty(rawType)) { + var callbacks = awaitingDependencies[rawType]; + delete awaitingDependencies[rawType]; + callbacks.forEach((cb) => cb()); + } + } + /** @param {Object=} options */ + function registerType(rawType, registeredInstance, options = {}) { + return sharedRegisterType(rawType, registeredInstance, options); + } + + var integerReadValueFromPointer = (name, width, signed) => { + // integers are quite common, so generate very specialized functions + switch (width) { + case 1: return signed ? + (pointer) => HEAP8[pointer] : + (pointer) => HEAPU8[pointer]; + case 2: return signed ? + (pointer) => HEAP16[((pointer)>>1)] : + (pointer) => HEAPU16[((pointer)>>1)] + case 4: return signed ? + (pointer) => HEAP32[((pointer)>>2)] : + (pointer) => HEAPU32[((pointer)>>2)] + case 8: return signed ? + (pointer) => HEAP64[((pointer)>>3)] : + (pointer) => HEAPU64[((pointer)>>3)] + default: + throw new TypeError(`invalid integer width (${width}): ${name}`); + } + }; + + var embindRepr = (v) => { + if (v === null) { + return 'null'; + } + var t = typeof v; + if (t === 'object' || t === 'array' || t === 'function') { + return v.toString(); + } else { + return '' + v; + } + }; + + var assertIntegerRange = (typeName, value, minRange, maxRange) => { + if (value < minRange || value > maxRange) { + throw new TypeError(`Passing a number "${embindRepr(value)}" from JS side to C/C++ side to an argument of type "${typeName}", which is outside the valid range [${minRange}, ${maxRange}]!`); + } + }; + /** @suppress {globalThis} */ + var __embind_register_bigint = (primitiveType, name, size, minRange, maxRange) => { + name = AsciiToString(name); + + const isUnsignedType = minRange === 0n; + + let fromWireType = (value) => value; + if (isUnsignedType) { + // uint64 get converted to int64 in ABI, fix them up like we do for 32-bit integers. + const bitSize = size * 8; + fromWireType = (value) => { + return BigInt.asUintN(bitSize, value); + } + maxRange = fromWireType(maxRange); + } + + registerType(primitiveType, { + name, + fromWireType: fromWireType, + toWireType: (destructors, value) => { + if (typeof value == "number") { + value = BigInt(value); + } + else if (typeof value != "bigint") { + throw new TypeError(`Cannot convert "${embindRepr(value)}" to ${this.name}`); + } + assertIntegerRange(name, value, minRange, maxRange); + return value; + }, + readValueFromPointer: integerReadValueFromPointer(name, size, !isUnsignedType), + destructorFunction: null, // This type does not need a destructor + }); + }; + + + /** @suppress {globalThis} */ + var __embind_register_bool = (rawType, name, trueValue, falseValue) => { + name = AsciiToString(name); + registerType(rawType, { + name, + fromWireType: function(wt) { + // ambiguous emscripten ABI: sometimes return values are + // true or false, and sometimes integers (0 or 1) + return !!wt; + }, + toWireType: function(destructors, o) { + return o ? trueValue : falseValue; + }, + readValueFromPointer: function(pointer) { + return this.fromWireType(HEAPU8[pointer]); + }, + destructorFunction: null, // This type does not need a destructor + }); + }; + + + var emval_freelist = []; + + var emval_handles = [0,1,,1,null,1,true,1,false,1]; + var __emval_decref = (handle) => { + if (handle > 9 && 0 === --emval_handles[handle + 1]) { + assert(emval_handles[handle] !== undefined, `Decref for unallocated handle.`); + emval_handles[handle] = undefined; + emval_freelist.push(handle); + } + }; + + + + var Emval = { + toValue:(handle) => { + if (!handle) { + throwBindingError(`Cannot use deleted val. handle = ${handle}`); + } + // handle 2 is supposed to be `undefined`. + assert(handle === 2 || emval_handles[handle] !== undefined && handle % 2 === 0, `invalid handle: ${handle}`); + return emval_handles[handle]; + }, + toHandle:(value) => { + switch (value) { + case undefined: return 2; + case null: return 4; + case true: return 6; + case false: return 8; + default:{ + const handle = emval_freelist.pop() || emval_handles.length; + emval_handles[handle] = value; + emval_handles[handle + 1] = 1; + return handle; + } + } + }, + }; + + /** @suppress {globalThis} */ + function readPointer(pointer) { + return this.fromWireType(HEAPU32[((pointer)>>2)]); + } + var EmValType = { + name: 'emscripten::val', + fromWireType: (handle) => { + var rv = Emval.toValue(handle); + __emval_decref(handle); + return rv; + }, + toWireType: (destructors, value) => Emval.toHandle(value), + readValueFromPointer: readPointer, + destructorFunction: null, // This type does not need a destructor + + // TODO: do we need a deleteObject here? write a test where + // emval is passed into JS via an interface + }; + var __embind_register_emval = (rawType) => registerType(rawType, EmValType); + + var floatReadValueFromPointer = (name, width) => { + switch (width) { + case 4: return function(pointer) { + return this.fromWireType(HEAPF32[((pointer)>>2)]); + }; + case 8: return function(pointer) { + return this.fromWireType(HEAPF64[((pointer)>>3)]); + }; + default: + throw new TypeError(`invalid float width (${width}): ${name}`); + } + }; + + + + var __embind_register_float = (rawType, name, size) => { + name = AsciiToString(name); + registerType(rawType, { + name, + fromWireType: (value) => value, + toWireType: (destructors, value) => { + if (typeof value != "number" && typeof value != "boolean") { + throw new TypeError(`Cannot convert ${embindRepr(value)} to ${this.name}`); + } + // The VM will perform JS to Wasm value conversion, according to the spec: + // https://www.w3.org/TR/wasm-js-api-1/#towebassemblyvalue + return value; + }, + readValueFromPointer: floatReadValueFromPointer(name, size), + destructorFunction: null, // This type does not need a destructor + }); + }; + + var createNamedFunction = (name, func) => Object.defineProperty(func, 'name', { value: name }); + + var runDestructors = (destructors) => { + while (destructors.length) { + var ptr = destructors.pop(); + var del = destructors.pop(); + del(ptr); + } + }; + + + function usesDestructorStack(argTypes) { + // Skip return value at index 0 - it's not deleted here. + for (var i = 1; i < argTypes.length; ++i) { + // The type does not define a destructor function - must use dynamic stack + if (argTypes[i] !== null && argTypes[i].destructorFunction === undefined) { + return true; + } + } + return false; + } + + + function checkArgCount(numArgs, minArgs, maxArgs, humanName, throwBindingError) { + if (numArgs < minArgs || numArgs > maxArgs) { + var argCountMessage = minArgs == maxArgs ? minArgs : `${minArgs} to ${maxArgs}`; + throwBindingError(`function ${humanName} called with ${numArgs} arguments, expected ${argCountMessage}`); + } + } + function createJsInvoker(argTypes, isClassMethodFunc, returns, isAsync) { + var needsDestructorStack = usesDestructorStack(argTypes); + var argCount = argTypes.length - 2; + var argsList = []; + var argsListWired = ['fn']; + if (isClassMethodFunc) { + argsListWired.push('thisWired'); + } + for (var i = 0; i < argCount; ++i) { + argsList.push(`arg${i}`) + argsListWired.push(`arg${i}Wired`) + } + argsList = argsList.join(',') + argsListWired = argsListWired.join(',') + + var invokerFnBody = `return function (${argsList}) {\n`; + + invokerFnBody += "checkArgCount(arguments.length, minArgs, maxArgs, humanName, throwBindingError);\n"; + + if (needsDestructorStack) { + invokerFnBody += "var destructors = [];\n"; + } + + var dtorStack = needsDestructorStack ? "destructors" : "null"; + var args1 = ["humanName", "throwBindingError", "invoker", "fn", "runDestructors", "fromRetWire", "toClassParamWire"]; + + if (isClassMethodFunc) { + invokerFnBody += `var thisWired = toClassParamWire(${dtorStack}, this);\n`; + } + + for (var i = 0; i < argCount; ++i) { + var argName = `toArg${i}Wire`; + invokerFnBody += `var arg${i}Wired = ${argName}(${dtorStack}, arg${i});\n`; + args1.push(argName); + } + + invokerFnBody += (returns || isAsync ? "var rv = ":"") + `invoker(${argsListWired});\n`; + + var returnVal = returns ? "rv" : ""; + + if (needsDestructorStack) { + invokerFnBody += "runDestructors(destructors);\n"; + } else { + for (var i = isClassMethodFunc?1:2; i < argTypes.length; ++i) { // Skip return value at index 0 - it's not deleted here. Also skip class type if not a method. + var paramName = (i === 1 ? "thisWired" : ("arg"+(i - 2)+"Wired")); + if (argTypes[i].destructorFunction !== null) { + invokerFnBody += `${paramName}_dtor(${paramName});\n`; + args1.push(`${paramName}_dtor`); + } + } + } + + if (returns) { + invokerFnBody += "var ret = fromRetWire(rv);\n" + + "return ret;\n"; + } else { + } + + invokerFnBody += "}\n"; + + args1.push('checkArgCount', 'minArgs', 'maxArgs'); + invokerFnBody = `if (arguments.length !== ${args1.length}){ throw new Error(humanName + "Expected ${args1.length} closure arguments " + arguments.length + " given."); }\n${invokerFnBody}`; + return new Function(args1, invokerFnBody); + } + + function getRequiredArgCount(argTypes) { + var requiredArgCount = argTypes.length - 2; + for (var i = argTypes.length - 1; i >= 2; --i) { + if (!argTypes[i].optional) { + break; + } + requiredArgCount--; + } + return requiredArgCount; + } + + function craftInvokerFunction(humanName, argTypes, classType, cppInvokerFunc, cppTargetFunc, /** boolean= */ isAsync) { + // humanName: a human-readable string name for the function to be generated. + // argTypes: An array that contains the embind type objects for all types in the function signature. + // argTypes[0] is the type object for the function return value. + // argTypes[1] is the type object for function this object/class type, or null if not crafting an invoker for a class method. + // argTypes[2...] are the actual function parameters. + // classType: The embind type object for the class to be bound, or null if this is not a method of a class. + // cppInvokerFunc: JS Function object to the C++-side function that interops into C++ code. + // cppTargetFunc: Function pointer (an integer to FUNCTION_TABLE) to the target C++ function the cppInvokerFunc will end up calling. + // isAsync: Optional. If true, returns an async function. Async bindings are only supported with JSPI. + var argCount = argTypes.length; + + if (argCount < 2) { + throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!"); + } + + assert(!isAsync, 'Async bindings are only supported with JSPI.'); + var isClassMethodFunc = (argTypes[1] !== null && classType !== null); + + // Free functions with signature "void function()" do not need an invoker that marshalls between wire types. + // TODO: This omits argument count check - enable only at -O3 or similar. + // if (ENABLE_UNSAFE_OPTS && argCount == 2 && argTypes[0].name == "void" && !isClassMethodFunc) { + // return FUNCTION_TABLE[fn]; + // } + + // Determine if we need to use a dynamic stack to store the destructors for the function parameters. + // TODO: Remove this completely once all function invokers are being dynamically generated. + var needsDestructorStack = usesDestructorStack(argTypes); + + var returns = !argTypes[0].isVoid; + + var expectedArgCount = argCount - 2; + var minArgs = getRequiredArgCount(argTypes); + // Builld the arguments that will be passed into the closure around the invoker + // function. + var retType = argTypes[0]; + var instType = argTypes[1]; + var closureArgs = [humanName, throwBindingError, cppInvokerFunc, cppTargetFunc, runDestructors, retType.fromWireType.bind(retType), instType?.toWireType.bind(instType)]; + for (var i = 2; i < argCount; ++i) { + var argType = argTypes[i]; + closureArgs.push(argType.toWireType.bind(argType)); + } + if (!needsDestructorStack) { + // Skip return value at index 0 - it's not deleted here. Also skip class type if not a method. + for (var i = isClassMethodFunc?1:2; i < argTypes.length; ++i) { + if (argTypes[i].destructorFunction !== null) { + closureArgs.push(argTypes[i].destructorFunction); + } + } + } + closureArgs.push(checkArgCount, minArgs, expectedArgCount); + + let invokerFactory = createJsInvoker(argTypes, isClassMethodFunc, returns, isAsync); + var invokerFn = invokerFactory(...closureArgs); + return createNamedFunction(humanName, invokerFn); + } + + var ensureOverloadTable = (proto, methodName, humanName) => { + if (undefined === proto[methodName].overloadTable) { + var prevFunc = proto[methodName]; + // Inject an overload resolver function that routes to the appropriate overload based on the number of arguments. + proto[methodName] = function(...args) { + // TODO This check can be removed in -O3 level "unsafe" optimizations. + if (!proto[methodName].overloadTable.hasOwnProperty(args.length)) { + throwBindingError(`Function '${humanName}' called with an invalid number of arguments (${args.length}) - expects one of (${proto[methodName].overloadTable})!`); + } + return proto[methodName].overloadTable[args.length].apply(this, args); + }; + // Move the previous function into the overload table. + proto[methodName].overloadTable = []; + proto[methodName].overloadTable[prevFunc.argCount] = prevFunc; + } + }; + + /** @param {number=} numArguments */ + var exposePublicSymbol = (name, value, numArguments) => { + if (Module.hasOwnProperty(name)) { + if (undefined === numArguments || (undefined !== Module[name].overloadTable && undefined !== Module[name].overloadTable[numArguments])) { + throwBindingError(`Cannot register public name '${name}' twice`); + } + + // We are exposing a function with the same name as an existing function. Create an overload table and a function selector + // that routes between the two. + ensureOverloadTable(Module, name, name); + if (Module[name].overloadTable.hasOwnProperty(numArguments)) { + throwBindingError(`Cannot register multiple overloads of a function with the same number of arguments (${numArguments})!`); + } + // Add the new function into the overload table. + Module[name].overloadTable[numArguments] = value; + } else { + Module[name] = value; + Module[name].argCount = numArguments; + } + }; + + var heap32VectorToArray = (count, firstElement) => { + var array = []; + for (var i = 0; i < count; i++) { + // TODO(https://github.com/emscripten-core/emscripten/issues/17310): + // Find a way to hoist the `>> 2` or `>> 3` out of this loop. + array.push(HEAPU32[(((firstElement)+(i * 4))>>2)]); + } + return array; + }; + + + var InternalError = class InternalError extends Error { constructor(message) { super(message); this.name = 'InternalError'; }}; + var throwInternalError = (message) => { throw new InternalError(message); }; + /** @param {number=} numArguments */ + var replacePublicSymbol = (name, value, numArguments) => { + if (!Module.hasOwnProperty(name)) { + throwInternalError('Replacing nonexistent public symbol'); + } + // If there's an overload table for this symbol, replace the symbol in the overload table instead. + if (undefined !== Module[name].overloadTable && undefined !== numArguments) { + Module[name].overloadTable[numArguments] = value; + } else { + Module[name] = value; + Module[name].argCount = numArguments; + } + }; + + + + var wasmTableMirror = []; + + /** @type {WebAssembly.Table} */ + var wasmTable; + var getWasmTableEntry = (funcPtr) => { + var func = wasmTableMirror[funcPtr]; + if (!func) { + /** @suppress {checkTypes} */ + wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr); + } + /** @suppress {checkTypes} */ + assert(wasmTable.get(funcPtr) == func, 'JavaScript-side Wasm function table mirror is out of date!'); + return func; + }; + var embind__requireFunction = (signature, rawFunction, isAsync = false) => { + assert(!isAsync, 'Async bindings are only supported with JSPI.'); + + signature = AsciiToString(signature); + + function makeDynCaller() { + var rtn = getWasmTableEntry(rawFunction); + return rtn; + } + + var fp = makeDynCaller(); + if (typeof fp != 'function') { + throwBindingError(`unknown function pointer with signature ${signature}: ${rawFunction}`); + } + return fp; + }; + + + + class UnboundTypeError extends Error {} + + + + var getTypeName = (type) => { + var ptr = ___getTypeName(type); + var rv = AsciiToString(ptr); + _free(ptr); + return rv; + }; + var throwUnboundTypeError = (message, types) => { + var unboundTypes = []; + var seen = {}; + function visit(type) { + if (seen[type]) { + return; + } + if (registeredTypes[type]) { + return; + } + if (typeDependencies[type]) { + typeDependencies[type].forEach(visit); + return; + } + unboundTypes.push(type); + seen[type] = true; + } + types.forEach(visit); + + throw new UnboundTypeError(`${message}: ` + unboundTypes.map(getTypeName).join([', '])); + }; + + + + + var whenDependentTypesAreResolved = (myTypes, dependentTypes, getTypeConverters) => { + myTypes.forEach((type) => typeDependencies[type] = dependentTypes); + + function onComplete(typeConverters) { + var myTypeConverters = getTypeConverters(typeConverters); + if (myTypeConverters.length !== myTypes.length) { + throwInternalError('Mismatched type converter count'); + } + for (var i = 0; i < myTypes.length; ++i) { + registerType(myTypes[i], myTypeConverters[i]); + } + } + + var typeConverters = new Array(dependentTypes.length); + var unregisteredTypes = []; + var registered = 0; + dependentTypes.forEach((dt, i) => { + if (registeredTypes.hasOwnProperty(dt)) { + typeConverters[i] = registeredTypes[dt]; + } else { + unregisteredTypes.push(dt); + if (!awaitingDependencies.hasOwnProperty(dt)) { + awaitingDependencies[dt] = []; + } + awaitingDependencies[dt].push(() => { + typeConverters[i] = registeredTypes[dt]; + ++registered; + if (registered === unregisteredTypes.length) { + onComplete(typeConverters); + } + }); + } + }); + if (0 === unregisteredTypes.length) { + onComplete(typeConverters); + } + }; + + var getFunctionName = (signature) => { + signature = signature.trim(); + const argsIndex = signature.indexOf("("); + if (argsIndex === -1) return signature; + assert(signature.endsWith(")"), "Parentheses for argument names should match."); + return signature.slice(0, argsIndex); + }; + var __embind_register_function = (name, argCount, rawArgTypesAddr, signature, rawInvoker, fn, isAsync, isNonnullReturn) => { + var argTypes = heap32VectorToArray(argCount, rawArgTypesAddr); + name = AsciiToString(name); + name = getFunctionName(name); + + rawInvoker = embind__requireFunction(signature, rawInvoker, isAsync); + + exposePublicSymbol(name, function() { + throwUnboundTypeError(`Cannot call ${name} due to unbound types`, argTypes); + }, argCount - 1); + + whenDependentTypesAreResolved([], argTypes, (argTypes) => { + var invokerArgsArray = [argTypes[0] /* return value */, null /* no class 'this'*/].concat(argTypes.slice(1) /* actual params */); + replacePublicSymbol(name, craftInvokerFunction(name, invokerArgsArray, null /* no class 'this'*/, rawInvoker, fn, isAsync), argCount - 1); + return []; + }); + }; + + + + + + /** @suppress {globalThis} */ + var __embind_register_integer = (primitiveType, name, size, minRange, maxRange) => { + name = AsciiToString(name); + + const isUnsignedType = minRange === 0; + + let fromWireType = (value) => value; + if (isUnsignedType) { + var bitshift = 32 - 8*size; + fromWireType = (value) => (value << bitshift) >>> bitshift; + maxRange = fromWireType(maxRange); + } + + registerType(primitiveType, { + name, + fromWireType: fromWireType, + toWireType: (destructors, value) => { + if (typeof value != "number" && typeof value != "boolean") { + throw new TypeError(`Cannot convert "${embindRepr(value)}" to ${name}`); + } + assertIntegerRange(name, value, minRange, maxRange); + // The VM will perform JS to Wasm value conversion, according to the spec: + // https://www.w3.org/TR/wasm-js-api-1/#towebassemblyvalue + return value; + }, + readValueFromPointer: integerReadValueFromPointer(name, size, minRange !== 0), + destructorFunction: null, // This type does not need a destructor + }); + }; + + + var __embind_register_memory_view = (rawType, dataTypeIndex, name) => { + var typeMapping = [ + Int8Array, + Uint8Array, + Int16Array, + Uint16Array, + Int32Array, + Uint32Array, + Float32Array, + Float64Array, + BigInt64Array, + BigUint64Array, + ]; + + var TA = typeMapping[dataTypeIndex]; + + function decodeMemoryView(handle) { + var size = HEAPU32[((handle)>>2)]; + var data = HEAPU32[(((handle)+(4))>>2)]; + return new TA(HEAP8.buffer, data, size); + } + + name = AsciiToString(name); + registerType(rawType, { + name, + fromWireType: decodeMemoryView, + readValueFromPointer: decodeMemoryView, + }, { + ignoreDuplicateRegistrations: true, + }); + }; + + + + + + var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + assert(typeof str === 'string', `stringToUTF8Array expects a string (got ${typeof str})`); + // Parameter maxBytesToWrite is not optional. Negative values, 0, null, + // undefined and false each don't write out any bytes. + if (!(maxBytesToWrite > 0)) + return 0; + + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. + for (var i = 0; i < str.length; ++i) { + // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description + // and https://www.ietf.org/rfc/rfc2279.txt + // and https://tools.ietf.org/html/rfc3629 + var u = str.codePointAt(i); + if (u <= 0x7F) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 0x7FF) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 0xC0 | (u >> 6); + heap[outIdx++] = 0x80 | (u & 63); + } else if (u <= 0xFFFF) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 0xE0 | (u >> 12); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + if (u > 0x10FFFF) warnOnce('Invalid Unicode code point ' + ptrToString(u) + ' encountered when serializing a JS string to a UTF-8 string in wasm memory! (Valid unicode code points should be in range 0-0x10FFFF).'); + heap[outIdx++] = 0xF0 | (u >> 18); + heap[outIdx++] = 0x80 | ((u >> 12) & 63); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + // Gotcha: if codePoint is over 0xFFFF, it is represented as a surrogate pair in UTF-16. + // We need to manually skip over the second code unit for correct iteration. + i++; + } + } + // Null-terminate the pointer to the buffer. + heap[outIdx] = 0; + return outIdx - startIdx; + }; + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => { + assert(typeof maxBytesToWrite == 'number', 'stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + }; + + var lengthBytesUTF8 = (str) => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code + // unit, not a Unicode code point of the character! So decode + // UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var c = str.charCodeAt(i); // possibly a lead surrogate + if (c <= 0x7F) { + len++; + } else if (c <= 0x7FF) { + len += 2; + } else if (c >= 0xD800 && c <= 0xDFFF) { + len += 4; ++i; + } else { + len += 3; + } + } + return len; + }; + + + + var __embind_register_std_string = (rawType, name) => { + name = AsciiToString(name); + var stdStringIsUTF8 = true; + + registerType(rawType, { + name, + // For some method names we use string keys here since they are part of + // the public/external API and/or used by the runtime-generated code. + fromWireType(value) { + var length = HEAPU32[((value)>>2)]; + var payload = value + 4; + + var str; + if (stdStringIsUTF8) { + str = UTF8ToString(payload, length, true); + } else { + str = ''; + for (var i = 0; i < length; ++i) { + str += String.fromCharCode(HEAPU8[payload + i]); + } + } + + _free(value); + + return str; + }, + toWireType(destructors, value) { + if (value instanceof ArrayBuffer) { + value = new Uint8Array(value); + } + + var length; + var valueIsOfTypeString = (typeof value == 'string'); + + // We accept `string` or array views with single byte elements + if (!(valueIsOfTypeString || (ArrayBuffer.isView(value) && value.BYTES_PER_ELEMENT == 1))) { + throwBindingError('Cannot pass non-string to std::string'); + } + if (stdStringIsUTF8 && valueIsOfTypeString) { + length = lengthBytesUTF8(value); + } else { + length = value.length; + } + + // assumes POINTER_SIZE alignment + var base = _malloc(4 + length + 1); + var ptr = base + 4; + HEAPU32[((base)>>2)] = length; + if (valueIsOfTypeString) { + if (stdStringIsUTF8) { + stringToUTF8(value, ptr, length + 1); + } else { + for (var i = 0; i < length; ++i) { + var charCode = value.charCodeAt(i); + if (charCode > 255) { + _free(base); + throwBindingError('String has UTF-16 code units that do not fit in 8 bits'); + } + HEAPU8[ptr + i] = charCode; + } + } + } else { + HEAPU8.set(value, ptr); + } + + if (destructors !== null) { + destructors.push(_free, base); + } + return base; + }, + readValueFromPointer: readPointer, + destructorFunction(ptr) { + _free(ptr); + }, + }); + }; + + + + + var UTF16Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf-16le') : undefined;; + + var UTF16ToString = (ptr, maxBytesToRead, ignoreNul) => { + assert(ptr % 2 == 0, 'Pointer passed to UTF16ToString must be aligned to two bytes!'); + var idx = ((ptr)>>1); + var endIdx = findStringEnd(HEAPU16, idx, maxBytesToRead / 2, ignoreNul); + + // When using conditional TextDecoder, skip it for short strings as the overhead of the native call is not worth it. + if (endIdx - idx > 16 && UTF16Decoder) + return UTF16Decoder.decode(HEAPU16.subarray(idx, endIdx)); + + // Fallback: decode without UTF16Decoder + var str = ''; + + // If maxBytesToRead is not passed explicitly, it will be undefined, and the + // for-loop's condition will always evaluate to true. The loop is then + // terminated on the first null char. + for ( + var i = idx; + // If building with TextDecoder, we have already computed the string length + // above, so test loop end condition against that + i < endIdx; + ++i + ) { + var codeUnit = HEAPU16[i]; + // fromCharCode constructs a character from a UTF-16 code unit, so we can + // pass the UTF16 string right through. + str += String.fromCharCode(codeUnit); + } + + return str; + }; + + var stringToUTF16 = (str, outPtr, maxBytesToWrite) => { + assert(outPtr % 2 == 0, 'Pointer passed to stringToUTF16 must be aligned to two bytes!'); + assert(typeof maxBytesToWrite == 'number', 'stringToUTF16(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. + maxBytesToWrite ??= 0x7FFFFFFF; + if (maxBytesToWrite < 2) return 0; + maxBytesToWrite -= 2; // Null terminator. + var startPtr = outPtr; + var numCharsToWrite = (maxBytesToWrite < str.length*2) ? (maxBytesToWrite / 2) : str.length; + for (var i = 0; i < numCharsToWrite; ++i) { + // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP. + var codeUnit = str.charCodeAt(i); // possibly a lead surrogate + HEAP16[((outPtr)>>1)] = codeUnit; + outPtr += 2; + } + // Null-terminate the pointer to the HEAP. + HEAP16[((outPtr)>>1)] = 0; + return outPtr - startPtr; + }; + + var lengthBytesUTF16 = (str) => str.length*2; + + var UTF32ToString = (ptr, maxBytesToRead, ignoreNul) => { + assert(ptr % 4 == 0, 'Pointer passed to UTF32ToString must be aligned to four bytes!'); + var str = ''; + var startIdx = ((ptr)>>2); + // If maxBytesToRead is not passed explicitly, it will be undefined, and this + // will always evaluate to true. This saves on code size. + for (var i = 0; !(i >= maxBytesToRead / 4); i++) { + var utf32 = HEAPU32[startIdx + i]; + if (!utf32 && !ignoreNul) break; + str += String.fromCodePoint(utf32); + } + return str; + }; + + var stringToUTF32 = (str, outPtr, maxBytesToWrite) => { + assert(outPtr % 4 == 0, 'Pointer passed to stringToUTF32 must be aligned to four bytes!'); + assert(typeof maxBytesToWrite == 'number', 'stringToUTF32(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. + maxBytesToWrite ??= 0x7FFFFFFF; + if (maxBytesToWrite < 4) return 0; + var startPtr = outPtr; + var endPtr = startPtr + maxBytesToWrite - 4; + for (var i = 0; i < str.length; ++i) { + var codePoint = str.codePointAt(i); + // Gotcha: if codePoint is over 0xFFFF, it is represented as a surrogate pair in UTF-16. + // We need to manually skip over the second code unit for correct iteration. + if (codePoint > 0xFFFF) { + i++; + } + HEAP32[((outPtr)>>2)] = codePoint; + outPtr += 4; + if (outPtr + 4 > endPtr) break; + } + // Null-terminate the pointer to the HEAP. + HEAP32[((outPtr)>>2)] = 0; + return outPtr - startPtr; + }; + + var lengthBytesUTF32 = (str) => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var codePoint = str.codePointAt(i); + // Gotcha: if codePoint is over 0xFFFF, it is represented as a surrogate pair in UTF-16. + // We need to manually skip over the second code unit for correct iteration. + if (codePoint > 0xFFFF) { + i++; + } + len += 4; + } + + return len; + }; + var __embind_register_std_wstring = (rawType, charSize, name) => { + name = AsciiToString(name); + var decodeString, encodeString, lengthBytesUTF; + if (charSize === 2) { + decodeString = UTF16ToString; + encodeString = stringToUTF16; + lengthBytesUTF = lengthBytesUTF16; + } else { + assert(charSize === 4, 'only 2-byte and 4-byte strings are currently supported'); + decodeString = UTF32ToString; + encodeString = stringToUTF32; + lengthBytesUTF = lengthBytesUTF32; + } + registerType(rawType, { + name, + fromWireType: (value) => { + // Code mostly taken from _embind_register_std_string fromWireType + var length = HEAPU32[((value)>>2)]; + var str = decodeString(value + 4, length * charSize, true); + + _free(value); + + return str; + }, + toWireType: (destructors, value) => { + if (!(typeof value == 'string')) { + throwBindingError(`Cannot pass non-string to C++ string type ${name}`); + } + + // assumes POINTER_SIZE alignment + var length = lengthBytesUTF(value); + var ptr = _malloc(4 + length + charSize); + HEAPU32[((ptr)>>2)] = length / charSize; + + encodeString(value, ptr + 4, length + charSize); + + if (destructors !== null) { + destructors.push(_free, ptr); + } + return ptr; + }, + readValueFromPointer: readPointer, + destructorFunction(ptr) { + _free(ptr); + } + }); + }; + + + var __embind_register_void = (rawType, name) => { + name = AsciiToString(name); + registerType(rawType, { + isVoid: true, // void return values can be optimized out sometimes + name, + fromWireType: () => undefined, + // TODO: assert if anything else is given? + toWireType: (destructors, o) => undefined, + }); + }; + + var emval_methodCallers = []; + var emval_addMethodCaller = (caller) => { + var id = emval_methodCallers.length; + emval_methodCallers.push(caller); + return id; + }; + + + + var requireRegisteredType = (rawType, humanName) => { + var impl = registeredTypes[rawType]; + if (undefined === impl) { + throwBindingError(`${humanName} has unknown type ${getTypeName(rawType)}`); + } + return impl; + }; + var emval_lookupTypes = (argCount, argTypes) => { + var a = new Array(argCount); + for (var i = 0; i < argCount; ++i) { + a[i] = requireRegisteredType(HEAPU32[(((argTypes)+(i*4))>>2)], + `parameter ${i}`); + } + return a; + }; + + + var emval_returnValue = (toReturnWire, destructorsRef, handle) => { + var destructors = []; + var result = toReturnWire(destructors, handle); + if (destructors.length) { + // void, primitives and any other types w/o destructors don't need to allocate a handle + HEAPU32[((destructorsRef)>>2)] = Emval.toHandle(destructors); + } + return result; + }; + + + var emval_symbols = { + }; + + var getStringOrSymbol = (address) => { + var symbol = emval_symbols[address]; + if (symbol === undefined) { + return AsciiToString(address); + } + return symbol; + }; + var __emval_create_invoker = (argCount, argTypesPtr, kind) => { + var GenericWireTypeSize = 8; + + var [retType, ...argTypes] = emval_lookupTypes(argCount, argTypesPtr); + var toReturnWire = retType.toWireType.bind(retType); + var argFromPtr = argTypes.map(type => type.readValueFromPointer.bind(type)); + argCount--; // remove the extracted return type + + var captures = {'toValue': Emval.toValue}; + var args = argFromPtr.map((argFromPtr, i) => { + var captureName = `argFromPtr${i}`; + captures[captureName] = argFromPtr; + return `${captureName}(args${i ? '+' + i * GenericWireTypeSize : ''})`; + }); + var functionBody; + switch (kind){ + case 0: + functionBody = 'toValue(handle)'; + break; + case 2: + functionBody = 'new (toValue(handle))'; + break; + case 3: + functionBody = ''; + break; + case 1: + captures['getStringOrSymbol'] = getStringOrSymbol; + functionBody = 'toValue(handle)[getStringOrSymbol(methodName)]'; + break; + } + functionBody += `(${args})`; + if (!retType.isVoid) { + captures['toReturnWire'] = toReturnWire; + captures['emval_returnValue'] = emval_returnValue; + functionBody = `return emval_returnValue(toReturnWire, destructorsRef, ${functionBody})`; + } + functionBody = `return function (handle, methodName, destructorsRef, args) { + ${functionBody} + }`; + + var invokerFunction = new Function(Object.keys(captures), functionBody)(...Object.values(captures)); + var functionName = `methodCaller<(${argTypes.map(t => t.name)}) => ${retType.name}>`; + return emval_addMethodCaller(createNamedFunction(functionName, invokerFunction)); + }; + + + var __emval_get_property = (handle, key) => { + handle = Emval.toValue(handle); + key = Emval.toValue(key); + return Emval.toHandle(handle[key]); + }; + + var __emval_incref = (handle) => { + if (handle > 9) { + emval_handles[handle + 1] += 1; + } + }; + + + + var __emval_invoke = (caller, handle, methodName, destructorsRef, args) => { + return emval_methodCallers[caller](handle, methodName, destructorsRef, args); + }; + + var __emval_new_array_from_memory_view = (view) => { + view = Emval.toValue(view); + // using for..loop is faster than Array.from + var a = new Array(view.length); + for (var i = 0; i < view.length; i++) a[i] = view[i]; + return Emval.toHandle(a); + }; + + + + var __emval_run_destructors = (handle) => { + var destructors = Emval.toValue(handle); + runDestructors(destructors); + __emval_decref(handle); + }; + + + var __tzset_js = (timezone, daylight, std_name, dst_name) => { + // TODO: Use (malleable) environment variables instead of system settings. + var currentYear = new Date().getFullYear(); + var winter = new Date(currentYear, 0, 1); + var summer = new Date(currentYear, 6, 1); + var winterOffset = winter.getTimezoneOffset(); + var summerOffset = summer.getTimezoneOffset(); + + // Local standard timezone offset. Local standard time is not adjusted for + // daylight savings. This code uses the fact that getTimezoneOffset returns + // a greater value during Standard Time versus Daylight Saving Time (DST). + // Thus it determines the expected output during Standard Time, and it + // compares whether the output of the given date the same (Standard) or less + // (DST). + var stdTimezoneOffset = Math.max(winterOffset, summerOffset); + + // timezone is specified as seconds west of UTC ("The external variable + // `timezone` shall be set to the difference, in seconds, between + // Coordinated Universal Time (UTC) and local standard time."), the same + // as returned by stdTimezoneOffset. + // See http://pubs.opengroup.org/onlinepubs/009695399/functions/tzset.html + HEAPU32[((timezone)>>2)] = stdTimezoneOffset * 60; + + HEAP32[((daylight)>>2)] = Number(winterOffset != summerOffset); + + var extractZone = (timezoneOffset) => { + // Why inverse sign? + // Read here https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset + var sign = timezoneOffset >= 0 ? "-" : "+"; + + var absOffset = Math.abs(timezoneOffset) + var hours = String(Math.floor(absOffset / 60)).padStart(2, "0"); + var minutes = String(absOffset % 60).padStart(2, "0"); + + return `UTC${sign}${hours}${minutes}`; + } + + var winterName = extractZone(winterOffset); + var summerName = extractZone(summerOffset); + assert(winterName); + assert(summerName); + assert(lengthBytesUTF8(winterName) <= 16, `timezone name truncated to fit in TZNAME_MAX (${winterName})`); + assert(lengthBytesUTF8(summerName) <= 16, `timezone name truncated to fit in TZNAME_MAX (${summerName})`); + if (summerOffset < winterOffset) { + // Northern hemisphere + stringToUTF8(winterName, std_name, 17); + stringToUTF8(summerName, dst_name, 17); + } else { + stringToUTF8(winterName, dst_name, 17); + stringToUTF8(summerName, std_name, 17); + } + }; + + var abortOnCannotGrowMemory = (requestedSize) => { + abort(`Cannot enlarge memory arrays to size ${requestedSize} bytes (OOM). Either (1) compile with -sINITIAL_MEMORY=X with X higher than the current value ${HEAP8.length}, (2) compile with -sALLOW_MEMORY_GROWTH which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -sABORTING_MALLOC=0`); + }; + var _emscripten_resize_heap = (requestedSize) => { + var oldSize = HEAPU8.length; + // With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned. + requestedSize >>>= 0; + abortOnCannotGrowMemory(requestedSize); + }; + + var ENV = { + }; + + var getExecutableName = () => thisProgram || './this.program'; + var getEnvStrings = () => { + if (!getEnvStrings.strings) { + // Default values. + // Browser language detection #8751 + var lang = ((typeof navigator == 'object' && navigator.language) || 'C').replace('-', '_') + '.UTF-8'; + var env = { + 'USER': 'web_user', + 'LOGNAME': 'web_user', + 'PATH': '/', + 'PWD': '/', + 'HOME': '/home/web_user', + 'LANG': lang, + '_': getExecutableName() + }; + // Apply the user-provided values, if any. + for (var x in ENV) { + // x is a key in ENV; if ENV[x] is undefined, that means it was + // explicitly set to be so. We allow user code to do that to + // force variables with default values to remain unset. + if (ENV[x] === undefined) delete env[x]; + else env[x] = ENV[x]; + } + var strings = []; + for (var x in env) { + strings.push(`${x}=${env[x]}`); + } + getEnvStrings.strings = strings; + } + return getEnvStrings.strings; + }; + + var _environ_get = (__environ, environ_buf) => { + var bufSize = 0; + var envp = 0; + for (var string of getEnvStrings()) { + var ptr = environ_buf + bufSize; + HEAPU32[(((__environ)+(envp))>>2)] = ptr; + bufSize += stringToUTF8(string, ptr, Infinity) + 1; + envp += 4; + } + return 0; + }; + + + var _environ_sizes_get = (penviron_count, penviron_buf_size) => { + var strings = getEnvStrings(); + HEAPU32[((penviron_count)>>2)] = strings.length; + var bufSize = 0; + for (var string of strings) { + bufSize += lengthBytesUTF8(string) + 1; + } + HEAPU32[((penviron_buf_size)>>2)] = bufSize; + return 0; + }; + + var PATH = { + isAbs:(path) => path.charAt(0) === '/', + splitPath:(filename) => { + var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; + return splitPathRe.exec(filename).slice(1); + }, + normalizeArray:(parts, allowAboveRoot) => { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up; up--) { + parts.unshift('..'); + } + } + return parts; + }, + normalize:(path) => { + var isAbsolute = PATH.isAbs(path), + trailingSlash = path.slice(-1) === '/'; + // Normalize the path + path = PATH.normalizeArray(path.split('/').filter((p) => !!p), !isAbsolute).join('/'); + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + return (isAbsolute ? '/' : '') + path; + }, + dirname:(path) => { + var result = PATH.splitPath(path), + root = result[0], + dir = result[1]; + if (!root && !dir) { + // No dirname whatsoever + return '.'; + } + if (dir) { + // It has a dirname, strip trailing slash + dir = dir.slice(0, -1); + } + return root + dir; + }, + basename:(path) => path && path.match(/([^\/]+|\/)\/*$/)[1], + join:(...paths) => PATH.normalize(paths.join('/')), + join2:(l, r) => PATH.normalize(l + '/' + r), + }; + + var initRandomFill = () => { + + return (view) => crypto.getRandomValues(view); + }; + var randomFill = (view) => { + // Lazily init on the first invocation. + (randomFill = initRandomFill())(view); + }; + + + + var PATH_FS = { + resolve:(...args) => { + var resolvedPath = '', + resolvedAbsolute = false; + for (var i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? args[i] : FS.cwd(); + // Skip empty and invalid entries + if (typeof path != 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + return ''; // an invalid portion invalidates the whole thing + } + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = PATH.isAbs(path); + } + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter((p) => !!p), !resolvedAbsolute).join('/'); + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; + }, + relative:(from, to) => { + from = PATH_FS.resolve(from).slice(1); + to = PATH_FS.resolve(to).slice(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }, + }; + + + + var FS_stdin_getChar_buffer = []; + + + /** @type {function(string, boolean=, number=)} */ + var intArrayFromString = (stringy, dontAddNull, length) => { + var len = length > 0 ? length : lengthBytesUTF8(stringy)+1; + var u8array = new Array(len); + var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); + if (dontAddNull) u8array.length = numBytesWritten; + return u8array; + }; + var FS_stdin_getChar = () => { + if (!FS_stdin_getChar_buffer.length) { + var result = null; + if (typeof window != 'undefined' && + typeof window.prompt == 'function') { + // Browser. + result = window.prompt('Input: '); // returns null on cancel + if (result !== null) { + result += '\n'; + } + } else + {} + if (!result) { + return null; + } + FS_stdin_getChar_buffer = intArrayFromString(result, true); + } + return FS_stdin_getChar_buffer.shift(); + }; + var TTY = { + ttys:[], + init() { + // https://github.com/emscripten-core/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // currently, FS.init does not distinguish if process.stdin is a file or TTY + // // device, it always assumes it's a TTY device. because of this, we're forcing + // // process.stdin to UTF8 encoding to at least make stdin reading compatible + // // with text files until FS.init can be refactored. + // process.stdin.setEncoding('utf8'); + // } + }, + shutdown() { + // https://github.com/emscripten-core/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)? + // // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation + // // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists? + // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle + // // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call + // process.stdin.pause(); + // } + }, + register(dev, ops) { + TTY.ttys[dev] = { input: [], output: [], ops: ops }; + FS.registerDevice(dev, TTY.stream_ops); + }, + stream_ops:{ + open(stream) { + var tty = TTY.ttys[stream.node.rdev]; + if (!tty) { + throw new FS.ErrnoError(43); + } + stream.tty = tty; + stream.seekable = false; + }, + close(stream) { + // flush any pending line data + stream.tty.ops.fsync(stream.tty); + }, + fsync(stream) { + stream.tty.ops.fsync(stream.tty); + }, + read(stream, buffer, offset, length, pos /* ignored */) { + if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset+i] = result; + } + if (bytesRead) { + stream.node.atime = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset+i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.mtime = stream.node.ctime = Date.now(); + } + return i; + }, + }, + default_tty_ops:{ + get_char(tty) { + return FS_stdin_getChar(); + }, + put_char(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); // val == 0 would cut text output off in the middle. + } + }, + fsync(tty) { + if (tty.output?.length > 0) { + out(UTF8ArrayToString(tty.output)); + tty.output = []; + } + }, + ioctl_tcgets(tty) { + // typical setting + return { + c_iflag: 25856, + c_oflag: 5, + c_cflag: 191, + c_lflag: 35387, + c_cc: [ + 0x03, 0x1c, 0x7f, 0x15, 0x04, 0x00, 0x01, 0x00, 0x11, 0x13, 0x1a, 0x00, + 0x12, 0x0f, 0x17, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + ] + }; + }, + ioctl_tcsets(tty, optional_actions, data) { + // currently just ignore + return 0; + }, + ioctl_tiocgwinsz(tty) { + return [24, 80]; + }, + }, + default_tty1_ops:{ + put_char(tty, val) { + if (val === null || val === 10) { + err(UTF8ArrayToString(tty.output)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output?.length > 0) { + err(UTF8ArrayToString(tty.output)); + tty.output = []; + } + }, + }, + }; + + + var mmapAlloc = (size) => { + abort('internal error: mmapAlloc called but `emscripten_builtin_memalign` native symbol not exported'); + }; + var MEMFS = { + ops_table:null, + mount(mount) { + return MEMFS.createNode(null, '/', 16895, 0); + }, + createNode(parent, name, mode, dev) { + if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { + // no supported + throw new FS.ErrnoError(63); + } + MEMFS.ops_table ||= { + dir: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + lookup: MEMFS.node_ops.lookup, + mknod: MEMFS.node_ops.mknod, + rename: MEMFS.node_ops.rename, + unlink: MEMFS.node_ops.unlink, + rmdir: MEMFS.node_ops.rmdir, + readdir: MEMFS.node_ops.readdir, + symlink: MEMFS.node_ops.symlink + }, + stream: { + llseek: MEMFS.stream_ops.llseek + } + }, + file: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: { + llseek: MEMFS.stream_ops.llseek, + read: MEMFS.stream_ops.read, + write: MEMFS.stream_ops.write, + mmap: MEMFS.stream_ops.mmap, + msync: MEMFS.stream_ops.msync + } + }, + link: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + readlink: MEMFS.node_ops.readlink + }, + stream: {} + }, + chrdev: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: FS.chrdev_stream_ops + } + }; + var node = FS.createNode(parent, name, mode, dev); + if (FS.isDir(node.mode)) { + node.node_ops = MEMFS.ops_table.dir.node; + node.stream_ops = MEMFS.ops_table.dir.stream; + node.contents = {}; + } else if (FS.isFile(node.mode)) { + node.node_ops = MEMFS.ops_table.file.node; + node.stream_ops = MEMFS.ops_table.file.stream; + node.usedBytes = 0; // The actual number of bytes used in the typed array, as opposed to contents.length which gives the whole capacity. + // When the byte data of the file is populated, this will point to either a typed array, or a normal JS array. Typed arrays are preferred + // for performance, and used by default. However, typed arrays are not resizable like normal JS arrays are, so there is a small disk size + // penalty involved for appending file writes that continuously grow a file similar to std::vector capacity vs used -scheme. + node.contents = null; + } else if (FS.isLink(node.mode)) { + node.node_ops = MEMFS.ops_table.link.node; + node.stream_ops = MEMFS.ops_table.link.stream; + } else if (FS.isChrdev(node.mode)) { + node.node_ops = MEMFS.ops_table.chrdev.node; + node.stream_ops = MEMFS.ops_table.chrdev.stream; + } + node.atime = node.mtime = node.ctime = Date.now(); + // add the new node to the parent + if (parent) { + parent.contents[name] = node; + parent.atime = parent.mtime = parent.ctime = node.atime; + } + return node; + }, + getFileDataAsTypedArray(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); // Make sure to not return excess unused bytes. + return new Uint8Array(node.contents); + }, + expandFileStorage(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; // No need to expand, the storage was already large enough. + // Don't expand strictly to the given requested limit if it's only a very small increase, but instead geometrically grow capacity. + // For small filesizes (<1MB), perform size*2 geometric increase, but for large sizes, do a much more conservative size*1.125 increase to + // avoid overshooting the allocation cap by a very large margin. + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2.0 : 1.125)) >>> 0); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); // At minimum allocate 256b for each file when expanding. + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); // Allocate new storage. + if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); // Copy old data over to the new storage. + }, + resizeFileStorage(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; // Fully decommit when requesting a resize to zero. + node.usedBytes = 0; + } else { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); // Allocate new storage. + if (oldContents) { + node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))); // Copy old data over to the new storage. + } + node.usedBytes = newSize; + } + }, + node_ops:{ + getattr(node) { + var attr = {}; + // device numbers reuse inode numbers. + attr.dev = FS.isChrdev(node.mode) ? node.id : 1; + attr.ino = node.id; + attr.mode = node.mode; + attr.nlink = 1; + attr.uid = 0; + attr.gid = 0; + attr.rdev = node.rdev; + if (FS.isDir(node.mode)) { + attr.size = 4096; + } else if (FS.isFile(node.mode)) { + attr.size = node.usedBytes; + } else if (FS.isLink(node.mode)) { + attr.size = node.link.length; + } else { + attr.size = 0; + } + attr.atime = new Date(node.atime); + attr.mtime = new Date(node.mtime); + attr.ctime = new Date(node.ctime); + // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize), + // but this is not required by the standard. + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + }, + setattr(node, attr) { + for (const key of ["mode", "atime", "mtime", "ctime"]) { + if (attr[key] != null) { + node[key] = attr[key]; + } + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + }, + lookup(parent, name) { + throw new FS.ErrnoError(44); + }, + mknod(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + }, + rename(old_node, new_dir, new_name) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) {} + if (new_node) { + if (FS.isDir(old_node.mode)) { + // if we're overwriting a directory at new_name, make sure it's empty. + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + FS.hashRemoveNode(new_node); + } + // do the internal rewiring + delete old_node.parent.contents[old_node.name]; + new_dir.contents[new_name] = old_node; + old_node.name = new_name; + new_dir.ctime = new_dir.mtime = old_node.parent.ctime = old_node.parent.mtime = Date.now(); + }, + unlink(parent, name) { + delete parent.contents[name]; + parent.ctime = parent.mtime = Date.now(); + }, + rmdir(parent, name) { + var node = FS.lookupNode(parent, name); + for (var i in node.contents) { + throw new FS.ErrnoError(55); + } + delete parent.contents[name]; + parent.ctime = parent.mtime = Date.now(); + }, + readdir(node) { + return ['.', '..', ...Object.keys(node.contents)]; + }, + symlink(parent, newname, oldpath) { + var node = MEMFS.createNode(parent, newname, 0o777 | 40960, 0); + node.link = oldpath; + return node; + }, + readlink(node) { + if (!FS.isLink(node.mode)) { + throw new FS.ErrnoError(28); + } + return node.link; + }, + }, + stream_ops:{ + read(stream, buffer, offset, length, position) { + var contents = stream.node.contents; + if (position >= stream.node.usedBytes) return 0; + var size = Math.min(stream.node.usedBytes - position, length); + assert(size >= 0); + if (size > 8 && contents.subarray) { // non-trivial, and typed array + buffer.set(contents.subarray(position, position + size), offset); + } else { + for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; + } + return size; + }, + write(stream, buffer, offset, length, position, canOwn) { + // The data buffer should be a typed array view + assert(!(buffer instanceof ArrayBuffer)); + + if (!length) return 0; + var node = stream.node; + node.mtime = node.ctime = Date.now(); + + if (buffer.subarray && (!node.contents || node.contents.subarray)) { // This write is from a typed array to a typed array? + if (canOwn) { + assert(position === 0, 'canOwn must imply no weird position inside the file'); + node.contents = buffer.subarray(offset, offset + length); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { // If this is a simple first write to an empty file, do a fast set since we don't need to care about old data. + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { // Writing to an already allocated and used subrange of the file? + node.contents.set(buffer.subarray(offset, offset + length), position); + return length; + } + } + + // Appending to an existing file and we need to reallocate, or source data did not come as a typed array. + MEMFS.expandFileStorage(node, position+length); + if (node.contents.subarray && buffer.subarray) { + // Use typed array write which is available. + node.contents.set(buffer.subarray(offset, offset + length), position); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; // Or fall back to manual write if not. + } + } + node.usedBytes = Math.max(node.usedBytes, position + length); + return length; + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + position += stream.node.usedBytes; + } + } + if (position < 0) { + throw new FS.ErrnoError(28); + } + return position; + }, + mmap(stream, length, position, prot, flags) { + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + var ptr; + var allocated; + var contents = stream.node.contents; + // Only make a new copy when MAP_PRIVATE is specified. + if (!(flags & 2) && contents && contents.buffer === HEAP8.buffer) { + // We can't emulate MAP_SHARED when the file is not backed by the + // buffer we're mapping to (e.g. the HEAP buffer). + allocated = false; + ptr = contents.byteOffset; + } else { + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + if (contents) { + // Try to avoid unnecessary slices. + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray(position, position + length); + } else { + contents = Array.prototype.slice.call(contents, position, position + length); + } + } + HEAP8.set(contents, ptr); + } + } + return { ptr, allocated }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); + // should we check if bytesWritten and length are the same? + return 0; + }, + }, + }; + + var asyncLoad = async (url) => { + var arrayBuffer = await readAsync(url); + assert(arrayBuffer, `Loading data file "${url}" failed (no arrayBuffer).`); + return new Uint8Array(arrayBuffer); + }; + + + var FS_createDataFile = (...args) => FS.createDataFile(...args); + + var getUniqueRunDependency = (id) => { + var orig = id; + while (1) { + if (!runDependencyTracking[id]) return id; + id = orig + Math.random(); + } + }; + + var preloadPlugins = []; + var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { + // Ensure plugins are ready. + if (typeof Browser != 'undefined') Browser.init(); + + var handled = false; + preloadPlugins.forEach((plugin) => { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, onerror); + handled = true; + } + }); + return handled; + }; + var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => { + // TODO we should allow people to just pass in a complete filename instead + // of parent and name being that we just join them anyways + var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; + var dep = getUniqueRunDependency(`cp ${fullname}`); // might have several active requests for the same fullname + function processData(byteArray) { + function finish(byteArray) { + preFinish?.(); + if (!dontCreateFile) { + FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); + } + onload?.(); + removeRunDependency(dep); + } + if (FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { + onerror?.(); + removeRunDependency(dep); + })) { + return; + } + finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + asyncLoad(url).then(processData, onerror); + } else { + processData(url); + } + }; + + var FS_modeStringToFlags = (str) => { + var flagModes = { + 'r': 0, + 'r+': 2, + 'w': 512 | 64 | 1, + 'w+': 512 | 64 | 2, + 'a': 1024 | 64 | 1, + 'a+': 1024 | 64 | 2, + }; + var flags = flagModes[str]; + if (typeof flags == 'undefined') { + throw new Error(`Unknown file open mode: ${str}`); + } + return flags; + }; + + var FS_getMode = (canRead, canWrite) => { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + }; + + + + + var strError = (errno) => UTF8ToString(_strerror(errno)); + + var ERRNO_CODES = { + 'EPERM': 63, + 'ENOENT': 44, + 'ESRCH': 71, + 'EINTR': 27, + 'EIO': 29, + 'ENXIO': 60, + 'E2BIG': 1, + 'ENOEXEC': 45, + 'EBADF': 8, + 'ECHILD': 12, + 'EAGAIN': 6, + 'EWOULDBLOCK': 6, + 'ENOMEM': 48, + 'EACCES': 2, + 'EFAULT': 21, + 'ENOTBLK': 105, + 'EBUSY': 10, + 'EEXIST': 20, + 'EXDEV': 75, + 'ENODEV': 43, + 'ENOTDIR': 54, + 'EISDIR': 31, + 'EINVAL': 28, + 'ENFILE': 41, + 'EMFILE': 33, + 'ENOTTY': 59, + 'ETXTBSY': 74, + 'EFBIG': 22, + 'ENOSPC': 51, + 'ESPIPE': 70, + 'EROFS': 69, + 'EMLINK': 34, + 'EPIPE': 64, + 'EDOM': 18, + 'ERANGE': 68, + 'ENOMSG': 49, + 'EIDRM': 24, + 'ECHRNG': 106, + 'EL2NSYNC': 156, + 'EL3HLT': 107, + 'EL3RST': 108, + 'ELNRNG': 109, + 'EUNATCH': 110, + 'ENOCSI': 111, + 'EL2HLT': 112, + 'EDEADLK': 16, + 'ENOLCK': 46, + 'EBADE': 113, + 'EBADR': 114, + 'EXFULL': 115, + 'ENOANO': 104, + 'EBADRQC': 103, + 'EBADSLT': 102, + 'EDEADLOCK': 16, + 'EBFONT': 101, + 'ENOSTR': 100, + 'ENODATA': 116, + 'ETIME': 117, + 'ENOSR': 118, + 'ENONET': 119, + 'ENOPKG': 120, + 'EREMOTE': 121, + 'ENOLINK': 47, + 'EADV': 122, + 'ESRMNT': 123, + 'ECOMM': 124, + 'EPROTO': 65, + 'EMULTIHOP': 36, + 'EDOTDOT': 125, + 'EBADMSG': 9, + 'ENOTUNIQ': 126, + 'EBADFD': 127, + 'EREMCHG': 128, + 'ELIBACC': 129, + 'ELIBBAD': 130, + 'ELIBSCN': 131, + 'ELIBMAX': 132, + 'ELIBEXEC': 133, + 'ENOSYS': 52, + 'ENOTEMPTY': 55, + 'ENAMETOOLONG': 37, + 'ELOOP': 32, + 'EOPNOTSUPP': 138, + 'EPFNOSUPPORT': 139, + 'ECONNRESET': 15, + 'ENOBUFS': 42, + 'EAFNOSUPPORT': 5, + 'EPROTOTYPE': 67, + 'ENOTSOCK': 57, + 'ENOPROTOOPT': 50, + 'ESHUTDOWN': 140, + 'ECONNREFUSED': 14, + 'EADDRINUSE': 3, + 'ECONNABORTED': 13, + 'ENETUNREACH': 40, + 'ENETDOWN': 38, + 'ETIMEDOUT': 73, + 'EHOSTDOWN': 142, + 'EHOSTUNREACH': 23, + 'EINPROGRESS': 26, + 'EALREADY': 7, + 'EDESTADDRREQ': 17, + 'EMSGSIZE': 35, + 'EPROTONOSUPPORT': 66, + 'ESOCKTNOSUPPORT': 137, + 'EADDRNOTAVAIL': 4, + 'ENETRESET': 39, + 'EISCONN': 30, + 'ENOTCONN': 53, + 'ETOOMANYREFS': 141, + 'EUSERS': 136, + 'EDQUOT': 19, + 'ESTALE': 72, + 'ENOTSUP': 138, + 'ENOMEDIUM': 148, + 'EILSEQ': 25, + 'EOVERFLOW': 61, + 'ECANCELED': 11, + 'ENOTRECOVERABLE': 56, + 'EOWNERDEAD': 62, + 'ESTRPIPE': 135, + }; + var FS = { + root:null, + mounts:[], + devices:{ + }, + streams:[], + nextInode:1, + nameTable:null, + currentPath:"/", + initialized:false, + ignorePermissions:true, + filesystems:null, + syncFSRequests:0, + readFiles:{ + }, + ErrnoError:class extends Error { + name = 'ErrnoError'; + // We set the `name` property to be able to identify `FS.ErrnoError` + // - the `name` is a standard ECMA-262 property of error objects. Kind of good to have it anyway. + // - when using PROXYFS, an error can come from an underlying FS + // as different FS objects have their own FS.ErrnoError each, + // the test `err instanceof FS.ErrnoError` won't detect an error coming from another filesystem, causing bugs. + // we'll use the reliable test `err.name == "ErrnoError"` instead + constructor(errno) { + super(runtimeInitialized ? strError(errno) : ''); + this.errno = errno; + for (var key in ERRNO_CODES) { + if (ERRNO_CODES[key] === errno) { + this.code = key; + break; + } + } + } + }, + FSStream:class { + shared = {}; + get object() { + return this.node; + } + set object(val) { + this.node = val; + } + get isRead() { + return (this.flags & 2097155) !== 1; + } + get isWrite() { + return (this.flags & 2097155) !== 0; + } + get isAppend() { + return (this.flags & 1024); + } + get flags() { + return this.shared.flags; + } + set flags(val) { + this.shared.flags = val; + } + get position() { + return this.shared.position; + } + set position(val) { + this.shared.position = val; + } + }, + FSNode:class { + node_ops = {}; + stream_ops = {}; + readMode = 292 | 73; + writeMode = 146; + mounted = null; + constructor(parent, name, mode, rdev) { + if (!parent) { + parent = this; // root node sets parent to itself + } + this.parent = parent; + this.mount = parent.mount; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.rdev = rdev; + this.atime = this.mtime = this.ctime = Date.now(); + } + get read() { + return (this.mode & this.readMode) === this.readMode; + } + set read(val) { + val ? this.mode |= this.readMode : this.mode &= ~this.readMode; + } + get write() { + return (this.mode & this.writeMode) === this.writeMode; + } + set write(val) { + val ? this.mode |= this.writeMode : this.mode &= ~this.writeMode; + } + get isFolder() { + return FS.isDir(this.mode); + } + get isDevice() { + return FS.isChrdev(this.mode); + } + }, + lookupPath(path, opts = {}) { + if (!path) { + throw new FS.ErrnoError(44); + } + opts.follow_mount ??= true + + if (!PATH.isAbs(path)) { + path = FS.cwd() + '/' + path; + } + + // limit max consecutive symlinks to 40 (SYMLOOP_MAX). + linkloop: for (var nlinks = 0; nlinks < 40; nlinks++) { + // split the absolute path + var parts = path.split('/').filter((p) => !!p); + + // start at the root + var current = FS.root; + var current_path = '/'; + + for (var i = 0; i < parts.length; i++) { + var islast = (i === parts.length-1); + if (islast && opts.parent) { + // stop resolving + break; + } + + if (parts[i] === '.') { + continue; + } + + if (parts[i] === '..') { + current_path = PATH.dirname(current_path); + if (FS.isRoot(current)) { + path = current_path + '/' + parts.slice(i + 1).join('/'); + // We're making progress here, don't let many consecutive ..'s + // lead to ELOOP + nlinks--; + continue linkloop; + } else { + current = current.parent; + } + continue; + } + + current_path = PATH.join2(current_path, parts[i]); + try { + current = FS.lookupNode(current, parts[i]); + } catch (e) { + // if noent_okay is true, suppress a ENOENT in the last component + // and return an object with an undefined node. This is needed for + // resolving symlinks in the path when creating a file. + if ((e?.errno === 44) && islast && opts.noent_okay) { + return { path: current_path }; + } + throw e; + } + + // jump to the mount's root node if this is a mountpoint + if (FS.isMountpoint(current) && (!islast || opts.follow_mount)) { + current = current.mounted.root; + } + + // by default, lookupPath will not follow a symlink if it is the final path component. + // setting opts.follow = true will override this behavior. + if (FS.isLink(current.mode) && (!islast || opts.follow)) { + if (!current.node_ops.readlink) { + throw new FS.ErrnoError(52); + } + var link = current.node_ops.readlink(current); + if (!PATH.isAbs(link)) { + link = PATH.dirname(current_path) + '/' + link; + } + path = link + '/' + parts.slice(i + 1).join('/'); + continue linkloop; + } + } + return { path: current_path, node: current }; + } + throw new FS.ErrnoError(32); + }, + getPath(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length-1] !== '/' ? `${mount}/${path}` : mount + path; + } + path = path ? `${node.name}/${path}` : node.name; + node = node.parent; + } + }, + hashName(parentid, name) { + var hash = 0; + + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 0) % FS.nameTable.length; + }, + hashAddNode(node) { + var hash = FS.hashName(node.parent.id, node.name); + node.name_next = FS.nameTable[hash]; + FS.nameTable[hash] = node; + }, + hashRemoveNode(node) { + var hash = FS.hashName(node.parent.id, node.name); + if (FS.nameTable[hash] === node) { + FS.nameTable[hash] = node.name_next; + } else { + var current = FS.nameTable[hash]; + while (current) { + if (current.name_next === node) { + current.name_next = node.name_next; + break; + } + current = current.name_next; + } + } + }, + lookupNode(parent, name) { + var errCode = FS.mayLookup(parent); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + var hash = FS.hashName(parent.id, name); + for (var node = FS.nameTable[hash]; node; node = node.name_next) { + var nodeName = node.name; + if (node.parent.id === parent.id && nodeName === name) { + return node; + } + } + // if we failed to find it in the cache, call into the VFS + return FS.lookup(parent, name); + }, + createNode(parent, name, mode, rdev) { + assert(typeof parent == 'object') + var node = new FS.FSNode(parent, name, mode, rdev); + + FS.hashAddNode(node); + + return node; + }, + destroyNode(node) { + FS.hashRemoveNode(node); + }, + isRoot(node) { + return node === node.parent; + }, + isMountpoint(node) { + return !!node.mounted; + }, + isFile(mode) { + return (mode & 61440) === 32768; + }, + isDir(mode) { + return (mode & 61440) === 16384; + }, + isLink(mode) { + return (mode & 61440) === 40960; + }, + isChrdev(mode) { + return (mode & 61440) === 8192; + }, + isBlkdev(mode) { + return (mode & 61440) === 24576; + }, + isFIFO(mode) { + return (mode & 61440) === 4096; + }, + isSocket(mode) { + return (mode & 49152) === 49152; + }, + flagsToPermissionString(flag) { + var perms = ['r', 'w', 'rw'][flag & 3]; + if ((flag & 512)) { + perms += 'w'; + } + return perms; + }, + nodePermissions(node, perms) { + if (FS.ignorePermissions) { + return 0; + } + // return 0 if any user, group or owner bits are set. + if (perms.includes('r') && !(node.mode & 292)) { + return 2; + } else if (perms.includes('w') && !(node.mode & 146)) { + return 2; + } else if (perms.includes('x') && !(node.mode & 73)) { + return 2; + } + return 0; + }, + mayLookup(dir) { + if (!FS.isDir(dir.mode)) return 54; + var errCode = FS.nodePermissions(dir, 'x'); + if (errCode) return errCode; + if (!dir.node_ops.lookup) return 2; + return 0; + }, + mayCreate(dir, name) { + if (!FS.isDir(dir.mode)) { + return 54; + } + try { + var node = FS.lookupNode(dir, name); + return 20; + } catch (e) { + } + return FS.nodePermissions(dir, 'wx'); + }, + mayDelete(dir, name, isdir) { + var node; + try { + node = FS.lookupNode(dir, name); + } catch (e) { + return e.errno; + } + var errCode = FS.nodePermissions(dir, 'wx'); + if (errCode) { + return errCode; + } + if (isdir) { + if (!FS.isDir(node.mode)) { + return 54; + } + if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { + return 10; + } + } else { + if (FS.isDir(node.mode)) { + return 31; + } + } + return 0; + }, + mayOpen(node, flags) { + if (!node) { + return 44; + } + if (FS.isLink(node.mode)) { + return 32; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' // opening for write + || (flags & (512 | 64))) { // TODO: check for O_SEARCH? (== search for dir only) + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + }, + checkOpExists(op, err) { + if (!op) { + throw new FS.ErrnoError(err); + } + return op; + }, + MAX_OPEN_FDS:4096, + nextfd() { + for (var fd = 0; fd <= FS.MAX_OPEN_FDS; fd++) { + if (!FS.streams[fd]) { + return fd; + } + } + throw new FS.ErrnoError(33); + }, + getStreamChecked(fd) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + return stream; + }, + getStream:(fd) => FS.streams[fd], + createStream(stream, fd = -1) { + assert(fd >= -1); + + // clone it, so we can return an instance of FSStream + stream = Object.assign(new FS.FSStream(), stream); + if (fd == -1) { + fd = FS.nextfd(); + } + stream.fd = fd; + FS.streams[fd] = stream; + return stream; + }, + closeStream(fd) { + FS.streams[fd] = null; + }, + dupStream(origStream, fd = -1) { + var stream = FS.createStream(origStream, fd); + stream.stream_ops?.dup?.(stream); + return stream; + }, + doSetAttr(stream, node, attr) { + var setattr = stream?.stream_ops.setattr; + var arg = setattr ? stream : node; + setattr ??= node.node_ops.setattr; + FS.checkOpExists(setattr, 63) + setattr(arg, attr); + }, + chrdev_stream_ops:{ + open(stream) { + var device = FS.getDevice(stream.node.rdev); + // override node's stream ops with the device's + stream.stream_ops = device.stream_ops; + // forward the open call + stream.stream_ops.open?.(stream); + }, + llseek() { + throw new FS.ErrnoError(70); + }, + }, + major:(dev) => ((dev) >> 8), + minor:(dev) => ((dev) & 0xff), + makedev:(ma, mi) => ((ma) << 8 | (mi)), + registerDevice(dev, ops) { + FS.devices[dev] = { stream_ops: ops }; + }, + getDevice:(dev) => FS.devices[dev], + getMounts(mount) { + var mounts = []; + var check = [mount]; + + while (check.length) { + var m = check.pop(); + + mounts.push(m); + + check.push(...m.mounts); + } + + return mounts; + }, + syncfs(populate, callback) { + if (typeof populate == 'function') { + callback = populate; + populate = false; + } + + FS.syncFSRequests++; + + if (FS.syncFSRequests > 1) { + err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`); + } + + var mounts = FS.getMounts(FS.root.mount); + var completed = 0; + + function doCallback(errCode) { + assert(FS.syncFSRequests > 0); + FS.syncFSRequests--; + return callback(errCode); + } + + function done(errCode) { + if (errCode) { + if (!done.errored) { + done.errored = true; + return doCallback(errCode); + } + return; + } + if (++completed >= mounts.length) { + doCallback(null); + } + }; + + // sync all mounts + mounts.forEach((mount) => { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + }, + mount(type, opts, mountpoint) { + if (typeof type == 'string') { + // The filesystem was not included, and instead we have an error + // message stored in the variable. + throw type; + } + var root = mountpoint === '/'; + var pseudo = !mountpoint; + var node; + + if (root && FS.root) { + throw new FS.ErrnoError(10); + } else if (!root && !pseudo) { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + + mountpoint = lookup.path; // use the absolute path + node = lookup.node; + + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + + if (!FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + } + + var mount = { + type, + opts, + mountpoint, + mounts: [] + }; + + // create a root node for the fs + var mountRoot = type.mount(mount); + mountRoot.mount = mount; + mount.root = mountRoot; + + if (root) { + FS.root = mountRoot; + } else if (node) { + // set as a mountpoint + node.mounted = mount; + + // add the new mount to the current mount's children + if (node.mount) { + node.mount.mounts.push(mount); + } + } + + return mountRoot; + }, + unmount(mountpoint) { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + + if (!FS.isMountpoint(lookup.node)) { + throw new FS.ErrnoError(28); + } + + // destroy the nodes for this mount, and all its child mounts + var node = lookup.node; + var mount = node.mounted; + var mounts = FS.getMounts(mount); + + Object.keys(FS.nameTable).forEach((hash) => { + var current = FS.nameTable[hash]; + + while (current) { + var next = current.name_next; + + if (mounts.includes(current.mount)) { + FS.destroyNode(current); + } + + current = next; + } + }); + + // no longer a mountpoint + node.mounted = null; + + // remove this mount from the child mounts + var idx = node.mount.mounts.indexOf(mount); + assert(idx !== -1); + node.mount.mounts.splice(idx, 1); + }, + lookup(parent, name) { + return parent.node_ops.lookup(parent, name); + }, + mknod(path, mode, dev) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + if (!name) { + throw new FS.ErrnoError(28); + } + if (name === '.' || name === '..') { + throw new FS.ErrnoError(20); + } + var errCode = FS.mayCreate(parent, name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.mknod) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.mknod(parent, name, mode, dev); + }, + statfs(path) { + return FS.statfsNode(FS.lookupPath(path, {follow: true}).node); + }, + statfsStream(stream) { + // We keep a separate statfsStream function because noderawfs overrides + // it. In noderawfs, stream.node is sometimes null. Instead, we need to + // look at stream.path. + return FS.statfsNode(stream.node); + }, + statfsNode(node) { + // NOTE: None of the defaults here are true. We're just returning safe and + // sane values. Currently nodefs and rawfs replace these defaults, + // other file systems leave them alone. + var rtn = { + bsize: 4096, + frsize: 4096, + blocks: 1e6, + bfree: 5e5, + bavail: 5e5, + files: FS.nextInode, + ffree: FS.nextInode - 1, + fsid: 42, + flags: 2, + namelen: 255, + }; + + if (node.node_ops.statfs) { + Object.assign(rtn, node.node_ops.statfs(node.mount.opts.root)); + } + return rtn; + }, + create(path, mode = 0o666) { + mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + }, + mkdir(path, mode = 0o777) { + mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + }, + mkdirTree(path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var dir of dirs) { + if (!dir) continue; + if (d || PATH.isAbs(path)) d += '/'; + d += dir; + try { + FS.mkdir(d, mode); + } catch(e) { + if (e.errno != 20) throw e; + } + } + }, + mkdev(path, mode, dev) { + if (typeof dev == 'undefined') { + dev = mode; + mode = 0o666; + } + mode |= 8192; + return FS.mknod(path, mode, dev); + }, + symlink(oldpath, newpath) { + if (!PATH_FS.resolve(oldpath)) { + throw new FS.ErrnoError(44); + } + var lookup = FS.lookupPath(newpath, { parent: true }); + var parent = lookup.node; + if (!parent) { + throw new FS.ErrnoError(44); + } + var newname = PATH.basename(newpath); + var errCode = FS.mayCreate(parent, newname); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.symlink) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.symlink(parent, newname, oldpath); + }, + rename(old_path, new_path) { + var old_dirname = PATH.dirname(old_path); + var new_dirname = PATH.dirname(new_path); + var old_name = PATH.basename(old_path); + var new_name = PATH.basename(new_path); + // parents must exist + var lookup, old_dir, new_dir; + + // let the errors from non existent directories percolate up + lookup = FS.lookupPath(old_path, { parent: true }); + old_dir = lookup.node; + lookup = FS.lookupPath(new_path, { parent: true }); + new_dir = lookup.node; + + if (!old_dir || !new_dir) throw new FS.ErrnoError(44); + // need to be part of the same mount + if (old_dir.mount !== new_dir.mount) { + throw new FS.ErrnoError(75); + } + // source must exist + var old_node = FS.lookupNode(old_dir, old_name); + // old path should not be an ancestor of the new path + var relative = PATH_FS.relative(old_path, new_dirname); + if (relative.charAt(0) !== '.') { + throw new FS.ErrnoError(28); + } + // new path should not be an ancestor of the old path + relative = PATH_FS.relative(new_path, old_dirname); + if (relative.charAt(0) !== '.') { + throw new FS.ErrnoError(55); + } + // see if the new path already exists + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) { + // not fatal + } + // early out if nothing needs to change + if (old_node === new_node) { + return; + } + // we'll need to delete the old entry + var isdir = FS.isDir(old_node.mode); + var errCode = FS.mayDelete(old_dir, old_name, isdir); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + // need delete permissions if we'll be overwriting. + // need create permissions if new doesn't already exist. + errCode = new_node ? + FS.mayDelete(new_dir, new_name, isdir) : + FS.mayCreate(new_dir, new_name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!old_dir.node_ops.rename) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) { + throw new FS.ErrnoError(10); + } + // if we are going to change the parent, check write permissions + if (new_dir !== old_dir) { + errCode = FS.nodePermissions(old_dir, 'w'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + // remove the node from the lookup hash + FS.hashRemoveNode(old_node); + // do the underlying fs rename + try { + old_dir.node_ops.rename(old_node, new_dir, new_name); + // update old node (we do this here to avoid each backend + // needing to) + old_node.parent = new_dir; + } catch (e) { + throw e; + } finally { + // add the node back to the hash (in case node_ops.rename + // changed its name) + FS.hashAddNode(old_node); + } + }, + rmdir(path) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var errCode = FS.mayDelete(parent, name, true); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.rmdir) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + parent.node_ops.rmdir(parent, name); + FS.destroyNode(node); + }, + readdir(path) { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + var readdir = FS.checkOpExists(node.node_ops.readdir, 54); + return readdir(node); + }, + unlink(path) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + if (!parent) { + throw new FS.ErrnoError(44); + } + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var errCode = FS.mayDelete(parent, name, false); + if (errCode) { + // According to POSIX, we should map EISDIR to EPERM, but + // we instead do what Linux does (and we must, as we use + // the musl linux libc). + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.unlink) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + parent.node_ops.unlink(parent, name); + FS.destroyNode(node); + }, + readlink(path) { + var lookup = FS.lookupPath(path); + var link = lookup.node; + if (!link) { + throw new FS.ErrnoError(44); + } + if (!link.node_ops.readlink) { + throw new FS.ErrnoError(28); + } + return link.node_ops.readlink(link); + }, + stat(path, dontFollow) { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + var node = lookup.node; + var getattr = FS.checkOpExists(node.node_ops.getattr, 63); + return getattr(node); + }, + fstat(fd) { + var stream = FS.getStreamChecked(fd); + var node = stream.node; + var getattr = stream.stream_ops.getattr; + var arg = getattr ? stream : node; + getattr ??= node.node_ops.getattr; + FS.checkOpExists(getattr, 63) + return getattr(arg); + }, + lstat(path) { + return FS.stat(path, true); + }, + doChmod(stream, node, mode, dontFollow) { + FS.doSetAttr(stream, node, { + mode: (mode & 4095) | (node.mode & ~4095), + ctime: Date.now(), + dontFollow + }); + }, + chmod(path, mode, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + FS.doChmod(null, node, mode, dontFollow); + }, + lchmod(path, mode) { + FS.chmod(path, mode, true); + }, + fchmod(fd, mode) { + var stream = FS.getStreamChecked(fd); + FS.doChmod(stream, stream.node, mode, false); + }, + doChown(stream, node, dontFollow) { + FS.doSetAttr(stream, node, { + timestamp: Date.now(), + dontFollow + // we ignore the uid / gid for now + }); + }, + chown(path, uid, gid, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + FS.doChown(null, node, dontFollow); + }, + lchown(path, uid, gid) { + FS.chown(path, uid, gid, true); + }, + fchown(fd, uid, gid) { + var stream = FS.getStreamChecked(fd); + FS.doChown(stream, stream.node, false); + }, + doTruncate(stream, node, len) { + if (FS.isDir(node.mode)) { + throw new FS.ErrnoError(31); + } + if (!FS.isFile(node.mode)) { + throw new FS.ErrnoError(28); + } + var errCode = FS.nodePermissions(node, 'w'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + FS.doSetAttr(stream, node, { + size: len, + timestamp: Date.now() + }); + }, + truncate(path, len) { + if (len < 0) { + throw new FS.ErrnoError(28); + } + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { follow: true }); + node = lookup.node; + } else { + node = path; + } + FS.doTruncate(null, node, len); + }, + ftruncate(fd, len) { + var stream = FS.getStreamChecked(fd); + if (len < 0 || (stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.doTruncate(stream, stream.node, len); + }, + utime(path, atime, mtime) { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + var setattr = FS.checkOpExists(node.node_ops.setattr, 63); + setattr(node, { + atime: atime, + mtime: mtime + }); + }, + open(path, flags, mode = 0o666) { + if (path === "") { + throw new FS.ErrnoError(44); + } + flags = typeof flags == 'string' ? FS_modeStringToFlags(flags) : flags; + if ((flags & 64)) { + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + var isDirPath; + if (typeof path == 'object') { + node = path; + } else { + isDirPath = path.endsWith("/"); + // noent_okay makes it so that if the final component of the path + // doesn't exist, lookupPath returns `node: undefined`. `path` will be + // updated to point to the target of all symlinks. + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072), + noent_okay: true + }); + node = lookup.node; + path = lookup.path; + } + // perhaps we need to create the node + var created = false; + if ((flags & 64)) { + if (node) { + // if O_CREAT and O_EXCL are set, error out if the node already exists + if ((flags & 128)) { + throw new FS.ErrnoError(20); + } + } else if (isDirPath) { + throw new FS.ErrnoError(31); + } else { + // node doesn't exist, try to create it + // Ignore the permission bits here to ensure we can `open` this new + // file below. We use chmod below the apply the permissions once the + // file is open. + node = FS.mknod(path, mode | 0o777, 0); + created = true; + } + } + if (!node) { + throw new FS.ErrnoError(44); + } + // can't truncate a device + if (FS.isChrdev(node.mode)) { + flags &= ~512; + } + // if asked only for a directory, then this must be one + if ((flags & 65536) && !FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + // check permissions, if this is not a file we just created now (it is ok to + // create and write to a file with read-only permissions; it is read-only + // for later use) + if (!created) { + var errCode = FS.mayOpen(node, flags); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + // do truncation if necessary + if ((flags & 512) && !created) { + FS.truncate(node, 0); + } + // we've already handled these, don't pass down to the underlying vfs + flags &= ~(128 | 512 | 131072); + + // register the stream with the filesystem + var stream = FS.createStream({ + node, + path: FS.getPath(node), // we want the absolute path to the node + flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + // used by the file family libc calls (fopen, fwrite, ferror, etc.) + ungotten: [], + error: false + }); + // call the new stream's open function + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (created) { + FS.chmod(node, mode & 0o777); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + } + } + return stream; + }, + close(stream) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (stream.getdents) stream.getdents = null; // free readdir state + try { + if (stream.stream_ops.close) { + stream.stream_ops.close(stream); + } + } catch (e) { + throw e; + } finally { + FS.closeStream(stream.fd); + } + stream.fd = null; + }, + isClosed(stream) { + return stream.fd === null; + }, + llseek(stream, offset, whence) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (!stream.seekable || !stream.stream_ops.llseek) { + throw new FS.ErrnoError(70); + } + if (whence != 0 && whence != 1 && whence != 2) { + throw new FS.ErrnoError(28); + } + stream.position = stream.stream_ops.llseek(stream, offset, whence); + stream.ungotten = []; + return stream.position; + }, + read(stream, buffer, offset, length, position) { + assert(offset >= 0); + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.read) { + throw new FS.ErrnoError(28); + } + var seeking = typeof position != 'undefined'; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position); + if (!seeking) stream.position += bytesRead; + return bytesRead; + }, + write(stream, buffer, offset, length, position, canOwn) { + assert(offset >= 0); + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.write) { + throw new FS.ErrnoError(28); + } + if (stream.seekable && stream.flags & 1024) { + // seek to the end before writing in append mode + FS.llseek(stream, 0, 2); + } + var seeking = typeof position != 'undefined'; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn); + if (!seeking) stream.position += bytesWritten; + return bytesWritten; + }, + mmap(stream, length, position, prot, flags) { + // User requests writing to file (prot & PROT_WRITE != 0). + // Checking if we have permissions to write to the file unless + // MAP_PRIVATE flag is set. According to POSIX spec it is possible + // to write to file opened in read-only mode with MAP_PRIVATE flag, + // as all modifications will be visible only in the memory of + // the current process. + if ((prot & 2) !== 0 + && (flags & 2) === 0 + && (stream.flags & 2097155) !== 2) { + throw new FS.ErrnoError(2); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(2); + } + if (!stream.stream_ops.mmap) { + throw new FS.ErrnoError(43); + } + if (!length) { + throw new FS.ErrnoError(28); + } + return stream.stream_ops.mmap(stream, length, position, prot, flags); + }, + msync(stream, buffer, offset, length, mmapFlags) { + assert(offset >= 0); + if (!stream.stream_ops.msync) { + return 0; + } + return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags); + }, + ioctl(stream, cmd, arg) { + if (!stream.stream_ops.ioctl) { + throw new FS.ErrnoError(59); + } + return stream.stream_ops.ioctl(stream, cmd, arg); + }, + readFile(path, opts = {}) { + opts.flags = opts.flags || 0; + opts.encoding = opts.encoding || 'binary'; + if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') { + throw new Error(`Invalid encoding type "${opts.encoding}"`); + } + var stream = FS.open(path, opts.flags); + var stat = FS.stat(path); + var length = stat.size; + var buf = new Uint8Array(length); + FS.read(stream, buf, 0, length, 0); + if (opts.encoding === 'utf8') { + buf = UTF8ArrayToString(buf); + } + FS.close(stream); + return buf; + }, + writeFile(path, data, opts = {}) { + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data == 'string') { + data = new Uint8Array(intArrayFromString(data, true)); + } + if (ArrayBuffer.isView(data)) { + FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); + } else { + throw new Error('Unsupported data type'); + } + FS.close(stream); + }, + cwd:() => FS.currentPath, + chdir(path) { + var lookup = FS.lookupPath(path, { follow: true }); + if (lookup.node === null) { + throw new FS.ErrnoError(44); + } + if (!FS.isDir(lookup.node.mode)) { + throw new FS.ErrnoError(54); + } + var errCode = FS.nodePermissions(lookup.node, 'x'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + FS.currentPath = lookup.path; + }, + createDefaultDirectories() { + FS.mkdir('/tmp'); + FS.mkdir('/home'); + FS.mkdir('/home/web_user'); + }, + createDefaultDevices() { + // create /dev + FS.mkdir('/dev'); + // setup /dev/null + FS.registerDevice(FS.makedev(1, 3), { + read: () => 0, + write: (stream, buffer, offset, length, pos) => length, + llseek: () => 0, + }); + FS.mkdev('/dev/null', FS.makedev(1, 3)); + // setup /dev/tty and /dev/tty1 + // stderr needs to print output using err() rather than out() + // so we register a second tty just for it. + TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); + TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); + FS.mkdev('/dev/tty', FS.makedev(5, 0)); + FS.mkdev('/dev/tty1', FS.makedev(6, 0)); + // setup /dev/[u]random + // use a buffer to avoid overhead of individual crypto calls per byte + var randomBuffer = new Uint8Array(1024), randomLeft = 0; + var randomByte = () => { + if (randomLeft === 0) { + randomFill(randomBuffer); + randomLeft = randomBuffer.byteLength; + } + return randomBuffer[--randomLeft]; + }; + FS.createDevice('/dev', 'random', randomByte); + FS.createDevice('/dev', 'urandom', randomByte); + // we're not going to emulate the actual shm device, + // just create the tmp dirs that reside in it commonly + FS.mkdir('/dev/shm'); + FS.mkdir('/dev/shm/tmp'); + }, + createSpecialDirectories() { + // create /proc/self/fd which allows /proc/self/fd/6 => readlink gives the + // name of the stream for fd 6 (see test_unistd_ttyname) + FS.mkdir('/proc'); + var proc_self = FS.mkdir('/proc/self'); + FS.mkdir('/proc/self/fd'); + FS.mount({ + mount() { + var node = FS.createNode(proc_self, 'fd', 16895, 73); + node.stream_ops = { + llseek: MEMFS.stream_ops.llseek, + }; + node.node_ops = { + lookup(parent, name) { + var fd = +name; + var stream = FS.getStreamChecked(fd); + var ret = { + parent: null, + mount: { mountpoint: 'fake' }, + node_ops: { readlink: () => stream.path }, + id: fd + 1, + }; + ret.parent = ret; // make it look like a simple root node + return ret; + }, + readdir() { + return Array.from(FS.streams.entries()) + .filter(([k, v]) => v) + .map(([k, v]) => k.toString()); + } + }; + return node; + } + }, {}, '/proc/self/fd'); + }, + createStandardStreams(input, output, error) { + // TODO deprecate the old functionality of a single + // input / output callback and that utilizes FS.createDevice + // and instead require a unique set of stream ops + + // by default, we symlink the standard streams to the + // default tty devices. however, if the standard streams + // have been overwritten we create a unique device for + // them instead. + if (input) { + FS.createDevice('/dev', 'stdin', input); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (output) { + FS.createDevice('/dev', 'stdout', null, output); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (error) { + FS.createDevice('/dev', 'stderr', null, error); + } else { + FS.symlink('/dev/tty1', '/dev/stderr'); + } + + // open default streams for the stdin, stdout and stderr devices + var stdin = FS.open('/dev/stdin', 0); + var stdout = FS.open('/dev/stdout', 1); + var stderr = FS.open('/dev/stderr', 1); + assert(stdin.fd === 0, `invalid handle for stdin (${stdin.fd})`); + assert(stdout.fd === 1, `invalid handle for stdout (${stdout.fd})`); + assert(stderr.fd === 2, `invalid handle for stderr (${stderr.fd})`); + }, + staticInit() { + FS.nameTable = new Array(4096); + + FS.mount(MEMFS, {}, '/'); + + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + + FS.filesystems = { + 'MEMFS': MEMFS, + }; + }, + init(input, output, error) { + assert(!FS.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)'); + FS.initialized = true; + + // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here + input ??= Module['stdin']; + output ??= Module['stdout']; + error ??= Module['stderr']; + + FS.createStandardStreams(input, output, error); + }, + quit() { + FS.initialized = false; + // force-flush all streams, so we get musl std streams printed out + _fflush(0); + // close all of our streams + for (var stream of FS.streams) { + if (stream) { + FS.close(stream); + } + } + }, + findObject(path, dontResolveLastLink) { + var ret = FS.analyzePath(path, dontResolveLastLink); + if (!ret.exists) { + return null; + } + return ret.object; + }, + analyzePath(path, dontResolveLastLink) { + // operate from within the context of the symlink's target + try { + var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + path = lookup.path; + } catch (e) { + } + var ret = { + isRoot: false, exists: false, error: 0, name: null, path: null, object: null, + parentExists: false, parentPath: null, parentObject: null + }; + try { + var lookup = FS.lookupPath(path, { parent: true }); + ret.parentExists = true; + ret.parentPath = lookup.path; + ret.parentObject = lookup.node; + ret.name = PATH.basename(path); + lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + ret.exists = true; + ret.path = lookup.path; + ret.object = lookup.node; + ret.name = lookup.node.name; + ret.isRoot = lookup.path === '/'; + } catch (e) { + ret.error = e.errno; + }; + return ret; + }, + createPath(parent, path, canRead, canWrite) { + parent = typeof parent == 'string' ? parent : FS.getPath(parent); + var parts = path.split('/').reverse(); + while (parts.length) { + var part = parts.pop(); + if (!part) continue; + var current = PATH.join2(parent, part); + try { + FS.mkdir(current); + } catch (e) { + if (e.errno != 20) throw e; + } + parent = current; + } + return current; + }, + createFile(parent, name, properties, canRead, canWrite) { + var path = PATH.join2(typeof parent == 'string' ? parent : FS.getPath(parent), name); + var mode = FS_getMode(canRead, canWrite); + return FS.create(path, mode); + }, + createDataFile(parent, name, data, canRead, canWrite, canOwn) { + var path = name; + if (parent) { + parent = typeof parent == 'string' ? parent : FS.getPath(parent); + path = name ? PATH.join2(parent, name) : parent; + } + var mode = FS_getMode(canRead, canWrite); + var node = FS.create(path, mode); + if (data) { + if (typeof data == 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); + data = arr; + } + // make sure we can write to the file + FS.chmod(node, mode | 146); + var stream = FS.open(node, 577); + FS.write(stream, data, 0, data.length, 0, canOwn); + FS.close(stream); + FS.chmod(node, mode); + } + }, + createDevice(parent, name, input, output) { + var path = PATH.join2(typeof parent == 'string' ? parent : FS.getPath(parent), name); + var mode = FS_getMode(!!input, !!output); + FS.createDevice.major ??= 64; + var dev = FS.makedev(FS.createDevice.major++, 0); + // Create a fake device that a set of stream ops to emulate + // the old behavior. + FS.registerDevice(dev, { + open(stream) { + stream.seekable = false; + }, + close(stream) { + // flush any pending line data + if (output?.buffer?.length) { + output(10); + } + }, + read(stream, buffer, offset, length, pos /* ignored */) { + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset+i] = result; + } + if (bytesRead) { + stream.node.atime = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset+i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.mtime = stream.node.ctime = Date.now(); + } + return i; + } + }); + return FS.mkdev(path, mode, dev); + }, + forceLoadFile(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; + if (typeof XMLHttpRequest != 'undefined') { + throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); + } else { // Command-line. + try { + obj.contents = readBinary(obj.url); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } + }, + createLazyFile(parent, name, url, canRead, canWrite) { + // Lazy chunked Uint8Array (implements get and length from Uint8Array). + // Actual getting is abstracted away for eventual reuse. + class LazyUint8Array { + lengthKnown = false; + chunks = []; // Loaded chunks. Index is the chunk number + get(idx) { + if (idx > this.length-1 || idx < 0) { + return undefined; + } + var chunkOffset = idx % this.chunkSize; + var chunkNum = (idx / this.chunkSize)|0; + return this.getter(chunkNum)[chunkOffset]; + } + setDataGetter(getter) { + this.getter = getter; + } + cacheLength() { + // Find length + var xhr = new XMLHttpRequest(); + xhr.open('HEAD', url, false); + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + var datalength = Number(xhr.getResponseHeader("Content-length")); + var header; + var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; + var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip"; + + var chunkSize = 1024*1024; // Chunk size in bytes + + if (!hasByteServing) chunkSize = datalength; + + // Function to get a range from the remote URL. + var doXHR = (from, to) => { + if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); + if (to > datalength-1) throw new Error("only " + datalength + " bytes available! programmer error!"); + + // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available. + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); + + // Some hints to the browser that we want binary data. + xhr.responseType = 'arraybuffer'; + if (xhr.overrideMimeType) { + xhr.overrideMimeType('text/plain; charset=x-user-defined'); + } + + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + if (xhr.response !== undefined) { + return new Uint8Array(/** @type{Array} */(xhr.response || [])); + } + return intArrayFromString(xhr.responseText || '', true); + }; + var lazyArray = this; + lazyArray.setDataGetter((chunkNum) => { + var start = chunkNum * chunkSize; + var end = (chunkNum+1) * chunkSize - 1; // including this byte + end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block + if (typeof lazyArray.chunks[chunkNum] == 'undefined') { + lazyArray.chunks[chunkNum] = doXHR(start, end); + } + if (typeof lazyArray.chunks[chunkNum] == 'undefined') throw new Error('doXHR failed!'); + return lazyArray.chunks[chunkNum]; + }); + + if (usesGzip || !datalength) { + // if the server uses gzip or doesn't supply the length, we have to download the whole file to get the (uncompressed) length + chunkSize = datalength = 1; // this will force getter(0)/doXHR do download the whole file + datalength = this.getter(0).length; + chunkSize = datalength; + out("LazyFiles on gzip forces download of the whole file when length is accessed"); + } + + this._length = datalength; + this._chunkSize = chunkSize; + this.lengthKnown = true; + } + get length() { + if (!this.lengthKnown) { + this.cacheLength(); + } + return this._length; + } + get chunkSize() { + if (!this.lengthKnown) { + this.cacheLength(); + } + return this._chunkSize; + } + } + + if (typeof XMLHttpRequest != 'undefined') { + if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'; + var lazyArray = new LazyUint8Array(); + var properties = { isDevice: false, contents: lazyArray }; + } else { + var properties = { isDevice: false, url: url }; + } + + var node = FS.createFile(parent, name, properties, canRead, canWrite); + // This is a total hack, but I want to get this lazy file code out of the + // core of MEMFS. If we want to keep this lazy file concept I feel it should + // be its own thin LAZYFS proxying calls to MEMFS. + if (properties.contents) { + node.contents = properties.contents; + } else if (properties.url) { + node.contents = null; + node.url = properties.url; + } + // Add a function that defers querying the file size until it is asked the first time. + Object.defineProperties(node, { + usedBytes: { + get: function() { return this.contents.length; } + } + }); + // override each stream op with one that tries to force load the lazy file first + var stream_ops = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach((key) => { + var fn = node.stream_ops[key]; + stream_ops[key] = (...args) => { + FS.forceLoadFile(node); + return fn(...args); + }; + }); + function writeChunks(stream, buffer, offset, length, position) { + var contents = stream.node.contents; + if (position >= contents.length) + return 0; + var size = Math.min(contents.length - position, length); + assert(size >= 0); + if (contents.slice) { // normal array + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR + buffer[offset + i] = contents.get(position + i); + } + } + return size; + } + // use a custom read function + stream_ops.read = (stream, buffer, offset, length, position) => { + FS.forceLoadFile(node); + return writeChunks(stream, buffer, offset, length, position) + }; + // use a custom mmap function + stream_ops.mmap = (stream, length, position, prot, flags) => { + FS.forceLoadFile(node); + var ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + writeChunks(stream, HEAP8, ptr, length, position); + return { ptr, allocated: true }; + }; + node.stream_ops = stream_ops; + return node; + }, + absolutePath() { + abort('FS.absolutePath has been removed; use PATH_FS.resolve instead'); + }, + createFolder() { + abort('FS.createFolder has been removed; use FS.mkdir instead'); + }, + createLink() { + abort('FS.createLink has been removed; use FS.symlink instead'); + }, + joinPath() { + abort('FS.joinPath has been removed; use PATH.join instead'); + }, + mmapAlloc() { + abort('FS.mmapAlloc has been replaced by the top level function mmapAlloc'); + }, + standardizePath() { + abort('FS.standardizePath has been removed; use PATH.normalize instead'); + }, + }; + + var SYSCALLS = { + DEFAULT_POLLMASK:5, + calculateAt(dirfd, path, allowEmpty) { + if (PATH.isAbs(path)) { + return path; + } + // relative path + var dir; + if (dirfd === -100) { + dir = FS.cwd(); + } else { + var dirstream = SYSCALLS.getStreamFromFD(dirfd); + dir = dirstream.path; + } + if (path.length == 0) { + if (!allowEmpty) { + throw new FS.ErrnoError(44);; + } + return dir; + } + return dir + '/' + path; + }, + writeStat(buf, stat) { + HEAP32[((buf)>>2)] = stat.dev; + HEAP32[(((buf)+(4))>>2)] = stat.mode; + HEAPU32[(((buf)+(8))>>2)] = stat.nlink; + HEAP32[(((buf)+(12))>>2)] = stat.uid; + HEAP32[(((buf)+(16))>>2)] = stat.gid; + HEAP32[(((buf)+(20))>>2)] = stat.rdev; + HEAP64[(((buf)+(24))>>3)] = BigInt(stat.size); + HEAP32[(((buf)+(32))>>2)] = 4096; + HEAP32[(((buf)+(36))>>2)] = stat.blocks; + var atime = stat.atime.getTime(); + var mtime = stat.mtime.getTime(); + var ctime = stat.ctime.getTime(); + HEAP64[(((buf)+(40))>>3)] = BigInt(Math.floor(atime / 1000)); + HEAPU32[(((buf)+(48))>>2)] = (atime % 1000) * 1000 * 1000; + HEAP64[(((buf)+(56))>>3)] = BigInt(Math.floor(mtime / 1000)); + HEAPU32[(((buf)+(64))>>2)] = (mtime % 1000) * 1000 * 1000; + HEAP64[(((buf)+(72))>>3)] = BigInt(Math.floor(ctime / 1000)); + HEAPU32[(((buf)+(80))>>2)] = (ctime % 1000) * 1000 * 1000; + HEAP64[(((buf)+(88))>>3)] = BigInt(stat.ino); + return 0; + }, + writeStatFs(buf, stats) { + HEAP32[(((buf)+(4))>>2)] = stats.bsize; + HEAP32[(((buf)+(40))>>2)] = stats.bsize; + HEAP32[(((buf)+(8))>>2)] = stats.blocks; + HEAP32[(((buf)+(12))>>2)] = stats.bfree; + HEAP32[(((buf)+(16))>>2)] = stats.bavail; + HEAP32[(((buf)+(20))>>2)] = stats.files; + HEAP32[(((buf)+(24))>>2)] = stats.ffree; + HEAP32[(((buf)+(28))>>2)] = stats.fsid; + HEAP32[(((buf)+(44))>>2)] = stats.flags; // ST_NOSUID + HEAP32[(((buf)+(36))>>2)] = stats.namelen; + }, + doMsync(addr, stream, len, flags, offset) { + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (flags & 2) { + // MAP_PRIVATE calls need not to be synced back to underlying fs + return 0; + } + var buffer = HEAPU8.slice(addr, addr + len); + FS.msync(stream, buffer, offset, len, flags); + }, + getStreamFromFD(fd) { + var stream = FS.getStreamChecked(fd); + return stream; + }, + varargs:undefined, + getStr(ptr) { + var ret = UTF8ToString(ptr); + return ret; + }, + }; + function _fd_close(fd) { + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + FS.close(stream); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + /** @param {number=} offset */ + var doReadv = (stream, iov, iovcnt, offset) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[((iov)>>2)]; + var len = HEAPU32[(((iov)+(4))>>2)]; + iov += 8; + var curr = FS.read(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; // nothing more to read + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_read(fd, iov, iovcnt, pnum) { + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doReadv(stream, iov, iovcnt); + HEAPU32[((pnum)>>2)] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + + var INT53_MAX = 9007199254740992; + + var INT53_MIN = -9007199254740992; + var bigintToI53Checked = (num) => (num < INT53_MIN || num > INT53_MAX) ? NaN : Number(num); + function _fd_seek(fd, offset, whence, newOffset) { + offset = bigintToI53Checked(offset); + + + try { + + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.llseek(stream, offset, whence); + HEAP64[((newOffset)>>3)] = BigInt(stream.position); + if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null; // reset readdir state + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + ; + } + + /** @param {number=} offset */ + var doWritev = (stream, iov, iovcnt, offset) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[((iov)>>2)]; + var len = HEAPU32[(((iov)+(4))>>2)]; + iov += 8; + var curr = FS.write(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) { + // No more space to write. + break; + } + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_write(fd, iov, iovcnt, pnum) { + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doWritev(stream, iov, iovcnt); + HEAPU32[((pnum)>>2)] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + + var getCFunc = (ident) => { + var func = Module['_' + ident]; // closure exported function + assert(func, 'Cannot call unknown function ' + ident + ', make sure it is exported'); + return func; + }; + + var writeArrayToMemory = (array, buffer) => { + assert(array.length >= 0, 'writeArrayToMemory array must have a length (should be an array or typed array)') + HEAP8.set(array, buffer); + }; + + + + var stackAlloc = (sz) => __emscripten_stack_alloc(sz); + var stringToUTF8OnStack = (str) => { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8(str, ret, size); + return ret; + }; + + + + + + /** + * @param {string|null=} returnType + * @param {Array=} argTypes + * @param {Array=} args + * @param {Object=} opts + */ + var ccall = (ident, returnType, argTypes, args, opts) => { + // For fast lookup of conversion functions + var toC = { + 'string': (str) => { + var ret = 0; + if (str !== null && str !== undefined && str !== 0) { // null string + ret = stringToUTF8OnStack(str); + } + return ret; + }, + 'array': (arr) => { + var ret = stackAlloc(arr.length); + writeArrayToMemory(arr, ret); + return ret; + } + }; + + function convertReturnValue(ret) { + if (returnType === 'string') { + return UTF8ToString(ret); + } + if (returnType === 'boolean') return Boolean(ret); + return ret; + } + + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + assert(returnType !== 'array', 'Return type should not be "array".'); + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func(...cArgs); + function onDone(ret) { + if (stack !== 0) stackRestore(stack); + return convertReturnValue(ret); + } + + ret = onDone(ret); + return ret; + }; + + + /** + * @param {string=} returnType + * @param {Array=} argTypes + * @param {Object=} opts + */ + var cwrap = (ident, returnType, argTypes, opts) => { + return (...args) => ccall(ident, returnType, argTypes, args, opts); + }; + + var incrementExceptionRefcount = (ptr) => ___cxa_increment_exception_refcount(ptr); + + var decrementExceptionRefcount = (ptr) => ___cxa_decrement_exception_refcount(ptr); + + + + + + + var getExceptionMessageCommon = (ptr) => { + var sp = stackSave(); + var type_addr_addr = stackAlloc(4); + var message_addr_addr = stackAlloc(4); + ___get_exception_message(ptr, type_addr_addr, message_addr_addr); + var type_addr = HEAPU32[((type_addr_addr)>>2)]; + var message_addr = HEAPU32[((message_addr_addr)>>2)]; + var type = UTF8ToString(type_addr); + _free(type_addr); + var message; + if (message_addr) { + message = UTF8ToString(message_addr); + _free(message_addr); + } + stackRestore(sp); + return [type, message]; + }; + var getExceptionMessage = (ptr) => getExceptionMessageCommon(ptr); +assert(emval_handles.length === 5 * 2); + + FS.createPreloadedFile = FS_createPreloadedFile; + FS.staticInit();; +// End JS library code + +// include: postlibrary.js +// This file is included after the automatically-generated JS library code +// but before the wasm module is created. + +{ + + // Begin ATMODULES hooks + if (Module['noExitRuntime']) noExitRuntime = Module['noExitRuntime']; +if (Module['preloadPlugins']) preloadPlugins = Module['preloadPlugins']; +if (Module['print']) out = Module['print']; +if (Module['printErr']) err = Module['printErr']; +if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; + // End ATMODULES hooks + + checkIncomingModuleAPI(); + + if (Module['arguments']) arguments_ = Module['arguments']; + if (Module['thisProgram']) thisProgram = Module['thisProgram']; + + // Assertions on removed incoming Module JS APIs. + assert(typeof Module['memoryInitializerPrefixURL'] == 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead'); + assert(typeof Module['pthreadMainPrefixURL'] == 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead'); + assert(typeof Module['cdInitializerPrefixURL'] == 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead'); + assert(typeof Module['filePackagePrefixURL'] == 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead'); + assert(typeof Module['read'] == 'undefined', 'Module.read option was removed'); + assert(typeof Module['readAsync'] == 'undefined', 'Module.readAsync option was removed (modify readAsync in JS)'); + assert(typeof Module['readBinary'] == 'undefined', 'Module.readBinary option was removed (modify readBinary in JS)'); + assert(typeof Module['setWindowTitle'] == 'undefined', 'Module.setWindowTitle option was removed (modify emscripten_set_window_title in JS)'); + assert(typeof Module['TOTAL_MEMORY'] == 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY'); + assert(typeof Module['ENVIRONMENT'] == 'undefined', 'Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -sENVIRONMENT=web or -sENVIRONMENT=node)'); + assert(typeof Module['STACK_SIZE'] == 'undefined', 'STACK_SIZE can no longer be set at runtime. Use -sSTACK_SIZE at link time') + // If memory is defined in wasm, the user can't provide it, or set INITIAL_MEMORY + assert(typeof Module['wasmMemory'] == 'undefined', 'Use of `wasmMemory` detected. Use -sIMPORTED_MEMORY to define wasmMemory externally'); + assert(typeof Module['INITIAL_MEMORY'] == 'undefined', 'Detected runtime INITIAL_MEMORY setting. Use -sIMPORTED_MEMORY to define wasmMemory dynamically'); + +} + +// Begin runtime exports + Module['ccall'] = ccall; + Module['cwrap'] = cwrap; + var missingLibrarySymbols = [ + 'writeI53ToI64', + 'writeI53ToI64Clamped', + 'writeI53ToI64Signaling', + 'writeI53ToU64Clamped', + 'writeI53ToU64Signaling', + 'readI53FromI64', + 'readI53FromU64', + 'convertI32PairToI53', + 'convertI32PairToI53Checked', + 'convertU32PairToI53', + 'getTempRet0', + 'zeroMemory', + 'exitJS', + 'getHeapMax', + 'growMemory', + 'withStackSave', + 'inetPton4', + 'inetNtop4', + 'inetPton6', + 'inetNtop6', + 'readSockaddr', + 'writeSockaddr', + 'readEmAsmArgs', + 'jstoi_q', + 'autoResumeAudioContext', + 'getDynCaller', + 'dynCall', + 'handleException', + 'keepRuntimeAlive', + 'runtimeKeepalivePush', + 'runtimeKeepalivePop', + 'callUserCallback', + 'maybeExit', + 'asmjsMangle', + 'alignMemory', + 'HandleAllocator', + 'getNativeTypeSize', + 'addOnInit', + 'addOnPostCtor', + 'addOnPreMain', + 'addOnExit', + 'STACK_SIZE', + 'STACK_ALIGN', + 'POINTER_SIZE', + 'ASSERTIONS', + 'convertJsFunctionToWasm', + 'getEmptyTableSlot', + 'updateTableMap', + 'getFunctionAddress', + 'addFunction', + 'removeFunction', + 'intArrayToString', + 'stringToAscii', + 'stringToNewUTF8', + 'registerKeyEventCallback', + 'maybeCStringToJsString', + 'findEventTarget', + 'getBoundingClientRect', + 'fillMouseEventData', + 'registerMouseEventCallback', + 'registerWheelEventCallback', + 'registerUiEventCallback', + 'registerFocusEventCallback', + 'fillDeviceOrientationEventData', + 'registerDeviceOrientationEventCallback', + 'fillDeviceMotionEventData', + 'registerDeviceMotionEventCallback', + 'screenOrientation', + 'fillOrientationChangeEventData', + 'registerOrientationChangeEventCallback', + 'fillFullscreenChangeEventData', + 'registerFullscreenChangeEventCallback', + 'JSEvents_requestFullscreen', + 'JSEvents_resizeCanvasForFullscreen', + 'registerRestoreOldStyle', + 'hideEverythingExceptGivenElement', + 'restoreHiddenElements', + 'setLetterbox', + 'softFullscreenResizeWebGLRenderTarget', + 'doRequestFullscreen', + 'fillPointerlockChangeEventData', + 'registerPointerlockChangeEventCallback', + 'registerPointerlockErrorEventCallback', + 'requestPointerLock', + 'fillVisibilityChangeEventData', + 'registerVisibilityChangeEventCallback', + 'registerTouchEventCallback', + 'fillGamepadEventData', + 'registerGamepadEventCallback', + 'registerBeforeUnloadEventCallback', + 'fillBatteryEventData', + 'registerBatteryEventCallback', + 'setCanvasElementSize', + 'getCanvasElementSize', + 'jsStackTrace', + 'getCallstack', + 'convertPCtoSourceLocation', + 'checkWasiClock', + 'wasiRightsToMuslOFlags', + 'wasiOFlagsToMuslOFlags', + 'safeSetTimeout', + 'setImmediateWrapped', + 'safeRequestAnimationFrame', + 'clearImmediateWrapped', + 'registerPostMainLoop', + 'registerPreMainLoop', + 'getPromise', + 'makePromise', + 'idsToPromises', + 'makePromiseCallback', + 'Browser_asyncPrepareDataCounter', + 'isLeapYear', + 'ydayFromDate', + 'arraySum', + 'addDays', + 'getSocketFromFD', + 'getSocketAddress', + 'FS_mkdirTree', + '_setNetworkCallback', + 'heapObjectForWebGLType', + 'toTypedArrayIndex', + 'webgl_enable_ANGLE_instanced_arrays', + 'webgl_enable_OES_vertex_array_object', + 'webgl_enable_WEBGL_draw_buffers', + 'webgl_enable_WEBGL_multi_draw', + 'webgl_enable_EXT_polygon_offset_clamp', + 'webgl_enable_EXT_clip_control', + 'webgl_enable_WEBGL_polygon_mode', + 'emscriptenWebGLGet', + 'computeUnpackAlignedImageSize', + 'colorChannelsInGlTextureFormat', + 'emscriptenWebGLGetTexPixelData', + 'emscriptenWebGLGetUniform', + 'webglGetUniformLocation', + 'webglPrepareUniformLocationsBeforeFirstUse', + 'webglGetLeftBracePos', + 'emscriptenWebGLGetVertexAttrib', + '__glGetActiveAttribOrUniform', + 'writeGLArray', + 'registerWebGlEventCallback', + 'runAndAbortIfError', + 'ALLOC_NORMAL', + 'ALLOC_STACK', + 'allocate', + 'writeStringToMemory', + 'writeAsciiToMemory', + 'demangle', + 'stackTrace', + 'getFunctionArgsName', + 'createJsInvokerSignature', + 'PureVirtualError', + 'getBasestPointer', + 'registerInheritedInstance', + 'unregisterInheritedInstance', + 'getInheritedInstance', + 'getInheritedInstanceCount', + 'getLiveInheritedInstances', + 'enumReadValueFromPointer', + 'genericPointerToWireType', + 'constNoSmartPtrRawPointerToWireType', + 'nonConstNoSmartPtrRawPointerToWireType', + 'init_RegisteredPointer', + 'RegisteredPointer', + 'RegisteredPointer_fromWireType', + 'runDestructor', + 'releaseClassHandle', + 'detachFinalizer', + 'attachFinalizer', + 'makeClassHandle', + 'init_ClassHandle', + 'ClassHandle', + 'throwInstanceAlreadyDeleted', + 'flushPendingDeletes', + 'setDelayFunction', + 'RegisteredClass', + 'shallowCopyInternalPointer', + 'downcastPointer', + 'upcastPointer', + 'validateThis', + 'char_0', + 'char_9', + 'makeLegalFunctionName', + 'count_emval_handles', + 'emval_get_global', +]; +missingLibrarySymbols.forEach(missingLibrarySymbol) + + var unexportedSymbols = [ + 'run', + 'addRunDependency', + 'removeRunDependency', + 'out', + 'err', + 'callMain', + 'abort', + 'wasmMemory', + 'wasmExports', + 'HEAPF32', + 'HEAPF64', + 'HEAP8', + 'HEAPU8', + 'HEAP16', + 'HEAPU16', + 'HEAP32', + 'HEAPU32', + 'HEAP64', + 'HEAPU64', + 'writeStackCookie', + 'checkStackCookie', + 'INT53_MAX', + 'INT53_MIN', + 'bigintToI53Checked', + 'stackSave', + 'stackRestore', + 'stackAlloc', + 'setTempRet0', + 'ptrToString', + 'abortOnCannotGrowMemory', + 'ENV', + 'ERRNO_CODES', + 'strError', + 'DNS', + 'Protocols', + 'Sockets', + 'timers', + 'warnOnce', + 'readEmAsmArgsArray', + 'getExecutableName', + 'asyncLoad', + 'mmapAlloc', + 'wasmTable', + 'getUniqueRunDependency', + 'noExitRuntime', + 'addOnPreRun', + 'addOnPostRun', + 'freeTableIndexes', + 'functionsInTableMap', + 'setValue', + 'getValue', + 'PATH', + 'PATH_FS', + 'UTF8Decoder', + 'UTF8ArrayToString', + 'UTF8ToString', + 'stringToUTF8Array', + 'stringToUTF8', + 'lengthBytesUTF8', + 'intArrayFromString', + 'AsciiToString', + 'UTF16Decoder', + 'UTF16ToString', + 'stringToUTF16', + 'lengthBytesUTF16', + 'UTF32ToString', + 'stringToUTF32', + 'lengthBytesUTF32', + 'stringToUTF8OnStack', + 'writeArrayToMemory', + 'JSEvents', + 'specialHTMLTargets', + 'findCanvasEventTarget', + 'currentFullscreenStrategy', + 'restoreOldWindowedStyle', + 'UNWIND_CACHE', + 'ExitStatus', + 'getEnvStrings', + 'doReadv', + 'doWritev', + 'initRandomFill', + 'randomFill', + 'emSetImmediate', + 'emClearImmediate_deps', + 'emClearImmediate', + 'promiseMap', + 'uncaughtExceptionCount', + 'exceptionLast', + 'exceptionCaught', + 'ExceptionInfo', + 'findMatchingCatch', + 'getExceptionMessageCommon', + 'Browser', + 'requestFullscreen', + 'requestFullScreen', + 'setCanvasSize', + 'getUserMedia', + 'createContext', + 'getPreloadedImageData__data', + 'wget', + 'MONTH_DAYS_REGULAR', + 'MONTH_DAYS_LEAP', + 'MONTH_DAYS_REGULAR_CUMULATIVE', + 'MONTH_DAYS_LEAP_CUMULATIVE', + 'SYSCALLS', + 'preloadPlugins', + 'FS_createPreloadedFile', + 'FS_modeStringToFlags', + 'FS_getMode', + 'FS_stdin_getChar_buffer', + 'FS_stdin_getChar', + 'FS_unlink', + 'FS_createPath', + 'FS_createDevice', + 'FS_readFile', + 'FS', + 'FS_root', + 'FS_mounts', + 'FS_devices', + 'FS_streams', + 'FS_nextInode', + 'FS_nameTable', + 'FS_currentPath', + 'FS_initialized', + 'FS_ignorePermissions', + 'FS_filesystems', + 'FS_syncFSRequests', + 'FS_readFiles', + 'FS_lookupPath', + 'FS_getPath', + 'FS_hashName', + 'FS_hashAddNode', + 'FS_hashRemoveNode', + 'FS_lookupNode', + 'FS_createNode', + 'FS_destroyNode', + 'FS_isRoot', + 'FS_isMountpoint', + 'FS_isFile', + 'FS_isDir', + 'FS_isLink', + 'FS_isChrdev', + 'FS_isBlkdev', + 'FS_isFIFO', + 'FS_isSocket', + 'FS_flagsToPermissionString', + 'FS_nodePermissions', + 'FS_mayLookup', + 'FS_mayCreate', + 'FS_mayDelete', + 'FS_mayOpen', + 'FS_checkOpExists', + 'FS_nextfd', + 'FS_getStreamChecked', + 'FS_getStream', + 'FS_createStream', + 'FS_closeStream', + 'FS_dupStream', + 'FS_doSetAttr', + 'FS_chrdev_stream_ops', + 'FS_major', + 'FS_minor', + 'FS_makedev', + 'FS_registerDevice', + 'FS_getDevice', + 'FS_getMounts', + 'FS_syncfs', + 'FS_mount', + 'FS_unmount', + 'FS_lookup', + 'FS_mknod', + 'FS_statfs', + 'FS_statfsStream', + 'FS_statfsNode', + 'FS_create', + 'FS_mkdir', + 'FS_mkdev', + 'FS_symlink', + 'FS_rename', + 'FS_rmdir', + 'FS_readdir', + 'FS_readlink', + 'FS_stat', + 'FS_fstat', + 'FS_lstat', + 'FS_doChmod', + 'FS_chmod', + 'FS_lchmod', + 'FS_fchmod', + 'FS_doChown', + 'FS_chown', + 'FS_lchown', + 'FS_fchown', + 'FS_doTruncate', + 'FS_truncate', + 'FS_ftruncate', + 'FS_utime', + 'FS_open', + 'FS_close', + 'FS_isClosed', + 'FS_llseek', + 'FS_read', + 'FS_write', + 'FS_mmap', + 'FS_msync', + 'FS_ioctl', + 'FS_writeFile', + 'FS_cwd', + 'FS_chdir', + 'FS_createDefaultDirectories', + 'FS_createDefaultDevices', + 'FS_createSpecialDirectories', + 'FS_createStandardStreams', + 'FS_staticInit', + 'FS_init', + 'FS_quit', + 'FS_findObject', + 'FS_analyzePath', + 'FS_createFile', + 'FS_createDataFile', + 'FS_forceLoadFile', + 'FS_createLazyFile', + 'FS_absolutePath', + 'FS_createFolder', + 'FS_createLink', + 'FS_joinPath', + 'FS_mmapAlloc', + 'FS_standardizePath', + 'MEMFS', + 'TTY', + 'PIPEFS', + 'SOCKFS', + 'tempFixedLengthArray', + 'miniTempWebGLFloatBuffers', + 'miniTempWebGLIntBuffers', + 'GL', + 'AL', + 'GLUT', + 'EGL', + 'GLEW', + 'IDBStore', + 'SDL', + 'SDL_gfx', + 'allocateUTF8', + 'allocateUTF8OnStack', + 'print', + 'printErr', + 'jstoi_s', + 'InternalError', + 'BindingError', + 'throwInternalError', + 'throwBindingError', + 'registeredTypes', + 'awaitingDependencies', + 'typeDependencies', + 'tupleRegistrations', + 'structRegistrations', + 'sharedRegisterType', + 'whenDependentTypesAreResolved', + 'getTypeName', + 'getFunctionName', + 'heap32VectorToArray', + 'requireRegisteredType', + 'usesDestructorStack', + 'checkArgCount', + 'getRequiredArgCount', + 'createJsInvoker', + 'UnboundTypeError', + 'EmValType', + 'EmValOptionalType', + 'throwUnboundTypeError', + 'ensureOverloadTable', + 'exposePublicSymbol', + 'replacePublicSymbol', + 'createNamedFunction', + 'embindRepr', + 'registeredInstances', + 'registeredPointers', + 'registerType', + 'integerReadValueFromPointer', + 'floatReadValueFromPointer', + 'assertIntegerRange', + 'readPointer', + 'runDestructors', + 'craftInvokerFunction', + 'embind__requireFunction', + 'finalizationRegistry', + 'detachFinalizer_deps', + 'deletionQueue', + 'delayFunction', + 'emval_freelist', + 'emval_handles', + 'emval_symbols', + 'getStringOrSymbol', + 'Emval', + 'emval_returnValue', + 'emval_lookupTypes', + 'emval_methodCallers', + 'emval_addMethodCaller', +]; +unexportedSymbols.forEach(unexportedRuntimeSymbol); + + // End runtime exports + // Begin JS library exports + Module['incrementExceptionRefcount'] = incrementExceptionRefcount; + Module['decrementExceptionRefcount'] = decrementExceptionRefcount; + Module['getExceptionMessage'] = getExceptionMessage; + // End JS library exports + +// end include: postlibrary.js + +function checkIncomingModuleAPI() { + ignoredModuleProp('fetchSettings'); +} + +// Imports from the Wasm binary. +var _malloc = makeInvalidEarlyAccess('_malloc'); +var ___cxa_free_exception = makeInvalidEarlyAccess('___cxa_free_exception'); +var ___getTypeName = makeInvalidEarlyAccess('___getTypeName'); +var _fflush = makeInvalidEarlyAccess('_fflush'); +var _emscripten_stack_get_end = makeInvalidEarlyAccess('_emscripten_stack_get_end'); +var _emscripten_stack_get_base = makeInvalidEarlyAccess('_emscripten_stack_get_base'); +var _strerror = makeInvalidEarlyAccess('_strerror'); +var _free = makeInvalidEarlyAccess('_free'); +var _setThrew = makeInvalidEarlyAccess('_setThrew'); +var __emscripten_tempret_set = makeInvalidEarlyAccess('__emscripten_tempret_set'); +var _emscripten_stack_init = makeInvalidEarlyAccess('_emscripten_stack_init'); +var _emscripten_stack_get_free = makeInvalidEarlyAccess('_emscripten_stack_get_free'); +var __emscripten_stack_restore = makeInvalidEarlyAccess('__emscripten_stack_restore'); +var __emscripten_stack_alloc = makeInvalidEarlyAccess('__emscripten_stack_alloc'); +var _emscripten_stack_get_current = makeInvalidEarlyAccess('_emscripten_stack_get_current'); +var ___cxa_decrement_exception_refcount = makeInvalidEarlyAccess('___cxa_decrement_exception_refcount'); +var ___cxa_increment_exception_refcount = makeInvalidEarlyAccess('___cxa_increment_exception_refcount'); +var ___get_exception_message = makeInvalidEarlyAccess('___get_exception_message'); +var ___cxa_can_catch = makeInvalidEarlyAccess('___cxa_can_catch'); +var ___cxa_get_exception_ptr = makeInvalidEarlyAccess('___cxa_get_exception_ptr'); + +function assignWasmExports(wasmExports) { + _malloc = createExportWrapper('malloc', 1); + ___cxa_free_exception = createExportWrapper('__cxa_free_exception', 1); + ___getTypeName = createExportWrapper('__getTypeName', 1); + _fflush = createExportWrapper('fflush', 1); + _emscripten_stack_get_end = wasmExports['emscripten_stack_get_end']; + _emscripten_stack_get_base = wasmExports['emscripten_stack_get_base']; + _strerror = createExportWrapper('strerror', 1); + _free = createExportWrapper('free', 1); + _setThrew = createExportWrapper('setThrew', 2); + __emscripten_tempret_set = createExportWrapper('_emscripten_tempret_set', 1); + _emscripten_stack_init = wasmExports['emscripten_stack_init']; + _emscripten_stack_get_free = wasmExports['emscripten_stack_get_free']; + __emscripten_stack_restore = wasmExports['_emscripten_stack_restore']; + __emscripten_stack_alloc = wasmExports['_emscripten_stack_alloc']; + _emscripten_stack_get_current = wasmExports['emscripten_stack_get_current']; + ___cxa_decrement_exception_refcount = createExportWrapper('__cxa_decrement_exception_refcount', 1); + ___cxa_increment_exception_refcount = createExportWrapper('__cxa_increment_exception_refcount', 1); + ___get_exception_message = createExportWrapper('__get_exception_message', 3); + ___cxa_can_catch = createExportWrapper('__cxa_can_catch', 3); + ___cxa_get_exception_ptr = createExportWrapper('__cxa_get_exception_ptr', 1); +} +var wasmImports = { + /** @export */ + __assert_fail: ___assert_fail, + /** @export */ + __cxa_begin_catch: ___cxa_begin_catch, + /** @export */ + __cxa_end_catch: ___cxa_end_catch, + /** @export */ + __cxa_find_matching_catch_2: ___cxa_find_matching_catch_2, + /** @export */ + __cxa_find_matching_catch_3: ___cxa_find_matching_catch_3, + /** @export */ + __cxa_rethrow: ___cxa_rethrow, + /** @export */ + __cxa_throw: ___cxa_throw, + /** @export */ + __cxa_uncaught_exceptions: ___cxa_uncaught_exceptions, + /** @export */ + __resumeException: ___resumeException, + /** @export */ + _abort_js: __abort_js, + /** @export */ + _embind_register_bigint: __embind_register_bigint, + /** @export */ + _embind_register_bool: __embind_register_bool, + /** @export */ + _embind_register_emval: __embind_register_emval, + /** @export */ + _embind_register_float: __embind_register_float, + /** @export */ + _embind_register_function: __embind_register_function, + /** @export */ + _embind_register_integer: __embind_register_integer, + /** @export */ + _embind_register_memory_view: __embind_register_memory_view, + /** @export */ + _embind_register_std_string: __embind_register_std_string, + /** @export */ + _embind_register_std_wstring: __embind_register_std_wstring, + /** @export */ + _embind_register_void: __embind_register_void, + /** @export */ + _emval_create_invoker: __emval_create_invoker, + /** @export */ + _emval_decref: __emval_decref, + /** @export */ + _emval_get_property: __emval_get_property, + /** @export */ + _emval_incref: __emval_incref, + /** @export */ + _emval_invoke: __emval_invoke, + /** @export */ + _emval_new_array_from_memory_view: __emval_new_array_from_memory_view, + /** @export */ + _emval_run_destructors: __emval_run_destructors, + /** @export */ + _tzset_js: __tzset_js, + /** @export */ + emscripten_resize_heap: _emscripten_resize_heap, + /** @export */ + environ_get: _environ_get, + /** @export */ + environ_sizes_get: _environ_sizes_get, + /** @export */ + fd_close: _fd_close, + /** @export */ + fd_read: _fd_read, + /** @export */ + fd_seek: _fd_seek, + /** @export */ + fd_write: _fd_write, + /** @export */ + invoke_diii, + /** @export */ + invoke_fiii, + /** @export */ + invoke_i, + /** @export */ + invoke_ii, + /** @export */ + invoke_iii, + /** @export */ + invoke_iiii, + /** @export */ + invoke_iiiii, + /** @export */ + invoke_iiiiii, + /** @export */ + invoke_iiiiiii, + /** @export */ + invoke_iiiiiiii, + /** @export */ + invoke_iiiiiiiiiii, + /** @export */ + invoke_iiiiiiiiiiii, + /** @export */ + invoke_iiiiiiiiiiiii, + /** @export */ + invoke_iiiji, + /** @export */ + invoke_j, + /** @export */ + invoke_jiiii, + /** @export */ + invoke_jjj, + /** @export */ + invoke_v, + /** @export */ + invoke_vi, + /** @export */ + invoke_vii, + /** @export */ + invoke_viii, + /** @export */ + invoke_viiii, + /** @export */ + invoke_viiiiiii, + /** @export */ + invoke_viiiiiiiiii, + /** @export */ + invoke_viiiiiiiiiiiiiii, + /** @export */ + invoke_viiji, + /** @export */ + invoke_vij, + /** @export */ + invoke_vijii +}; +var wasmExports = await createWasm(); + +function invoke_vii(index,a1,a2) { + var sp = stackSave(); + try { + getWasmTableEntry(index)(a1,a2); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + } +} + +function invoke_ii(index,a1) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + } +} + +function invoke_iii(index,a1,a2) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1,a2); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + } +} + +function invoke_vi(index,a1) { + var sp = stackSave(); + try { + getWasmTableEntry(index)(a1); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + } +} + +function invoke_viii(index,a1,a2,a3) { + var sp = stackSave(); + try { + getWasmTableEntry(index)(a1,a2,a3); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + } +} + +function invoke_vij(index,a1,a2) { + var sp = stackSave(); + try { + getWasmTableEntry(index)(a1,a2); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + } +} + +function invoke_iiii(index,a1,a2,a3) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1,a2,a3); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + } +} + +function invoke_viiii(index,a1,a2,a3,a4) { + var sp = stackSave(); + try { + getWasmTableEntry(index)(a1,a2,a3,a4); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + } +} + +function invoke_iiiii(index,a1,a2,a3,a4) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1,a2,a3,a4); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + } +} + +function invoke_viiji(index,a1,a2,a3,a4) { + var sp = stackSave(); + try { + getWasmTableEntry(index)(a1,a2,a3,a4); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + } +} + +function invoke_iiiji(index,a1,a2,a3,a4) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1,a2,a3,a4); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + } +} + +function invoke_jjj(index,a1,a2) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1,a2); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + return 0n; + } +} + +function invoke_vijii(index,a1,a2,a3,a4) { + var sp = stackSave(); + try { + getWasmTableEntry(index)(a1,a2,a3,a4); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + } +} + +function invoke_j(index) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + return 0n; + } +} + +function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + } +} + +function invoke_v(index) { + var sp = stackSave(); + try { + getWasmTableEntry(index)(); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + } +} + +function invoke_iiiiii(index,a1,a2,a3,a4,a5) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1,a2,a3,a4,a5); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + } +} + +function invoke_iiiiiiii(index,a1,a2,a3,a4,a5,a6,a7) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + } +} + +function invoke_iiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + } +} + +function invoke_jiiii(index,a1,a2,a3,a4) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1,a2,a3,a4); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + return 0n; + } +} + +function invoke_iiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + } +} + +function invoke_fiii(index,a1,a2,a3) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1,a2,a3); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + } +} + +function invoke_diii(index,a1,a2,a3) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1,a2,a3); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + } +} + +function invoke_i(index) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + } +} + +function invoke_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7) { + var sp = stackSave(); + try { + getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + } +} + +function invoke_iiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + } +} + +function invoke_viiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) { + var sp = stackSave(); + try { + getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + } +} + +function invoke_viiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15) { + var sp = stackSave(); + try { + getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15); + } catch(e) { + stackRestore(sp); + if (!(e instanceof EmscriptenEH)) throw e; + _setThrew(1, 0); + } +} + + +// include: postamble.js +// === Auto-generated postamble setup entry stuff === + +var calledRun; + +function stackCheckInit() { + // This is normally called automatically during __wasm_call_ctors but need to + // get these values before even running any of the ctors so we call it redundantly + // here. + _emscripten_stack_init(); + // TODO(sbc): Move writeStackCookie to native to to avoid this. + writeStackCookie(); +} + +function run() { + + if (runDependencies > 0) { + dependenciesFulfilled = run; + return; + } + + stackCheckInit(); + + preRun(); + + // a preRun added a dependency, run will be called later + if (runDependencies > 0) { + dependenciesFulfilled = run; + return; + } + + function doRun() { + // run may have just been called through dependencies being fulfilled just in this very frame, + // or while the async setStatus time below was happening + assert(!calledRun); + calledRun = true; + Module['calledRun'] = true; + + if (ABORT) return; + + initRuntime(); + + readyPromiseResolve?.(Module); + Module['onRuntimeInitialized']?.(); + consumedModuleProp('onRuntimeInitialized'); + + assert(!Module['_main'], 'compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]'); + + postRun(); + } + + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(() => { + setTimeout(() => Module['setStatus'](''), 1); + doRun(); + }, 1); + } else + { + doRun(); + } + checkStackCookie(); +} + +function checkUnflushedContent() { + // Compiler settings do not allow exiting the runtime, so flushing + // the streams is not possible. but in ASSERTIONS mode we check + // if there was something to flush, and if so tell the user they + // should request that the runtime be exitable. + // Normally we would not even include flush() at all, but in ASSERTIONS + // builds we do so just for this check, and here we see if there is any + // content to flush, that is, we check if there would have been + // something a non-ASSERTIONS build would have not seen. + // How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0 + // mode (which has its own special function for this; otherwise, all + // the code is inside libc) + var oldOut = out; + var oldErr = err; + var has = false; + out = err = (x) => { + has = true; + } + try { // it doesn't matter if it fails + _fflush(0); + // also flush in the JS FS layer + ['stdout', 'stderr'].forEach((name) => { + var info = FS.analyzePath('/dev/' + name); + if (!info) return; + var stream = info.object; + var rdev = stream.rdev; + var tty = TTY.ttys[rdev]; + if (tty?.output?.length) { + has = true; + } + }); + } catch(e) {} + out = oldOut; + err = oldErr; + if (has) { + warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the Emscripten FAQ), or make sure to emit a newline when you printf etc.'); + } +} + +function preInit() { + if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].shift()(); + } + } + consumedModuleProp('preInit'); +} + +preInit(); +run(); + +// end include: postamble.js + +// include: postamble_modularize.js +// In MODULARIZE mode we wrap the generated code in a factory function +// and return either the Module itself, or a promise of the module. +// +// We assign to the `moduleRtn` global here and configure closure to see +// this as and extern so it won't get minified. + +if (runtimeInitialized) { + moduleRtn = Module; +} else { + // Set up the promise that indicates the Module is initialized + moduleRtn = new Promise((resolve, reject) => { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); +} + +// Assertion for attempting to access module properties on the incoming +// moduleArg. In the past we used this object as the prototype of the module +// and assigned properties to it, but now we return a distinct object. This +// keeps the instance private until it is ready (i.e the promise has been +// resolved). +for (const prop of Object.keys(Module)) { + if (!(prop in moduleArg)) { + Object.defineProperty(moduleArg, prop, { + configurable: true, + get() { + abort(`Access to module property ('${prop}') is no longer possible via the module constructor argument; Instead, use the result of the module constructor.`) + } + }); + } +} +// end include: postamble_modularize.js + + + + return moduleRtn; + }; +})(); + +// Export using a UMD style export, or ES6 exports if selected +if (typeof exports === 'object' && typeof module === 'object') { + module.exports = createModule; + // This default export looks redundant, but it allows TS to import this + // commonjs style module. + module.exports.default = createModule; +} else if (typeof define === 'function' && define['amd']) + define([], () => createModule); + diff --git a/web/public/libs/cardcode.wasm b/web/public/libs/cardcode.wasm new file mode 100755 index 0000000000000000000000000000000000000000..5261e714d09020af3e54af64e0cae184d1b9c37d GIT binary patch literal 434005 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 z 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 i); + +const allowedChars = " .,-\"/abcdefghijklmnopqrstuvwxyz"; + +function sanitizeInput(value) { + return value + .toLowerCase() + .split('') + .filter((c) => allowedChars.includes(c)) + .join('') + .slice(0, 45); +} + +function App() { + const [mode, setMode] = useState('encode'); + + // encode states + const [text, setText] = useState(''); + const [deck, setDeck] = useState([]); + + // decode states + const [order, setOrder] = useState(Array.from({ length: 52 }, (_, i) => i)); + const [decodedText, setDecodedText] = useState(''); + const [dragIdx, setDragIdx] = useState(null); + const [overIdx, setOverIdx] = useState(null); + + // encryption + const [useEncryption, setUseEncryption] = useState(false); + const [key, setKey] = useState(''); + + // misc + const [elapsedMs, setElapsedMs] = useState(null); + const [wasm, setWasm] = useState(null); + + // Load the WASM module once on mount + useEffect(() => { + if (!window.createModule) return; + window.createModule().then((m) => setWasm(m)); + }, []); + + // ENCODE: compute deck when text/key changes + useEffect(() => { + if (mode !== 'encode' || !wasm) return; + + const sanitizedText = sanitizeInput(text); + if (sanitizedText !== text) { + setText(sanitizedText); + return; + } + + if (useEncryption && key.trim() === '') { + setDeck(defaultDeck); + return; + } + + const sanitizedKey = sanitizeInput(key); + + // If no text, simply use default deck without calling WASM to avoid errors + if (sanitizedText.length === 0) { + setDeck(defaultDeck); + return; + } + + const start = performance.now(); + let wasmResult; + try { + wasmResult = useEncryption + ? wasm.textToPackOfCardsEncrypted(sanitizedText, sanitizedKey) + : wasm.textToPackOfCards(sanitizedText); + } catch { + // fallback to default deck on any error + wasmResult = defaultDeck; + } + const jsArray = Array.from(wasmResult); + if (jsArray.length !== 52) { + setDeck(defaultDeck); + } else { + setDeck(jsArray); + } + setElapsedMs(performance.now() - start); + }, [mode, text, key, useEncryption, wasm]); + + // DECODE: compute text when order/key changes + useEffect(() => { + if (mode !== 'decode' || !wasm) return; + + const sanitizedKey = sanitizeInput(key); + const start = performance.now(); + const deckArray = Int32Array.from(order.length === 52 ? order : defaultDeck); + let result; + if (useEncryption) { + console.log("encrypted", deckArray, sanitizedKey); + result = wasm.packOfCardsToTextEncrypted(deckArray, sanitizedKey); + } else { + console.log("unencrypted", deckArray); + result = wasm.packOfCardsToText(deckArray); + } + setElapsedMs(performance.now() - start); + setDecodedText(result); + }, [mode, order, key, useEncryption, wasm]); + + const handleChange = (e) => { + setText(sanitizeInput(e.target.value)); + }; + + const handleKeyChange = (e) => { + setKey(sanitizeInput(e.target.value)); + }; + + // drag handlers for decode reorder + const handleDrop = useCallback( + (targetIdx) => { + setOrder((prev) => { + if (dragIdx === null || dragIdx === targetIdx) return prev; + const newOrder = [...prev]; + // Remove the dragged item from its current position + const draggedItem = newOrder.splice(dragIdx, 1)[0]; + // Insert it at the target position + newOrder.splice(targetIdx, 0, draggedItem); + return newOrder; + }); + setDragIdx(null); + setOverIdx(null); + }, + [dragIdx] + ); + + const resetDecode = () => { + setOrder(Array.from({ length: 52 }, (_, i) => i)); + setDecodedText(''); + setElapsedMs(null); + }; + + return ( +

+ {/* Header with attribution */} +
+ + + {/* Mode Toggle - Segmented Control */} +
+
+ + +
+
+
+ + {/* Main content area */} +
+ {/* encryption toggle & key */} +
+
+
+ + {/* MODE: ENCODE */} + {mode === 'encode' && ( + <> +
+ +

+ Allowed characters: space, period, comma, hyphen, double quote, slash, a-z. +

+
+ +
+

Card Deck Output

+
+ {deck.map((idx, i) => ( + + ))} +
+
+ + )} + + {/* MODE: DECODE */} + {mode === 'decode' && ( + <> +
+ +
+ +
+

Drag Cards to Reorder

+ {/* draggable card grid */} +
+ {order.map((cardIdx, gridIdx) => ( + setDragIdx(gridIdx)} + onDragOver={(e) => { + e.preventDefault(); + setOverIdx(gridIdx); + }} + onDrop={() => handleDrop(gridIdx)} + onDragLeave={() => setOverIdx(null)} + dropTarget={overIdx === gridIdx && dragIdx !== gridIdx} + /> + ))} +
+
+ + {/* decoded output */} + {decodedText && ( +
+

Decoded Text

+
+ {decodedText} +
+
+ )} + + )} + + {/* Performance info */} + {elapsedMs !== null && ( +
+ Last conversion took {elapsedMs.toFixed(1)} ms +
+ )} +
+ + {/* Credits section */} + +
+ ); +} + +export default App; diff --git a/web/src/components/Card.jsx b/web/src/components/Card.jsx new file mode 100644 index 0000000..5bc0e8c --- /dev/null +++ b/web/src/components/Card.jsx @@ -0,0 +1,50 @@ +import React from 'react'; + +const cardList = [ + 'A♠', '2♠', '3♠', '4♠', '5♠', '6♠', '7♠', '8♠', '9♠', '10♠', 'J♠', 'Q♠', 'K♠', + 'A♥', '2♥', '3♥', '4♥', '5♥', '6♥', '7♥', '8♥', '9♥', '10♥', 'J♥', 'Q♥', 'K♥', + 'A♦', '2♦', '3♦', '4♦', '5♦', '6♦', '7♦', '8♦', '9♦', '10♦', 'J♦', 'Q♦', 'K♦', + 'A♣', '2♣', '3♣', '4♣', '5♣', '6♣', '7♣', '8♣', '9♣', '10♣', 'J♣', 'Q♣', 'K♣', +]; + +function getCardInfo(index) { + const str = cardList[index]; + // Rank could be 1 or 2 characters (A vs 10) + const suit = str.slice(-1); + const rank = str.slice(0, -1); + return { rank, suit }; +} + +function Card({ index, onClick, selected = false, disabled = false, dropTarget = false, ...rest }) { + const { rank, suit } = getCardInfo(index); + const isRed = suit === '♥' || suit === '♦'; + + const baseClasses = + 'relative w-12 h-16 m-1 bg-white border rounded-lg shadow text-xs font-bold flex flex-col justify-between p-1 select-none'; + const colorClass = isRed ? 'text-red-600' : 'text-black'; + const selectedClass = selected ? 'ring-2 ring-blue-500' : ''; + const disabledClass = disabled ? 'opacity-50 cursor-default' : 'cursor-pointer hover:shadow-lg'; + + return ( +
+ {dropTarget && ( +
+ )} + + {rank} + {suit} + + + {rank} + {suit} + +
+ ); +} + +export { cardList }; +export default Card; \ No newline at end of file diff --git a/web/src/index.css b/web/src/index.css new file mode 100644 index 0000000..f1d8c73 --- /dev/null +++ b/web/src/index.css @@ -0,0 +1 @@ +@import "tailwindcss"; diff --git a/web/src/main.jsx b/web/src/main.jsx new file mode 100644 index 0000000..4059c19 --- /dev/null +++ b/web/src/main.jsx @@ -0,0 +1,13 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.jsx' + +createRoot(document.getElementById('root')).render( +
+ + + +
+ +) diff --git a/web/vite.config.js b/web/vite.config.js new file mode 100644 index 0000000..c4069b7 --- /dev/null +++ b/web/vite.config.js @@ -0,0 +1,8 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import tailwindcss from '@tailwindcss/vite' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react(), tailwindcss()], +})