From 7056edce28f13a39cdc390da82ef8a0eaa4fb6ce Mon Sep 17 00:00:00 2001 From: Evgeny Khudoba Date: Fri, 13 Mar 2026 17:45:46 +0700 Subject: [PATCH] fix(nix): replace manual hash management with bun2nix (#1021) * fix(nix): replace manual hash management with bun2nix Eliminate the recurring problem of Nix build hashes breaking whenever bun dependencies change or the bun version in nixpkgs updates. Changes: - Add bun2nix flake input (pinned to v2.0.1) for per-package fetchurl expressions from bun.lock, replacing the single FOD hash approach - Use allowBuiltinFetchGit for cargo git dependencies, removing manual outputHashes that required updates on every git dep change - Add scripts/check-nix-deps.ts (cross-platform, runs via bun) that auto-regenerates .nix/bun.nix when bun.lock changes, triggered by the postinstall hook in package.json - Update CI workflow to verify bun.nix is in sync and evaluate flake - Remove scripts/update-nix-hashes.sh (no longer needed) * style: format check-nix-deps.ts with prettier * ci(nix): make nix-check job a required check * fix(nix): address review feedback - Fix bun2nix input pinning: use path syntax (github:owner/repo/tag) instead of ?tag= query parameter so flake.lock records the ref and `nix flake update` respects the pin - Make check-nix-deps.ts exit with 0 on bun2nix failure so that `bun install` is not blocked for non-Nix developers (CI validates bun.nix independently) - Fix stale reference to check-nix-deps.sh in flake.nix comment * ci(nix): add full nix build step to CI workflow Add `nix build .#handy -L --show-trace` after flake evaluation to catch runtime build errors (broken dependencies, sandbox issues, compilation failures) that flake eval alone cannot detect. * fix(nix): update bun2nix pin from 2.0.1 to 2.0.8 bun2nix 2.0.1 has a bug in cache-entry-creator that causes "ln: failed to create symbolic link '/p': Permission denied" during the build. Version 2.0.8 fixes this. --- .github/workflows/nix-check.yml | 63 +- .nix/bun-lock-hash | 1 + .nix/bun.nix | 1400 +++++++++++++++++++++++++++++++ flake.lock | 110 +++ flake.nix | 99 ++- package.json | 3 +- scripts/check-nix-deps.ts | 81 ++ scripts/update-nix-hashes.sh | 203 ----- 8 files changed, 1695 insertions(+), 265 deletions(-) create mode 100644 .nix/bun-lock-hash create mode 100644 .nix/bun.nix create mode 100644 scripts/check-nix-deps.ts delete mode 100755 scripts/update-nix-hashes.sh diff --git a/.github/workflows/nix-check.yml b/.github/workflows/nix-check.yml index ea97466..6f25d41 100644 --- a/.github/workflows/nix-check.yml +++ b/.github/workflows/nix-check.yml @@ -1,18 +1,62 @@ +# Verify that Nix dependency files (.nix/bun.nix) are in sync with lockfiles +# and that the flake evaluates successfully. +# +# This catches cases where a developer updated bun.lock but forgot to +# regenerate .nix/bun.nix (e.g., committed without running bun install, +# which triggers the postinstall hook). + name: "nix build check" on: [pull_request] jobs: nix-build: runs-on: ubuntu-24.04 - continue-on-error: true + continue-on-error: false steps: - uses: actions/checkout@v4 + - uses: oven-sh/setup-bun@v2 + - uses: cachix/install-nix-action@v30 with: nix_path: nixpkgs=channel:nixos-unstable + # Regenerate .nix/bun.nix from bun.lock and check if it matches + # what's committed. A diff means the developer forgot to run + # bun scripts/check-nix-deps.ts or bun install (which triggers it). + - name: Check bun.nix is up to date + id: bun-check + run: | + bunx bun2nix -o .nix/bun.nix + if ! git diff --quiet .nix/bun.nix; then + echo "outdated=true" >> "$GITHUB_OUTPUT" + fi + + - name: Hint on outdated bun.nix + if: steps.bun-check.outputs.outdated == 'true' + run: | + echo "" + echo "::warning::.nix/bun.nix is out of sync with bun.lock" + echo "" + echo "┌──────────────────────────────────────────────────────────────┐" + echo "│ .nix/bun.nix is outdated. To fix, run: │" + echo "│ │" + echo "│ bun scripts/check-nix-deps.ts │" + echo "│ │" + echo "│ Or simply run 'bun install' — the postinstall hook will │" + echo "│ regenerate it automatically. Commit the resulting changes. │" + echo "└──────────────────────────────────────────────────────────────┘" + echo "" + echo "Diff:" + git diff .nix/bun.nix + exit 1 + + # Evaluate the flake to catch issues with cargo git dependency hashes, + # missing inputs, or other Nix expression errors. + # Skip if bun.nix is already outdated — nix eval would fail with a + # cryptic error, and the bun-check step already printed a clear message. - name: Check flake evaluation + if: steps.bun-check.outputs.outdated != 'true' id: eval run: | if ! nix eval .#packages.x86_64-linux.handy.drvPath 2>eval_err.log; then @@ -24,16 +68,13 @@ jobs: if: steps.eval.outputs.failed == 'true' run: | echo "" - echo "::warning::flake.nix evaluation failed — likely outdated outputHashes or bunDeps hash." - echo "" - echo "┌─────────────────────────────────────────────────────────────────┐" - echo "│ To fix, run on NixOS, Ubuntu/Debian, macOS with nix installed: │" - echo "│ │" - echo "│ ./scripts/update-nix-hashes.sh │" - echo "│ │" - echo "│ The script will update version keys and hashes in flake.nix │" - echo "│ automatically. Commit the resulting changes. │" - echo "└─────────────────────────────────────────────────────────────────┘" + echo "::warning::flake.nix evaluation failed" echo "" cat eval_err.log exit 1 + + # Full build — catches runtime build errors (broken dependencies, + # sandbox issues, compilation failures) that flake eval alone misses. + - name: Build handy + if: steps.bun-check.outputs.outdated != 'true' && steps.eval.outputs.failed != 'true' + run: nix build .#handy -L --show-trace diff --git a/.nix/bun-lock-hash b/.nix/bun-lock-hash new file mode 100644 index 0000000..a34f755 --- /dev/null +++ b/.nix/bun-lock-hash @@ -0,0 +1 @@ +e00b12c719a762004194cec01f2ad0b78ae483c41452bcca8537179d28e704b1 diff --git a/.nix/bun.nix b/.nix/bun.nix new file mode 100644 index 0000000..55ffb84 --- /dev/null +++ b/.nix/bun.nix @@ -0,0 +1,1400 @@ +# Autogenerated by `bun2nix`, editing manually is not recommended +# +# Set of Bun packages to install +# +# Consume this with `fetchBunDeps` (recommended) +# or `pkgs.callPackage` if you wish to handle +# it manually. +{ + copyPathToStore, + fetchFromGitHub, + fetchgit, + fetchurl, + ... +}: +{ + "@babel/code-frame@7.27.1" = fetchurl { + url = "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz"; + hash = "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="; + }; + "@babel/compat-data@7.28.5" = fetchurl { + url = "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz"; + hash = "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA=="; + }; + "@babel/core@7.28.5" = fetchurl { + url = "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz"; + hash = "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="; + }; + "@babel/generator@7.28.5" = fetchurl { + url = "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz"; + hash = "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ=="; + }; + "@babel/helper-compilation-targets@7.27.2" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz"; + hash = "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="; + }; + "@babel/helper-globals@7.28.0" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz"; + hash = "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="; + }; + "@babel/helper-module-imports@7.27.1" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz"; + hash = "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="; + }; + "@babel/helper-module-transforms@7.28.3" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz"; + hash = "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw=="; + }; + "@babel/helper-plugin-utils@7.27.1" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz"; + hash = "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="; + }; + "@babel/helper-string-parser@7.27.1" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz"; + hash = "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="; + }; + "@babel/helper-validator-identifier@7.28.5" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz"; + hash = "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="; + }; + "@babel/helper-validator-option@7.27.1" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz"; + hash = "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="; + }; + "@babel/helpers@7.28.4" = fetchurl { + url = "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz"; + hash = "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w=="; + }; + "@babel/parser@7.28.5" = fetchurl { + url = "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz"; + hash = "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ=="; + }; + "@babel/plugin-transform-react-jsx-self@7.27.1" = fetchurl { + url = "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz"; + hash = "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="; + }; + "@babel/plugin-transform-react-jsx-source@7.27.1" = fetchurl { + url = "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz"; + hash = "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="; + }; + "@babel/runtime@7.28.4" = fetchurl { + url = "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz"; + hash = "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ=="; + }; + "@babel/template@7.27.2" = fetchurl { + url = "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz"; + hash = "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="; + }; + "@babel/traverse@7.28.5" = fetchurl { + url = "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz"; + hash = "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ=="; + }; + "@babel/types@7.28.5" = fetchurl { + url = "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz"; + hash = "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA=="; + }; + "@emnapi/core@1.6.0" = fetchurl { + url = "https://registry.npmjs.org/@emnapi/core/-/core-1.6.0.tgz"; + hash = "sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg=="; + }; + "@emnapi/runtime@1.6.0" = fetchurl { + url = "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.6.0.tgz"; + hash = "sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA=="; + }; + "@emnapi/wasi-threads@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz"; + hash = "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="; + }; + "@emotion/babel-plugin@11.13.5" = fetchurl { + url = "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz"; + hash = "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ=="; + }; + "@emotion/cache@11.14.0" = fetchurl { + url = "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz"; + hash = "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA=="; + }; + "@emotion/hash@0.9.2" = fetchurl { + url = "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz"; + hash = "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g=="; + }; + "@emotion/memoize@0.9.0" = fetchurl { + url = "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz"; + hash = "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ=="; + }; + "@emotion/react@11.14.0" = fetchurl { + url = "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz"; + hash = "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA=="; + }; + "@emotion/serialize@1.3.3" = fetchurl { + url = "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz"; + hash = "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA=="; + }; + "@emotion/sheet@1.4.0" = fetchurl { + url = "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz"; + hash = "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg=="; + }; + "@emotion/unitless@0.10.0" = fetchurl { + url = "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz"; + hash = "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg=="; + }; + "@emotion/use-insertion-effect-with-fallbacks@1.2.0" = fetchurl { + url = "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz"; + hash = "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg=="; + }; + "@emotion/utils@1.4.2" = fetchurl { + url = "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz"; + hash = "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA=="; + }; + "@emotion/weak-memoize@0.4.0" = fetchurl { + url = "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz"; + hash = "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg=="; + }; + "@esbuild/aix-ppc64@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz"; + hash = "sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg=="; + }; + "@esbuild/android-arm64@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.11.tgz"; + hash = "sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ=="; + }; + "@esbuild/android-arm@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.11.tgz"; + hash = "sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg=="; + }; + "@esbuild/android-x64@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.11.tgz"; + hash = "sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g=="; + }; + "@esbuild/darwin-arm64@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz"; + hash = "sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w=="; + }; + "@esbuild/darwin-x64@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.11.tgz"; + hash = "sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ=="; + }; + "@esbuild/freebsd-arm64@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.11.tgz"; + hash = "sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA=="; + }; + "@esbuild/freebsd-x64@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.11.tgz"; + hash = "sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw=="; + }; + "@esbuild/linux-arm64@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.11.tgz"; + hash = "sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA=="; + }; + "@esbuild/linux-arm@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.11.tgz"; + hash = "sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw=="; + }; + "@esbuild/linux-ia32@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.11.tgz"; + hash = "sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw=="; + }; + "@esbuild/linux-loong64@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.11.tgz"; + hash = "sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw=="; + }; + "@esbuild/linux-mips64el@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.11.tgz"; + hash = "sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ=="; + }; + "@esbuild/linux-ppc64@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.11.tgz"; + hash = "sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw=="; + }; + "@esbuild/linux-riscv64@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.11.tgz"; + hash = "sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww=="; + }; + "@esbuild/linux-s390x@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.11.tgz"; + hash = "sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw=="; + }; + "@esbuild/linux-x64@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.11.tgz"; + hash = "sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ=="; + }; + "@esbuild/netbsd-arm64@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.11.tgz"; + hash = "sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg=="; + }; + "@esbuild/netbsd-x64@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz"; + hash = "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A=="; + }; + "@esbuild/openbsd-arm64@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz"; + hash = "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg=="; + }; + "@esbuild/openbsd-x64@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz"; + hash = "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw=="; + }; + "@esbuild/openharmony-arm64@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz"; + hash = "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ=="; + }; + "@esbuild/sunos-x64@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz"; + hash = "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA=="; + }; + "@esbuild/win32-arm64@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz"; + hash = "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q=="; + }; + "@esbuild/win32-ia32@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz"; + hash = "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA=="; + }; + "@esbuild/win32-x64@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz"; + hash = "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA=="; + }; + "@eslint-community/eslint-utils@4.9.0" = fetchurl { + url = "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz"; + hash = "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="; + }; + "@eslint-community/regexpp@4.12.2" = fetchurl { + url = "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz"; + hash = "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="; + }; + "@eslint/config-array@0.21.1" = fetchurl { + url = "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz"; + hash = "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA=="; + }; + "@eslint/config-helpers@0.4.2" = fetchurl { + url = "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz"; + hash = "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="; + }; + "@eslint/core@0.17.0" = fetchurl { + url = "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz"; + hash = "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="; + }; + "@eslint/eslintrc@3.3.3" = fetchurl { + url = "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz"; + hash = "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ=="; + }; + "@eslint/js@9.39.1" = fetchurl { + url = "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz"; + hash = "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw=="; + }; + "@eslint/object-schema@2.1.7" = fetchurl { + url = "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz"; + hash = "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="; + }; + "@eslint/plugin-kit@0.4.1" = fetchurl { + url = "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz"; + hash = "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="; + }; + "@floating-ui/core@1.7.3" = fetchurl { + url = "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz"; + hash = "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w=="; + }; + "@floating-ui/dom@1.7.4" = fetchurl { + url = "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz"; + hash = "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA=="; + }; + "@floating-ui/utils@0.2.10" = fetchurl { + url = "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz"; + hash = "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="; + }; + "@humanfs/core@0.19.1" = fetchurl { + url = "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz"; + hash = "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="; + }; + "@humanfs/node@0.16.7" = fetchurl { + url = "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz"; + hash = "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="; + }; + "@humanwhocodes/module-importer@1.0.1" = fetchurl { + url = "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz"; + hash = "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="; + }; + "@humanwhocodes/retry@0.4.3" = fetchurl { + url = "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz"; + hash = "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="; + }; + "@jridgewell/gen-mapping@0.3.13" = fetchurl { + url = "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz"; + hash = "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="; + }; + "@jridgewell/remapping@2.3.5" = fetchurl { + url = "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz"; + hash = "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="; + }; + "@jridgewell/resolve-uri@3.1.2" = fetchurl { + url = "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz"; + hash = "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="; + }; + "@jridgewell/sourcemap-codec@1.5.5" = fetchurl { + url = "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz"; + hash = "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="; + }; + "@jridgewell/trace-mapping@0.3.31" = fetchurl { + url = "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz"; + hash = "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="; + }; + "@napi-rs/wasm-runtime@1.0.7" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz"; + hash = "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw=="; + }; + "@playwright/test@1.58.0" = fetchurl { + url = "https://registry.npmjs.org/@playwright/test/-/test-1.58.0.tgz"; + hash = "sha512-fWza+Lpbj6SkQKCrU6si4iu+fD2dD3gxNHFhUPxsfXBPhnv3rRSQVd0NtBUT9Z/RhF/boCBcuUaMUSTRTopjZg=="; + }; + "@rolldown/pluginutils@1.0.0-beta.27" = fetchurl { + url = "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz"; + hash = "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="; + }; + "@rollup/rollup-android-arm-eabi@4.52.5" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.5.tgz"; + hash = "sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ=="; + }; + "@rollup/rollup-android-arm64@4.52.5" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.5.tgz"; + hash = "sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA=="; + }; + "@rollup/rollup-darwin-arm64@4.52.5" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz"; + hash = "sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA=="; + }; + "@rollup/rollup-darwin-x64@4.52.5" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.5.tgz"; + hash = "sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA=="; + }; + "@rollup/rollup-freebsd-arm64@4.52.5" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.5.tgz"; + hash = "sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA=="; + }; + "@rollup/rollup-freebsd-x64@4.52.5" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.5.tgz"; + hash = "sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ=="; + }; + "@rollup/rollup-linux-arm-gnueabihf@4.52.5" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.5.tgz"; + hash = "sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ=="; + }; + "@rollup/rollup-linux-arm-musleabihf@4.52.5" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.5.tgz"; + hash = "sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ=="; + }; + "@rollup/rollup-linux-arm64-gnu@4.52.5" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.5.tgz"; + hash = "sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg=="; + }; + "@rollup/rollup-linux-arm64-musl@4.52.5" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.5.tgz"; + hash = "sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q=="; + }; + "@rollup/rollup-linux-loong64-gnu@4.52.5" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.5.tgz"; + hash = "sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA=="; + }; + "@rollup/rollup-linux-ppc64-gnu@4.52.5" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.5.tgz"; + hash = "sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw=="; + }; + "@rollup/rollup-linux-riscv64-gnu@4.52.5" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.5.tgz"; + hash = "sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw=="; + }; + "@rollup/rollup-linux-riscv64-musl@4.52.5" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.5.tgz"; + hash = "sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg=="; + }; + "@rollup/rollup-linux-s390x-gnu@4.52.5" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.5.tgz"; + hash = "sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ=="; + }; + "@rollup/rollup-linux-x64-gnu@4.52.5" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.5.tgz"; + hash = "sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q=="; + }; + "@rollup/rollup-linux-x64-musl@4.52.5" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.5.tgz"; + hash = "sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg=="; + }; + "@rollup/rollup-openharmony-arm64@4.52.5" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.5.tgz"; + hash = "sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw=="; + }; + "@rollup/rollup-win32-arm64-msvc@4.52.5" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.5.tgz"; + hash = "sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w=="; + }; + "@rollup/rollup-win32-ia32-msvc@4.52.5" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.5.tgz"; + hash = "sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg=="; + }; + "@rollup/rollup-win32-x64-gnu@4.52.5" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.5.tgz"; + hash = "sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ=="; + }; + "@rollup/rollup-win32-x64-msvc@4.52.5" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.5.tgz"; + hash = "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg=="; + }; + "@tailwindcss/node@4.1.16" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.16.tgz"; + hash = "sha512-BX5iaSsloNuvKNHRN3k2RcCuTEgASTo77mofW0vmeHkfrDWaoFAFvNHpEgtu0eqyypcyiBkDWzSMxJhp3AUVcw=="; + }; + "@tailwindcss/oxide-android-arm64@4.1.16" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.16.tgz"; + hash = "sha512-8+ctzkjHgwDJ5caq9IqRSgsP70xhdhJvm+oueS/yhD5ixLhqTw9fSL1OurzMUhBwE5zK26FXLCz2f/RtkISqHA=="; + }; + "@tailwindcss/oxide-darwin-arm64@4.1.16" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.16.tgz"; + hash = "sha512-C3oZy5042v2FOALBZtY0JTDnGNdS6w7DxL/odvSny17ORUnaRKhyTse8xYi3yKGyfnTUOdavRCdmc8QqJYwFKA=="; + }; + "@tailwindcss/oxide-darwin-x64@4.1.16" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.16.tgz"; + hash = "sha512-vjrl/1Ub9+JwU6BP0emgipGjowzYZMjbWCDqwA2Z4vCa+HBSpP4v6U2ddejcHsolsYxwL5r4bPNoamlV0xDdLg=="; + }; + "@tailwindcss/oxide-freebsd-x64@4.1.16" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.16.tgz"; + hash = "sha512-TSMpPYpQLm+aR1wW5rKuUuEruc/oOX3C7H0BTnPDn7W/eMw8W+MRMpiypKMkXZfwH8wqPIRKppuZoedTtNj2tg=="; + }; + "@tailwindcss/oxide-linux-arm-gnueabihf@4.1.16" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.16.tgz"; + hash = "sha512-p0GGfRg/w0sdsFKBjMYvvKIiKy/LNWLWgV/plR4lUgrsxFAoQBFrXkZ4C0w8IOXfslB9vHK/JGASWD2IefIpvw=="; + }; + "@tailwindcss/oxide-linux-arm64-gnu@4.1.16" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.16.tgz"; + hash = "sha512-DoixyMmTNO19rwRPdqviTrG1rYzpxgyYJl8RgQvdAQUzxC1ToLRqtNJpU/ATURSKgIg6uerPw2feW0aS8SNr/w=="; + }; + "@tailwindcss/oxide-linux-arm64-musl@4.1.16" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.16.tgz"; + hash = "sha512-H81UXMa9hJhWhaAUca6bU2wm5RRFpuHImrwXBUvPbYb+3jo32I9VIwpOX6hms0fPmA6f2pGVlybO6qU8pF4fzQ=="; + }; + "@tailwindcss/oxide-linux-x64-gnu@4.1.16" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.16.tgz"; + hash = "sha512-ZGHQxDtFC2/ruo7t99Qo2TTIvOERULPl5l0K1g0oK6b5PGqjYMga+FcY1wIUnrUxY56h28FxybtDEla+ICOyew=="; + }; + "@tailwindcss/oxide-linux-x64-musl@4.1.16" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.16.tgz"; + hash = "sha512-Oi1tAaa0rcKf1Og9MzKeINZzMLPbhxvm7rno5/zuP1WYmpiG0bEHq4AcRUiG2165/WUzvxkW4XDYCscZWbTLZw=="; + }; + "@tailwindcss/oxide-wasm32-wasi@4.1.16" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.16.tgz"; + hash = "sha512-B01u/b8LteGRwucIBmCQ07FVXLzImWESAIMcUU6nvFt/tYsQ6IHz8DmZ5KtvmwxD+iTYBtM1xwoGXswnlu9v0Q=="; + }; + "@tailwindcss/oxide-win32-arm64-msvc@4.1.16" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.16.tgz"; + hash = "sha512-zX+Q8sSkGj6HKRTMJXuPvOcP8XfYON24zJBRPlszcH1Np7xuHXhWn8qfFjIujVzvH3BHU+16jBXwgpl20i+v9A=="; + }; + "@tailwindcss/oxide-win32-x64-msvc@4.1.16" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.16.tgz"; + hash = "sha512-m5dDFJUEejbFqP+UXVstd4W/wnxA4F61q8SoL+mqTypId2T2ZpuxosNSgowiCnLp2+Z+rivdU0AqpfgiD7yCBg=="; + }; + "@tailwindcss/oxide@4.1.16" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.16.tgz"; + hash = "sha512-2OSv52FRuhdlgyOQqgtQHuCgXnS8nFSYRp2tJ+4WZXKgTxqPy7SMSls8c3mPT5pkZ17SBToGM5LHEJBO7miEdg=="; + }; + "@tailwindcss/vite@4.1.16" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.16.tgz"; + hash = "sha512-bbguNBcDxsRmi9nnlWJxhfDWamY3lmcyACHcdO1crxfzuLpOhHLLtEIN/nCbbAtj5rchUgQD17QVAKi1f7IsKg=="; + }; + "@tauri-apps/api@2.10.1" = fetchurl { + url = "https://registry.npmjs.org/@tauri-apps/api/-/api-2.10.1.tgz"; + hash = "sha512-hKL/jWf293UDSUN09rR69hrToyIXBb8CjGaWC7gfinvnQrBVvnLr08FeFi38gxtugAVyVcTa5/FD/Xnkb1siBw=="; + }; + "@tauri-apps/api@2.9.0" = fetchurl { + url = "https://registry.npmjs.org/@tauri-apps/api/-/api-2.9.0.tgz"; + hash = "sha512-qD5tMjh7utwBk9/5PrTA/aGr3i5QaJ/Mlt7p8NilQ45WgbifUNPyKWsA63iQ8YfQq6R8ajMapU+/Q8nMcPRLNw=="; + }; + "@tauri-apps/cli-darwin-arm64@2.10.0" = fetchurl { + url = "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.10.0.tgz"; + hash = "sha512-avqHD4HRjrMamE/7R/kzJPcAJnZs0IIS+1nkDP5b+TNBn3py7N2aIo9LIpy+VQq0AkN8G5dDpZtOOBkmWt/zjA=="; + }; + "@tauri-apps/cli-darwin-x64@2.10.0" = fetchurl { + url = "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.10.0.tgz"; + hash = "sha512-keDmlvJRStzVFjZTd0xYkBONLtgBC9eMTpmXnBXzsHuawV2q9PvDo2x6D5mhuoMVrJ9QWjgaPKBBCFks4dK71Q=="; + }; + "@tauri-apps/cli-linux-arm-gnueabihf@2.10.0" = fetchurl { + url = "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.10.0.tgz"; + hash = "sha512-e5u0VfLZsMAC9iHaOEANumgl6lfnJx0Dtjkd8IJpysZ8jp0tJ6wrIkto2OzQgzcYyRCKgX72aKE0PFgZputA8g=="; + }; + "@tauri-apps/cli-linux-arm64-gnu@2.10.0" = fetchurl { + url = "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.10.0.tgz"; + hash = "sha512-YrYYk2dfmBs5m+OIMCrb+JH/oo+4FtlpcrTCgiFYc7vcs6m3QDd1TTyWu0u01ewsCtK2kOdluhr/zKku+KP7HA=="; + }; + "@tauri-apps/cli-linux-arm64-musl@2.10.0" = fetchurl { + url = "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.10.0.tgz"; + hash = "sha512-GUoPdVJmrJRIXFfW3Rkt+eGK9ygOdyISACZfC/bCSfOnGt8kNdQIQr5WRH9QUaTVFIwxMlQyV3m+yXYP+xhSVA=="; + }; + "@tauri-apps/cli-linux-riscv64-gnu@2.10.0" = fetchurl { + url = "https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.10.0.tgz"; + hash = "sha512-JO7s3TlSxshwsoKNCDkyvsx5gw2QAs/Y2GbR5UE2d5kkU138ATKoPOtxn8G1fFT1aDW4LH0rYAAfBpGkDyJJnw=="; + }; + "@tauri-apps/cli-linux-x64-gnu@2.10.0" = fetchurl { + url = "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.10.0.tgz"; + hash = "sha512-Uvh4SUUp4A6DVRSMWjelww0GnZI3PlVy7VS+DRF5napKuIehVjGl9XD0uKoCoxwAQBLctvipyEK+pDXpJeoHng=="; + }; + "@tauri-apps/cli-linux-x64-musl@2.10.0" = fetchurl { + url = "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.10.0.tgz"; + hash = "sha512-AP0KRK6bJuTpQ8kMNWvhIpKUkQJfcPFeba7QshOQZjJ8wOS6emwTN4K5g/d3AbCMo0RRdnZWwu67MlmtJyxC1Q=="; + }; + "@tauri-apps/cli-win32-arm64-msvc@2.10.0" = fetchurl { + url = "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.10.0.tgz"; + hash = "sha512-97DXVU3dJystrq7W41IX+82JEorLNY+3+ECYxvXWqkq7DBN6FsA08x/EFGE8N/b0LTOui9X2dvpGGoeZKKV08g=="; + }; + "@tauri-apps/cli-win32-ia32-msvc@2.10.0" = fetchurl { + url = "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.10.0.tgz"; + hash = "sha512-EHyQ1iwrWy1CwMalEm9z2a6L5isQ121pe7FcA2xe4VWMJp+GHSDDGvbTv/OPdkt2Lyr7DAZBpZHM6nvlHXEc4A=="; + }; + "@tauri-apps/cli-win32-x64-msvc@2.10.0" = fetchurl { + url = "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.10.0.tgz"; + hash = "sha512-NTpyQxkpzGmU6ceWBTY2xRIEaS0ZLbVx1HE1zTA3TY/pV3+cPoPPOs+7YScr4IMzXMtOw7tLw5LEXo5oIG3qaQ=="; + }; + "@tauri-apps/cli@2.10.0" = fetchurl { + url = "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.10.0.tgz"; + hash = "sha512-ZwT0T+7bw4+DPCSWzmviwq5XbXlM0cNoleDKOYPFYqcZqeKY31KlpoMW/MOON/tOFBPgi31a2v3w9gliqwL2+Q=="; + }; + "@tauri-apps/plugin-autostart@2.5.1" = fetchurl { + url = "https://registry.npmjs.org/@tauri-apps/plugin-autostart/-/plugin-autostart-2.5.1.tgz"; + hash = "sha512-zS/xx7yzveCcotkA+8TqkI2lysmG2wvQXv2HGAVExITmnFfHAdj1arGsbbfs3o6EktRHf6l34pJxc3YGG2mg7w=="; + }; + "@tauri-apps/plugin-clipboard-manager@2.3.2" = fetchurl { + url = "https://registry.npmjs.org/@tauri-apps/plugin-clipboard-manager/-/plugin-clipboard-manager-2.3.2.tgz"; + hash = "sha512-CUlb5Hqi2oZbcZf4VUyUH53XWPPdtpw43EUpCza5HWZJwxEoDowFzNUDt1tRUXA8Uq+XPn17Ysfptip33sG4eQ=="; + }; + "@tauri-apps/plugin-dialog@2.6.0" = fetchurl { + url = "https://registry.npmjs.org/@tauri-apps/plugin-dialog/-/plugin-dialog-2.6.0.tgz"; + hash = "sha512-q4Uq3eY87TdcYzXACiYSPhmpBA76shgmQswGkSVio4C82Sz2W4iehe9TnKYwbq7weHiL88Yw19XZm7v28+Micg=="; + }; + "@tauri-apps/plugin-fs@2.4.4" = fetchurl { + url = "https://registry.npmjs.org/@tauri-apps/plugin-fs/-/plugin-fs-2.4.4.tgz"; + hash = "sha512-MTorXxIRmOnOPT1jZ3w96vjSuScER38ryXY88vl5F0uiKdnvTKKTtaEjTEo8uPbl4e3gnUtfsDVwC7h77GQLvQ=="; + }; + "@tauri-apps/plugin-global-shortcut@2.3.1" = fetchurl { + url = "https://registry.npmjs.org/@tauri-apps/plugin-global-shortcut/-/plugin-global-shortcut-2.3.1.tgz"; + hash = "sha512-vr40W2N6G63dmBPaha1TsBQLLURXG538RQbH5vAm0G/ovVZyXJrmZR1HF1W+WneNloQvwn4dm8xzwpEXRW560g=="; + }; + "@tauri-apps/plugin-opener@2.5.2" = fetchurl { + url = "https://registry.npmjs.org/@tauri-apps/plugin-opener/-/plugin-opener-2.5.2.tgz"; + hash = "sha512-ei/yRRoCklWHImwpCcDK3VhNXx+QXM9793aQ64YxpqVF0BDuuIlXhZgiAkc15wnPVav+IbkYhmDJIv5R326Mew=="; + }; + "@tauri-apps/plugin-os@2.3.2" = fetchurl { + url = "https://registry.npmjs.org/@tauri-apps/plugin-os/-/plugin-os-2.3.2.tgz"; + hash = "sha512-n+nXWeuSeF9wcEsSPmRnBEGrRgOy6jjkSU+UVCOV8YUGKb2erhDOxis7IqRXiRVHhY8XMKks00BJ0OAdkpf6+A=="; + }; + "@tauri-apps/plugin-process@2.3.1" = fetchurl { + url = "https://registry.npmjs.org/@tauri-apps/plugin-process/-/plugin-process-2.3.1.tgz"; + hash = "sha512-nCa4fGVaDL/B9ai03VyPOjfAHRHSBz5v6F/ObsB73r/dA3MHHhZtldaDMIc0V/pnUw9ehzr2iEG+XkSEyC0JJA=="; + }; + "@tauri-apps/plugin-sql@2.3.1" = fetchurl { + url = "https://registry.npmjs.org/@tauri-apps/plugin-sql/-/plugin-sql-2.3.1.tgz"; + hash = "sha512-iNgHnFIR+jRkx9INKVKepzMlxXtNkJUaWuhagFjT4dOttPaNyRnVHgwTjpqZhyVjiklDh2UdEPAJkQKiCPAekw=="; + }; + "@tauri-apps/plugin-store@2.4.1" = fetchurl { + url = "https://registry.npmjs.org/@tauri-apps/plugin-store/-/plugin-store-2.4.1.tgz"; + hash = "sha512-ckGSEzZ5Ii4Hf2D5x25Oqnm2Zf9MfDWAzR+volY0z/OOBz6aucPKEY0F649JvQ0Vupku6UJo7ugpGRDOFOunkA=="; + }; + "@tauri-apps/plugin-updater@2.10.0" = fetchurl { + url = "https://registry.npmjs.org/@tauri-apps/plugin-updater/-/plugin-updater-2.10.0.tgz"; + hash = "sha512-ljN8jPlnT0aSn8ecYhuBib84alxfMx6Hc8vJSKMJyzGbTPFZAC44T2I1QNFZssgWKrAlofvJqCC6Rr472JWfkQ=="; + }; + "@tybys/wasm-util@0.10.1" = fetchurl { + url = "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz"; + hash = "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="; + }; + "@types/babel__core@7.20.5" = fetchurl { + url = "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz"; + hash = "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="; + }; + "@types/babel__generator@7.27.0" = fetchurl { + url = "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz"; + hash = "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="; + }; + "@types/babel__template@7.4.4" = fetchurl { + url = "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz"; + hash = "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="; + }; + "@types/babel__traverse@7.28.0" = fetchurl { + url = "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz"; + hash = "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="; + }; + "@types/estree@1.0.8" = fetchurl { + url = "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz"; + hash = "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="; + }; + "@types/json-schema@7.0.15" = fetchurl { + url = "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz"; + hash = "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="; + }; + "@types/node@24.9.1" = fetchurl { + url = "https://registry.npmjs.org/@types/node/-/node-24.9.1.tgz"; + hash = "sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg=="; + }; + "@types/parse-json@4.0.2" = fetchurl { + url = "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz"; + hash = "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="; + }; + "@types/prop-types@15.7.15" = fetchurl { + url = "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz"; + hash = "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw=="; + }; + "@types/react-dom@18.3.7" = fetchurl { + url = "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz"; + hash = "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ=="; + }; + "@types/react-select@5.0.1" = fetchurl { + url = "https://registry.npmjs.org/@types/react-select/-/react-select-5.0.1.tgz"; + hash = "sha512-h5Im0AP0dr4AVeHtrcvQrLV+gmPa7SA0AGdxl2jOhtwiE6KgXBFSogWw8az32/nusE6AQHlCOHQWjP1S/+oMWA=="; + }; + "@types/react-transition-group@4.4.12" = fetchurl { + url = "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz"; + hash = "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w=="; + }; + "@types/react@18.3.26" = fetchurl { + url = "https://registry.npmjs.org/@types/react/-/react-18.3.26.tgz"; + hash = "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA=="; + }; + "@typescript-eslint/eslint-plugin@8.49.0" = fetchurl { + url = "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.49.0.tgz"; + hash = "sha512-JXij0vzIaTtCwu6SxTh8qBc66kmf1xs7pI4UOiMDFVct6q86G0Zs7KRcEoJgY3Cav3x5Tq0MF5jwgpgLqgKG3A=="; + }; + "@typescript-eslint/parser@8.49.0" = fetchurl { + url = "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.49.0.tgz"; + hash = "sha512-N9lBGA9o9aqb1hVMc9hzySbhKibHmB+N3IpoShyV6HyQYRGIhlrO5rQgttypi+yEeKsKI4idxC8Jw6gXKD4THA=="; + }; + "@typescript-eslint/project-service@8.49.0" = fetchurl { + url = "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.49.0.tgz"; + hash = "sha512-/wJN0/DKkmRUMXjZUXYZpD1NEQzQAAn9QWfGwo+Ai8gnzqH7tvqS7oNVdTjKqOcPyVIdZdyCMoqN66Ia789e7g=="; + }; + "@typescript-eslint/scope-manager@8.49.0" = fetchurl { + url = "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.49.0.tgz"; + hash = "sha512-npgS3zi+/30KSOkXNs0LQXtsg9ekZ8OISAOLGWA/ZOEn0ZH74Ginfl7foziV8DT+D98WfQ5Kopwqb/PZOaIJGg=="; + }; + "@typescript-eslint/tsconfig-utils@8.49.0" = fetchurl { + url = "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.49.0.tgz"; + hash = "sha512-8prixNi1/6nawsRYxet4YOhnbW+W9FK/bQPxsGB1D3ZrDzbJ5FXw5XmzxZv82X3B+ZccuSxo/X8q9nQ+mFecWA=="; + }; + "@typescript-eslint/type-utils@8.49.0" = fetchurl { + url = "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.49.0.tgz"; + hash = "sha512-KTExJfQ+svY8I10P4HdxKzWsvtVnsuCifU5MvXrRwoP2KOlNZ9ADNEWWsQTJgMxLzS5VLQKDjkCT/YzgsnqmZg=="; + }; + "@typescript-eslint/types@8.49.0" = fetchurl { + url = "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.49.0.tgz"; + hash = "sha512-e9k/fneezorUo6WShlQpMxXh8/8wfyc+biu6tnAqA81oWrEic0k21RHzP9uqqpyBBeBKu4T+Bsjy9/b8u7obXQ=="; + }; + "@typescript-eslint/typescript-estree@8.49.0" = fetchurl { + url = "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.49.0.tgz"; + hash = "sha512-jrLdRuAbPfPIdYNppHJ/D0wN+wwNfJ32YTAm10eJVsFmrVpXQnDWBn8niCSMlWjvml8jsce5E/O+86IQtTbJWA=="; + }; + "@typescript-eslint/utils@8.49.0" = fetchurl { + url = "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.49.0.tgz"; + hash = "sha512-N3W7rJw7Rw+z1tRsHZbK395TWSYvufBXumYtEGzypgMUthlg0/hmCImeA8hgO2d2G4pd7ftpxxul2J8OdtdaFA=="; + }; + "@typescript-eslint/visitor-keys@8.49.0" = fetchurl { + url = "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.49.0.tgz"; + hash = "sha512-LlKaciDe3GmZFphXIc79THF/YYBugZ7FS1pO581E/edlVVNbZKDy93evqmrfQ9/Y4uN0vVhX4iuchq26mK/iiA=="; + }; + "@vitejs/plugin-react@4.7.0" = fetchurl { + url = "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz"; + hash = "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA=="; + }; + "acorn-jsx@5.3.2" = fetchurl { + url = "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"; + hash = "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="; + }; + "acorn@8.15.0" = fetchurl { + url = "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz"; + hash = "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="; + }; + "ajv@6.12.6" = fetchurl { + url = "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"; + hash = "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="; + }; + "ansi-styles@4.3.0" = fetchurl { + url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"; + hash = "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="; + }; + "argparse@2.0.1" = fetchurl { + url = "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz"; + hash = "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="; + }; + "babel-plugin-macros@3.1.0" = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz"; + hash = "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg=="; + }; + "balanced-match@1.0.2" = fetchurl { + url = "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"; + hash = "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="; + }; + "baseline-browser-mapping@2.8.20" = fetchurl { + url = "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.20.tgz"; + hash = "sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ=="; + }; + "brace-expansion@1.1.12" = fetchurl { + url = "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz"; + hash = "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="; + }; + "brace-expansion@2.0.2" = fetchurl { + url = "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz"; + hash = "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="; + }; + "browserslist@4.27.0" = fetchurl { + url = "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz"; + hash = "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw=="; + }; + "callsites@3.1.0" = fetchurl { + url = "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz"; + hash = "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="; + }; + "caniuse-lite@1.0.30001751" = fetchurl { + url = "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz"; + hash = "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw=="; + }; + "chalk@4.1.2" = fetchurl { + url = "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"; + hash = "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="; + }; + "color-convert@2.0.1" = fetchurl { + url = "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"; + hash = "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="; + }; + "color-name@1.1.4" = fetchurl { + url = "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"; + hash = "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="; + }; + "concat-map@0.0.1" = fetchurl { + url = "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"; + hash = "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="; + }; + "convert-source-map@1.9.0" = fetchurl { + url = "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz"; + hash = "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="; + }; + "convert-source-map@2.0.0" = fetchurl { + url = "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz"; + hash = "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="; + }; + "cosmiconfig@7.1.0" = fetchurl { + url = "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz"; + hash = "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA=="; + }; + "cross-spawn@7.0.6" = fetchurl { + url = "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz"; + hash = "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="; + }; + "csstype@3.1.3" = fetchurl { + url = "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz"; + hash = "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="; + }; + "debug@4.4.3" = fetchurl { + url = "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz"; + hash = "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="; + }; + "deep-is@0.1.4" = fetchurl { + url = "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz"; + hash = "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="; + }; + "detect-libc@2.1.2" = fetchurl { + url = "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz"; + hash = "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="; + }; + "dom-helpers@5.2.1" = fetchurl { + url = "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz"; + hash = "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA=="; + }; + "electron-to-chromium@1.5.240" = fetchurl { + url = "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.240.tgz"; + hash = "sha512-OBwbZjWgrCOH+g6uJsA2/7Twpas2OlepS9uvByJjR2datRDuKGYeD+nP8lBBks2qnB7bGJNHDUx7c/YLaT3QMQ=="; + }; + "enhanced-resolve@5.18.3" = fetchurl { + url = "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz"; + hash = "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww=="; + }; + "error-ex@1.3.4" = fetchurl { + url = "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz"; + hash = "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="; + }; + "esbuild@0.25.11" = fetchurl { + url = "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz"; + hash = "sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q=="; + }; + "escalade@3.2.0" = fetchurl { + url = "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz"; + hash = "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="; + }; + "escape-string-regexp@4.0.0" = fetchurl { + url = "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"; + hash = "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="; + }; + "eslint-plugin-i18next@6.1.3" = fetchurl { + url = "https://registry.npmjs.org/eslint-plugin-i18next/-/eslint-plugin-i18next-6.1.3.tgz"; + hash = "sha512-z/h4oBRd9wI1ET60HqcLSU6XPeAh/EPOrBBTyCdkWeMoYrWAaUVA+DOQkWTiNIyCltG4NTmy62SQisVXxoXurw=="; + }; + "eslint-scope@8.4.0" = fetchurl { + url = "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz"; + hash = "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="; + }; + "eslint-visitor-keys@3.4.3" = fetchurl { + url = "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"; + hash = "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="; + }; + "eslint-visitor-keys@4.2.1" = fetchurl { + url = "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz"; + hash = "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="; + }; + "eslint@9.39.1" = fetchurl { + url = "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz"; + hash = "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g=="; + }; + "espree@10.4.0" = fetchurl { + url = "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz"; + hash = "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="; + }; + "esquery@1.6.0" = fetchurl { + url = "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz"; + hash = "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="; + }; + "esrecurse@4.3.0" = fetchurl { + url = "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz"; + hash = "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="; + }; + "estraverse@5.3.0" = fetchurl { + url = "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz"; + hash = "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="; + }; + "esutils@2.0.3" = fetchurl { + url = "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz"; + hash = "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="; + }; + "fast-deep-equal@3.1.3" = fetchurl { + url = "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"; + hash = "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="; + }; + "fast-json-stable-stringify@2.1.0" = fetchurl { + url = "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"; + hash = "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="; + }; + "fast-levenshtein@2.0.6" = fetchurl { + url = "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"; + hash = "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="; + }; + "fdir@6.5.0" = fetchurl { + url = "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz"; + hash = "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="; + }; + "file-entry-cache@8.0.0" = fetchurl { + url = "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz"; + hash = "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="; + }; + "find-root@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz"; + hash = "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="; + }; + "find-up@5.0.0" = fetchurl { + url = "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz"; + hash = "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="; + }; + "flat-cache@4.0.1" = fetchurl { + url = "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz"; + hash = "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="; + }; + "flatted@3.3.3" = fetchurl { + url = "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz"; + hash = "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="; + }; + "fsevents@2.3.2" = fetchurl { + url = "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz"; + hash = "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="; + }; + "fsevents@2.3.3" = fetchurl { + url = "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz"; + hash = "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="; + }; + "function-bind@1.1.2" = fetchurl { + url = "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"; + hash = "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="; + }; + "gensync@1.0.0-beta.2" = fetchurl { + url = "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz"; + hash = "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="; + }; + "glob-parent@6.0.2" = fetchurl { + url = "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz"; + hash = "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="; + }; + "globals@14.0.0" = fetchurl { + url = "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz"; + hash = "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="; + }; + "graceful-fs@4.2.11" = fetchurl { + url = "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz"; + hash = "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="; + }; + "has-flag@4.0.0" = fetchurl { + url = "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"; + hash = "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="; + }; + "hasown@2.0.2" = fetchurl { + url = "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz"; + hash = "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="; + }; + "hoist-non-react-statics@3.3.2" = fetchurl { + url = "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz"; + hash = "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="; + }; + "html-parse-stringify@3.0.1" = fetchurl { + url = "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz"; + hash = "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg=="; + }; + "i18next@25.7.2" = fetchurl { + url = "https://registry.npmjs.org/i18next/-/i18next-25.7.2.tgz"; + hash = "sha512-58b4kmLpLv1buWUEwegMDUqZVR5J+rT+WTRFaBGL7lxDuJQQ0NrJFrq+eT2N94aYVR1k1Sr13QITNOL88tZCuw=="; + }; + "ignore@5.3.2" = fetchurl { + url = "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz"; + hash = "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="; + }; + "ignore@7.0.5" = fetchurl { + url = "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz"; + hash = "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="; + }; + "immer@11.1.3" = fetchurl { + url = "https://registry.npmjs.org/immer/-/immer-11.1.3.tgz"; + hash = "sha512-6jQTc5z0KJFtr1UgFpIL3N9XSC3saRaI9PwWtzM2pSqkNGtiNkYY2OSwkOGDK2XcTRcLb1pi/aNkKZz0nxVH4Q=="; + }; + "import-fresh@3.3.1" = fetchurl { + url = "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz"; + hash = "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="; + }; + "imurmurhash@0.1.4" = fetchurl { + url = "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz"; + hash = "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="; + }; + "is-arrayish@0.2.1" = fetchurl { + url = "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz"; + hash = "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="; + }; + "is-core-module@2.16.1" = fetchurl { + url = "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz"; + hash = "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="; + }; + "is-extglob@2.1.1" = fetchurl { + url = "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"; + hash = "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="; + }; + "is-glob@4.0.3" = fetchurl { + url = "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"; + hash = "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="; + }; + "isexe@2.0.0" = fetchurl { + url = "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"; + hash = "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="; + }; + "jiti@2.6.1" = fetchurl { + url = "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz"; + hash = "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="; + }; + "js-tokens@4.0.0" = fetchurl { + url = "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"; + hash = "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="; + }; + "js-yaml@4.1.1" = fetchurl { + url = "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz"; + hash = "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="; + }; + "jsesc@3.1.0" = fetchurl { + url = "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz"; + hash = "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="; + }; + "json-buffer@3.0.1" = fetchurl { + url = "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz"; + hash = "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="; + }; + "json-parse-even-better-errors@2.3.1" = fetchurl { + url = "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz"; + hash = "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="; + }; + "json-schema-traverse@0.4.1" = fetchurl { + url = "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"; + hash = "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="; + }; + "json-stable-stringify-without-jsonify@1.0.1" = fetchurl { + url = "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz"; + hash = "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="; + }; + "json5@2.2.3" = fetchurl { + url = "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz"; + hash = "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="; + }; + "keyv@4.5.4" = fetchurl { + url = "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz"; + hash = "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="; + }; + "levn@0.4.1" = fetchurl { + url = "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz"; + hash = "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="; + }; + "lightningcss-android-arm64@1.30.2" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz"; + hash = "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A=="; + }; + "lightningcss-darwin-arm64@1.30.2" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz"; + hash = "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA=="; + }; + "lightningcss-darwin-x64@1.30.2" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz"; + hash = "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ=="; + }; + "lightningcss-freebsd-x64@1.30.2" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz"; + hash = "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA=="; + }; + "lightningcss-linux-arm-gnueabihf@1.30.2" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz"; + hash = "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA=="; + }; + "lightningcss-linux-arm64-gnu@1.30.2" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz"; + hash = "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A=="; + }; + "lightningcss-linux-arm64-musl@1.30.2" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz"; + hash = "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA=="; + }; + "lightningcss-linux-x64-gnu@1.30.2" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz"; + hash = "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w=="; + }; + "lightningcss-linux-x64-musl@1.30.2" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz"; + hash = "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA=="; + }; + "lightningcss-win32-arm64-msvc@1.30.2" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz"; + hash = "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ=="; + }; + "lightningcss-win32-x64-msvc@1.30.2" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz"; + hash = "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw=="; + }; + "lightningcss@1.30.2" = fetchurl { + url = "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz"; + hash = "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ=="; + }; + "lines-and-columns@1.2.4" = fetchurl { + url = "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz"; + hash = "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="; + }; + "locate-path@6.0.0" = fetchurl { + url = "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz"; + hash = "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="; + }; + "lodash.merge@4.6.2" = fetchurl { + url = "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz"; + hash = "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="; + }; + "lodash@4.17.21" = fetchurl { + url = "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"; + hash = "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="; + }; + "loose-envify@1.4.0" = fetchurl { + url = "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz"; + hash = "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="; + }; + "lru-cache@5.1.1" = fetchurl { + url = "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz"; + hash = "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="; + }; + "lucide-react@0.542.0" = fetchurl { + url = "https://registry.npmjs.org/lucide-react/-/lucide-react-0.542.0.tgz"; + hash = "sha512-w3hD8/SQB7+lzU2r4VdFyzzOzKnUjTZIF/MQJGSSvni7Llewni4vuViRppfRAa2guOsY5k4jZyxw/i9DQHv+dw=="; + }; + "magic-string@0.30.21" = fetchurl { + url = "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz"; + hash = "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="; + }; + "memoize-one@6.0.0" = fetchurl { + url = "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz"; + hash = "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="; + }; + "minimatch@3.1.2" = fetchurl { + url = "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"; + hash = "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="; + }; + "minimatch@9.0.5" = fetchurl { + url = "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz"; + hash = "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="; + }; + "ms@2.1.3" = fetchurl { + url = "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"; + hash = "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="; + }; + "nanoid@3.3.11" = fetchurl { + url = "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz"; + hash = "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="; + }; + "natural-compare@1.4.0" = fetchurl { + url = "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"; + hash = "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="; + }; + "node-releases@2.0.26" = fetchurl { + url = "https://registry.npmjs.org/node-releases/-/node-releases-2.0.26.tgz"; + hash = "sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA=="; + }; + "object-assign@4.1.1" = fetchurl { + url = "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"; + hash = "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="; + }; + "optionator@0.9.4" = fetchurl { + url = "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz"; + hash = "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="; + }; + "p-limit@3.1.0" = fetchurl { + url = "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz"; + hash = "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="; + }; + "p-locate@5.0.0" = fetchurl { + url = "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz"; + hash = "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="; + }; + "parent-module@1.0.1" = fetchurl { + url = "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"; + hash = "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="; + }; + "parse-json@5.2.0" = fetchurl { + url = "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz"; + hash = "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="; + }; + "path-exists@4.0.0" = fetchurl { + url = "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz"; + hash = "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="; + }; + "path-key@3.1.1" = fetchurl { + url = "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"; + hash = "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="; + }; + "path-parse@1.0.7" = fetchurl { + url = "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz"; + hash = "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="; + }; + "path-type@4.0.0" = fetchurl { + url = "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"; + hash = "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="; + }; + "picocolors@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz"; + hash = "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="; + }; + "picomatch@4.0.3" = fetchurl { + url = "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz"; + hash = "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="; + }; + "playwright-core@1.58.0" = fetchurl { + url = "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.0.tgz"; + hash = "sha512-aaoB1RWrdNi3//rOeKuMiS65UCcgOVljU46At6eFcOFPFHWtd2weHRRow6z/n+Lec0Lvu0k9ZPKJSjPugikirw=="; + }; + "playwright@1.58.0" = fetchurl { + url = "https://registry.npmjs.org/playwright/-/playwright-1.58.0.tgz"; + hash = "sha512-2SVA0sbPktiIY/MCOPX8e86ehA/e+tDNq+e5Y8qjKYti2Z/JG7xnronT/TXTIkKbYGWlCbuucZ6dziEgkoEjQQ=="; + }; + "postcss@8.5.6" = fetchurl { + url = "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz"; + hash = "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="; + }; + "prelude-ls@1.2.1" = fetchurl { + url = "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz"; + hash = "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="; + }; + "prettier@3.6.2" = fetchurl { + url = "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz"; + hash = "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="; + }; + "prop-types@15.8.1" = fetchurl { + url = "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz"; + hash = "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="; + }; + "punycode@2.3.1" = fetchurl { + url = "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz"; + hash = "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="; + }; + "react-dom@18.3.1" = fetchurl { + url = "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz"; + hash = "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw=="; + }; + "react-i18next@16.4.1" = fetchurl { + url = "https://registry.npmjs.org/react-i18next/-/react-i18next-16.4.1.tgz"; + hash = "sha512-GzsYomxb1/uE7nlJm0e1qQ8f+W9I3Xirh9VoycZIahk6C8Pmv/9Fd0ek6zjf1FSgtGLElDGqwi/4FOHEGUbsEQ=="; + }; + "react-is@16.13.1" = fetchurl { + url = "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"; + hash = "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="; + }; + "react-refresh@0.17.0" = fetchurl { + url = "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz"; + hash = "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ=="; + }; + "react-select@5.10.2" = fetchurl { + url = "https://registry.npmjs.org/react-select/-/react-select-5.10.2.tgz"; + hash = "sha512-Z33nHdEFWq9tfnfVXaiM12rbJmk+QjFEztWLtmXqQhz6Al4UZZ9xc0wiatmGtUOCCnHN0WizL3tCMYRENX4rVQ=="; + }; + "react-transition-group@4.4.5" = fetchurl { + url = "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz"; + hash = "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g=="; + }; + "react@18.3.1" = fetchurl { + url = "https://registry.npmjs.org/react/-/react-18.3.1.tgz"; + hash = "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="; + }; + "requireindex@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/requireindex/-/requireindex-1.1.0.tgz"; + hash = "sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg=="; + }; + "resolve-from@4.0.0" = fetchurl { + url = "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"; + hash = "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="; + }; + "resolve@1.22.11" = fetchurl { + url = "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz"; + hash = "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="; + }; + "rollup@4.52.5" = fetchurl { + url = "https://registry.npmjs.org/rollup/-/rollup-4.52.5.tgz"; + hash = "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw=="; + }; + "scheduler@0.23.2" = fetchurl { + url = "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz"; + hash = "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="; + }; + "semver@6.3.1" = fetchurl { + url = "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"; + hash = "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="; + }; + "semver@7.7.3" = fetchurl { + url = "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz"; + hash = "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="; + }; + "shebang-command@2.0.0" = fetchurl { + url = "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz"; + hash = "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="; + }; + "shebang-regex@3.0.0" = fetchurl { + url = "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz"; + hash = "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="; + }; + "sonner@2.0.7" = fetchurl { + url = "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz"; + hash = "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w=="; + }; + "source-map-js@1.2.1" = fetchurl { + url = "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz"; + hash = "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="; + }; + "source-map@0.5.7" = fetchurl { + url = "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz"; + hash = "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="; + }; + "strip-json-comments@3.1.1" = fetchurl { + url = "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz"; + hash = "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="; + }; + "stylis@4.2.0" = fetchurl { + url = "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz"; + hash = "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="; + }; + "supports-color@7.2.0" = fetchurl { + url = "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"; + hash = "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="; + }; + "supports-preserve-symlinks-flag@1.0.0" = fetchurl { + url = "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"; + hash = "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="; + }; + "tailwindcss@4.1.16" = fetchurl { + url = "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.16.tgz"; + hash = "sha512-pONL5awpaQX4LN5eiv7moSiSPd/DLDzKVRJz8Q9PgzmAdd1R4307GQS2ZpfiN7ZmekdQrfhZZiSE5jkLR4WNaA=="; + }; + "tapable@2.3.0" = fetchurl { + url = "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz"; + hash = "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="; + }; + "tauri-plugin-macos-permissions-api@2.3.0" = fetchurl { + url = "https://registry.npmjs.org/tauri-plugin-macos-permissions-api/-/tauri-plugin-macos-permissions-api-2.3.0.tgz"; + hash = "sha512-pZp0jmDySysBqrGueknd1a7Rr4XEO9aXpMv9TNrT2PDHP0MSH20njieOagsFYJ5MCVb8A+wcaK0cIkjUC2dOww=="; + }; + "tinyglobby@0.2.15" = fetchurl { + url = "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz"; + hash = "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="; + }; + "ts-api-utils@2.1.0" = fetchurl { + url = "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz"; + hash = "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="; + }; + "tslib@2.8.1" = fetchurl { + url = "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz"; + hash = "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="; + }; + "type-check@0.4.0" = fetchurl { + url = "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz"; + hash = "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="; + }; + "typescript@5.6.3" = fetchurl { + url = "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz"; + hash = "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw=="; + }; + "undici-types@7.16.0" = fetchurl { + url = "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz"; + hash = "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="; + }; + "update-browserslist-db@1.1.4" = fetchurl { + url = "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz"; + hash = "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A=="; + }; + "uri-js@4.4.1" = fetchurl { + url = "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz"; + hash = "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="; + }; + "use-isomorphic-layout-effect@1.2.1" = fetchurl { + url = "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz"; + hash = "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA=="; + }; + "use-sync-external-store@1.6.0" = fetchurl { + url = "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz"; + hash = "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="; + }; + "vite@6.4.1" = fetchurl { + url = "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz"; + hash = "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g=="; + }; + "void-elements@3.1.0" = fetchurl { + url = "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz"; + hash = "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w=="; + }; + "which@2.0.2" = fetchurl { + url = "https://registry.npmjs.org/which/-/which-2.0.2.tgz"; + hash = "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="; + }; + "word-wrap@1.2.5" = fetchurl { + url = "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz"; + hash = "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="; + }; + "yallist@3.1.1" = fetchurl { + url = "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz"; + hash = "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="; + }; + "yaml@1.10.2" = fetchurl { + url = "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz"; + hash = "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="; + }; + "yocto-queue@0.1.0" = fetchurl { + url = "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"; + hash = "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="; + }; + "zod@3.25.76" = fetchurl { + url = "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz"; + hash = "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="; + }; + "zustand@5.0.8" = fetchurl { + url = "https://registry.npmjs.org/zustand/-/zustand-5.0.8.tgz"; + hash = "sha512-gyPKpIaxY9XcO2vSMrLbiER7QMAMGOQZVRdJ6Zi782jkbzZygq5GI9nG8g+sMgitRtndwaBSl7uiqC49o1SSiw=="; + }; +} diff --git a/flake.lock b/flake.lock index e5578c1..cb2f1d7 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,63 @@ { "nodes": { + "bun2nix": { + "inputs": { + "flake-parts": "flake-parts", + "import-tree": "import-tree", + "nixpkgs": [ + "nixpkgs" + ], + "systems": "systems", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1770895533, + "narHash": "sha256-v3QaK9ugy9bN9RXDnjw0i2OifKmz2NnKM82agtqm/UY=", + "owner": "nix-community", + "repo": "bun2nix", + "rev": "c843f477b15f51151f8c6bcc886954699440a6e1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "2.0.8", + "repo": "bun2nix", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1769996383, + "narHash": "sha256-AnYjnFWgS49RlqX7LrC4uA+sCCDBj0Ry/WOJ5XWAsa0=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "57928607ea566b5db3ad13af0e57e921e6b12381", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "import-tree": { + "locked": { + "lastModified": 1763762820, + "narHash": "sha256-ZvYKbFib3AEwiNMLsejb/CWs/OL/srFQ8AogkebEPF0=", + "owner": "vic", + "repo": "import-tree", + "rev": "3c23749d8013ec6daa1d7255057590e9ca726646", + "type": "github" + }, + "original": { + "owner": "vic", + "repo": "import-tree", + "type": "github" + } + }, "nixpkgs": { "locked": { "lastModified": 1770562336, @@ -16,10 +74,62 @@ "type": "github" } }, + "nixpkgs-lib": { + "locked": { + "lastModified": 1769909678, + "narHash": "sha256-cBEymOf4/o3FD5AZnzC3J9hLbiZ+QDT/KDuyHXVJOpM=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "72716169fe93074c333e8d0173151350670b824c", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, "root": { "inputs": { + "bun2nix": "bun2nix", "nixpkgs": "nixpkgs" } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "bun2nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1770228511, + "narHash": "sha256-wQ6NJSuFqAEmIg2VMnLdCnUc0b7vslUohqqGGD+Fyxk=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "337a4fe074be1042a35086f15481d763b8ddc0e7", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index a52b021..14a4cfd 100644 --- a/flake.nix +++ b/flake.nix @@ -3,12 +3,22 @@ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + + # bun2nix: generates per-package Nix fetchurl expressions from bun.lock, + # replacing the old FOD approach where a single hash covered the entire + # node_modules directory (that hash would break on bun version changes). + # See: https://github.com/nix-community/bun2nix + bun2nix = { + url = "github:nix-community/bun2nix/2.0.8"; + inputs.nixpkgs.follows = "nixpkgs"; + }; }; outputs = { self, nixpkgs, + bun2nix, }: let supportedSystems = [ @@ -24,35 +34,11 @@ packages = forAllSystems ( system: let - pkgs = nixpkgs.legacyPackages.${system}; - lib = pkgs.lib; - - bunDeps = pkgs.stdenv.mkDerivation { - pname = "handy-bun-deps"; - inherit version; - src = self; - - nativeBuildInputs = [ - pkgs.bun - pkgs.cacert - ]; - - dontFixup = true; - - buildPhase = '' - export HOME=$TMPDIR - bun install --frozen-lockfile --no-progress - ''; - - installPhase = '' - mkdir -p $out - cp -r node_modules $out/ - ''; - - outputHashAlgo = "sha256"; - outputHashMode = "recursive"; - outputHash = "sha256-84Aw9E2+fEZT+lIb9k1bodessoex+YFr0im2GMVAPnw="; + pkgs = import nixpkgs { + inherit system; + overlays = [ bun2nix.overlays.default ]; }; + lib = pkgs.lib; in { handy = pkgs.rustPlatform.buildRustPackage { @@ -64,13 +50,11 @@ cargoLock = { lockFile = ./src-tauri/Cargo.lock; - outputHashes = { - "rdev-0.5.0-2" = "sha256-0F7EaPF8Oa1nnSCAjzEAkitWVpMldL3nCp3c5DVFMe0="; - "rodio-0.20.1" = "sha256-wq72awTvN4fXZ9qZc5KLYS9oMxtNDZ4YGxfqz8msofs="; - "tauri-nspanel-2.1.0" = "sha256-gotQQ1DOhavdXU8lTEux0vdY880LLetk7VLvSm6/8TI="; - "tauri-runtime-2.10.0" = "sha256-s1IBM9hOY+HRdl/E5r7BsRTE7aLaFCCMK/DdS+bvZRc="; - "vad-rs-0.1.5" = "sha256-Q9Dxq31npyUPY9wwi6OxqSJrEvFvG8/n0dbyT7XNcyI="; - }; + # Automatically fetch git dependencies using builtins.fetchGit. + # This eliminates the need for manual outputHashes that had to be + # updated every time a git dependency changed in Cargo.lock. + # Safe for standalone flakes (not allowed in nixpkgs, it is needed something like crate2nix). + allowBuiltinFetchGit = true; }; postPatch = '' @@ -78,6 +62,12 @@ src-tauri/tauri.conf.json > $TMPDIR/tauri.conf.json cp $TMPDIR/tauri.conf.json src-tauri/tauri.conf.json + # Strip postinstall hook — it runs check-nix-deps.ts which is only + # needed during local development, not inside the Nix sandbox. + ${pkgs.jq}/bin/jq 'del(.scripts.postinstall)' \ + package.json > $TMPDIR/package.json + cp $TMPDIR/package.json package.json + # Point libappindicator-sys to the Nix store path substituteInPlace \ $cargoDepsCopy/libappindicator-sys-*/src/lib.rs \ @@ -93,11 +83,31 @@ --replace-fail '.write_to_file("opencc.h");' '// skipped' ''; + # Bun dependencies: fetched per-package using hashes from .nix/bun.nix. + # This file is auto-generated by `bunx bun2nix -o .nix/bun.nix` and + # kept in sync via the postinstall hook in package.json. + # To regenerate manually: bun scripts/check-nix-deps.ts + bunDeps = pkgs.bun2nix.fetchBunDeps { + bunNix = ./.nix/bun.nix; + }; + + nativeBuildInputs = with pkgs; [ + cargo-tauri.hook + pkg-config + wrapGAppsHook4 + bun + # pkgs.bun2nix (from overlay), not the flake input — `with pkgs;` + # doesn't shadow function arguments in Nix. + pkgs.bun2nix.hook # Sets up node_modules from pre-fetched bun cache + jq + cmake + llvmPackages.libclang + shaderc + ]; + preBuild = '' - cp -r ${bunDeps}/node_modules node_modules - chmod -R +w node_modules - substituteInPlace node_modules/.bin/{tsc,vite} \ - --replace-fail "/usr/bin/env node" "${lib.getExe pkgs.bun}" + # bun2nix.hook has already set up node_modules from pre-fetched cache. + # Build the frontend with bun (tsc + vite). export HOME=$TMPDIR bun run build ''; @@ -116,17 +126,6 @@ runHook postInstall ''; - nativeBuildInputs = with pkgs; [ - cargo-tauri.hook - pkg-config - wrapGAppsHook4 - bun - jq - cmake - llvmPackages.libclang - shaderc - ]; - buildInputs = with pkgs; [ webkitgtk_4_1 gtk3 diff --git a/package.json b/package.json index 369353b..0e8144b 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,8 @@ "format:backend": "cd src-tauri && cargo fmt", "test:playwright": "playwright test", "test:playwright:ui": "playwright test --ui", - "check:translations": "bun scripts/check-translations.ts" + "check:translations": "bun scripts/check-translations.ts", + "postinstall": "bun scripts/check-nix-deps.ts" }, "dependencies": { "@tailwindcss/vite": "^4.1.16", diff --git a/scripts/check-nix-deps.ts b/scripts/check-nix-deps.ts new file mode 100644 index 0000000..8c6d9e3 --- /dev/null +++ b/scripts/check-nix-deps.ts @@ -0,0 +1,81 @@ +// scripts/check-nix-deps.ts — Keep .nix/bun.nix in sync with bun.lock +// +// Handy uses bun2nix to generate per-package Nix fetchurl expressions from +// bun.lock. This replaces the old FOD (Fixed-Output Derivation) approach +// where a single hash covered the entire node_modules — that hash would +// break whenever the bun version in nixpkgs changed, even without any +// dependency updates. +// +// How it works: +// 1. Computes sha256 of bun.lock +// 2. Compares with stored hash in .nix/bun-lock-hash +// 3. If they match — nothing to do (~2ms) +// 4. If they differ — runs `bunx bun2nix` to regenerate .nix/bun.nix +// +// When it runs: +// - Automatically via "postinstall" in package.json — triggers after every +// bun install / bun add / bun remove / bun update +// - Can also be run manually: bun scripts/check-nix-deps.ts +// +// What to commit: +// If the script regenerated .nix/bun.nix, commit it together with bun.lock: +// git add bun.lock .nix/bun.nix .nix/bun-lock-hash + +import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs"; +import { join, resolve } from "path"; + +const root = resolve(import.meta.dirname, ".."); +const nixDir = join(root, ".nix"); +const lockFile = join(root, "bun.lock"); +const hashFile = join(nixDir, "bun-lock-hash"); +const nixFile = join(nixDir, "bun.nix"); + +// No bun.lock — nothing to do +if (!existsSync(lockFile)) process.exit(0); + +// Ensure .nix directory exists +mkdirSync(nixDir, { recursive: true }); + +// Compute sha256 of the current bun.lock +const currentHash = new Bun.CryptoHasher("sha256") + .update(readFileSync(lockFile)) + .digest("hex"); + +// Read the previously stored hash (empty if first run) +const storedHash = existsSync(hashFile) + ? readFileSync(hashFile, "utf-8").trim() + : ""; + +// If hashes match, bun.nix is up to date — nothing to do +if (currentHash === storedHash) process.exit(0); + +// bun.lock has changed — regenerate the Nix dependency file +console.log( + `[check-nix-deps] bun.lock has changed, regenerating ${nixFile}...`, +); + +const result = Bun.spawnSync(["bunx", "bun2nix", "-o", nixFile], { + cwd: root, + stdio: ["inherit", "inherit", "inherit"], +}); + +if (result.exitCode !== 0) { + console.warn( + "[check-nix-deps] Warning: bunx bun2nix failed. .nix/bun.nix may be outdated.", + ); + console.warn( + "[check-nix-deps] Nix users: run `bunx bun2nix -o .nix/bun.nix` manually.", + ); + console.warn( + "[check-nix-deps] Non-Nix users: this is safe to ignore, CI will catch it.", + ); + // Exit 0 so that `bun install` is not blocked for non-Nix developers. + // CI validates bun.nix independently. + process.exit(0); +} + +writeFileSync(hashFile, currentHash + "\n"); +console.log(`[check-nix-deps] Updated ${nixFile}`); +console.log( + "[check-nix-deps] Don't forget to commit: .nix/bun.nix .nix/bun-lock-hash", +); diff --git a/scripts/update-nix-hashes.sh b/scripts/update-nix-hashes.sh deleted file mode 100755 index a5f35fe..0000000 --- a/scripts/update-nix-hashes.sh +++ /dev/null @@ -1,203 +0,0 @@ -#!/usr/bin/env bash -# Updates outputHashes and bunDeps hash in flake.nix -# when Cargo or JS dependencies change. -# -# Usage: ./scripts/update-nix-hashes.sh -# -# Handles: -# - Version changes in git dependencies (Cargo.lock → outputHashes) -# - bun.lock changes (→ bunDeps outputHash) -# -# Requires: nix, awk, sed -# Works on: NixOS, Ubuntu/Debian, macOS - -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" - -FLAKE_NIX="$PROJECT_DIR/flake.nix" -CARGO_LOCK="$PROJECT_DIR/src-tauri/Cargo.lock" - -FAKE_HASH="sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" - -# Portable sed -i (macOS requires -i '', GNU sed requires just -i) -sedi() { - if sed --version >/dev/null 2>&1; then - sed -i "$@" - else - sed -i '' "$@" - fi -} - -if ! command -v nix >/dev/null 2>&1; then - echo "error: nix is not installed. Install it from https://nixos.org/download/" >&2 - exit 1 -fi -if [ ! -f "$FLAKE_NIX" ]; then - echo "error: flake.nix not found at $FLAKE_NIX" >&2 - exit 1 -fi -if [ ! -f "$CARGO_LOCK" ]; then - echo "error: Cargo.lock not found at $CARGO_LOCK" >&2 - exit 1 -fi - -# --------------------------------------------------------------------------- -# Step 1: Extract git dependency representative keys from Cargo.lock -# -# Cargo.lock format (consecutive lines per package): -# [[package]] -# name = "foo" -# version = "1.2.3" -# source = "git+https://...#commit" -# -# Multiple packages from the same git URL share one outputHash entry keyed -# by the alphabetically first "name-version" from that URL. -# --------------------------------------------------------------------------- - -extract_cargo_git_keys() { - awk ' - /^name = / { name = substr($3, 2, length($3) - 2) } - /^version = / { version = substr($3, 2, length($3) - 2) } - /^source = "git\+/ { - src = $3 - gsub(/^"git\+/, "", src) - sub(/#.*/, "", src) - key = name "-" version - if (!(src in best) || key < best[src]) - best[src] = key - } - END { for (s in best) print best[s] } - ' "$CARGO_LOCK" | sort -} - -# --------------------------------------------------------------------------- -# Step 2: Extract current outputHashes keys from flake.nix -# --------------------------------------------------------------------------- - -extract_flake_keys() { - # Portable: no grep -P, use awk instead - sed -n '/outputHashes/,/};/p' "$FLAKE_NIX" \ - | awk -F'"' '/sha256-/ { print $2 }' \ - | sort -} - -# --------------------------------------------------------------------------- -# Step 3: Compare keys and update flake.nix where needed -# --------------------------------------------------------------------------- - -update_output_hash_keys() { - local cargo_keys flake_keys - cargo_keys=$(extract_cargo_git_keys) - flake_keys=$(extract_flake_keys) - - local changed=0 - - # For each flake key, check if it still matches a Cargo.lock git dep. - # If the package name matches but version differs -> update. - echo "$flake_keys" | while IFS= read -r fk; do - [ -z "$fk" ] && continue - - # Extract the package name prefix (everything before the version) - fname=$(echo "$fk" | sed 's/-[0-9][0-9.]*[-0-9]*$//') - - if echo "$cargo_keys" | grep -qxF "$fk"; then - continue - fi - - # Key not found in Cargo.lock — look for a replacement with the same name - replacement=$(echo "$cargo_keys" | while IFS= read -r ck; do - cname=$(echo "$ck" | sed 's/-[0-9][0-9.]*[-0-9]*$//') - if [ "$cname" = "$fname" ]; then - echo "$ck" - break - fi - done) - - if [ -n "$replacement" ]; then - echo "outputHashes: $fk -> $replacement" - sedi "s|\"$fk\" = \"sha256-[^\"]*\"|\"$replacement\" = \"$FAKE_HASH\"|" "$FLAKE_NIX" - changed=1 - else - echo "warning: $fk not found in Cargo.lock git deps and no replacement detected" >&2 - echo " This entry may need to be removed or added manually." >&2 - fi - done - - # Check for new git deps not yet in flake.nix - echo "$cargo_keys" | while IFS= read -r ck; do - [ -z "$ck" ] && continue - if ! echo "$flake_keys" | grep -qxF "$ck" && ! grep -q "\"$ck\"" "$FLAKE_NIX"; then - echo "warning: git dep $ck exists in Cargo.lock but not in flake.nix outputHashes" >&2 - echo " You may need to add it manually." >&2 - fi - done - - return $changed -} - -# --------------------------------------------------------------------------- -# Step 4: Iteratively fix hashes by running nix build and parsing errors -# --------------------------------------------------------------------------- - -fix_hashes() { - local max_attempts=10 - local attempt=0 - - while [ "$attempt" -lt "$max_attempts" ]; do - attempt=$((attempt + 1)) - echo "" - echo "=== nix build attempt $attempt/$max_attempts ===" - - local output - if output=$(nix build .#handy 2>&1); then - echo "Build successful!" - return 0 - fi - - # Check for hash mismatch - if echo "$output" | grep -q "hash mismatch in fixed-output derivation"; then - local specified got - specified=$(echo "$output" | grep "specified:" | awk '{print $2}') - got=$(echo "$output" | grep "got:" | awk '{print $2}') - - if [ -n "$specified" ] && [ -n "$got" ]; then - echo "Hash mismatch: $specified -> $got" - sedi "s|$specified|$got|" "$FLAKE_NIX" - continue - fi - fi - - # If we can't parse the error, show it and bail out - echo "" - echo "Build failed with an error that cannot be fixed automatically:" >&2 - echo "$output" | tail -20 >&2 - return 1 - done - - echo "error: exceeded max attempts ($max_attempts)" >&2 - return 1 -} - -# --------------------------------------------------------------------------- -# Main -# --------------------------------------------------------------------------- - -cd "$PROJECT_DIR" - -echo "=== Nix flake hash updater ===" -echo "" -echo "Checking outputHashes keys against Cargo.lock..." - -if update_output_hash_keys; then - echo "All outputHashes keys are up to date." -fi - -echo "" -echo "Running nix build to verify/fix hashes..." -fix_hashes - -echo "" -echo "Done. Changes in flake.nix:" -git diff --stat -- flake.nix 2>/dev/null || true