diff --git a/src/problem1/p1.js b/src/problem1/p1.js
new file mode 100644
index 0000000000..de9ed3f435
--- /dev/null
+++ b/src/problem1/p1.js
@@ -0,0 +1,67 @@
+// ==================== Task ====================
+// Provide 3 unique implementations of the following function in JavaScript.
+// Input: n - any integer
+// Output: return - summation to n, i.e. sum_to_n(5) === 1 + 2 + 3 + 4 + 5 === 15.
+
+
+// Idea: Iterative approach. Uses a loop to add each number from 1 to n to an accumulator.
+// Complexity: Time O(n), Space O(1)
+var sum_to_n_a = function (n) {
+ let sum = 0;
+ for (var i = 1; i <= n; i++) {
+ sum += i;
+ }
+ return sum;
+};
+
+// Idea: Recursive approach. The sum to n is n plus the sum to n-1.
+// Complexity: Time O(n), Space O(n) (due to call stack overhead)
+var sum_to_n_b = function (n) {
+ if (n < 1) {
+ return 0;
+ }
+ return n + sum_to_n_b(n - 1);
+};
+
+// Idea: Mathematical formula (Arithmetic progression sum). Uses the formula n * (n + 1) / 2.
+// Complexity: Time O(1), Space O(1)
+var sum_to_n_c = function (n) {
+ return n * (n + 1) / 2;
+};
+
+function test() {
+ const testCases = [
+ { input: 0, expected: 0 },
+ { input: 1, expected: 1 },
+ { input: 2, expected: 3 },
+ { input: 5, expected: 15 },
+ { input: 10, expected: 55 },
+ { input: 42, expected: 903 },
+ { input: 50, expected: 1275 },
+ { input: 100, expected: 5050 },
+ { input: 500, expected: 125250 },
+ { input: 1000, expected: 500500 }
+ ];
+
+ console.log("Running 10 test cases for all 3 implementations:\n");
+
+ testCases.forEach(({ input: n, expected }, index) => {
+ const resA = sum_to_n_a(n);
+ const resB = sum_to_n_b(n);
+ const resC = sum_to_n_c(n);
+
+ const passedA = resA === expected;
+ const passedB = resB === expected;
+ const passedC = resC === expected;
+ const allPassed = passedA && passedB && passedC;
+
+ console.log(`Test ${index + 1} (input number 'n' = ${n}, expected result = ${expected}):`);
+ console.log(` sum_to_n_a: ${resA} (${passedA ? "PASS" : "FAIL"})`);
+ console.log(` sum_to_n_b: ${resB} (${passedB ? "PASS" : "FAIL"})`);
+ console.log(` sum_to_n_c: ${resC} (${passedC ? "PASS" : "FAIL"})`);
+ console.log(` Overall result status: ${allPassed ? "PASS" : "FAIL"}`);
+ console.log("-----------------------");
+ });
+}
+
+test();
\ No newline at end of file
diff --git a/src/problem2/fancy-form/.gitignore b/src/problem2/fancy-form/.gitignore
new file mode 100644
index 0000000000..a547bf36d8
--- /dev/null
+++ b/src/problem2/fancy-form/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/src/problem2/fancy-form/.prettierrc b/src/problem2/fancy-form/.prettierrc
new file mode 100644
index 0000000000..3f752c1ba5
--- /dev/null
+++ b/src/problem2/fancy-form/.prettierrc
@@ -0,0 +1,10 @@
+{
+ "semi": true,
+ "singleQuote": true,
+ "tabWidth": 2,
+ "trailingComma": "all",
+ "printWidth": 100,
+ "bracketSpacing": true,
+ "arrowParens": "always",
+ "endOfLine": "auto"
+}
diff --git a/src/problem2/fancy-form/README.md b/src/problem2/fancy-form/README.md
new file mode 100644
index 0000000000..7dbf7ebf3b
--- /dev/null
+++ b/src/problem2/fancy-form/README.md
@@ -0,0 +1,73 @@
+# React + TypeScript + Vite
+
+This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
+
+Currently, two official plugins are available:
+
+- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs)
+- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/)
+
+## React Compiler
+
+The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).
+
+## Expanding the ESLint configuration
+
+If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
+
+```js
+export default defineConfig([
+ globalIgnores(['dist']),
+ {
+ files: ['**/*.{ts,tsx}'],
+ extends: [
+ // Other configs...
+
+ // Remove tseslint.configs.recommended and replace with this
+ tseslint.configs.recommendedTypeChecked,
+ // Alternatively, use this for stricter rules
+ tseslint.configs.strictTypeChecked,
+ // Optionally, add this for stylistic rules
+ tseslint.configs.stylisticTypeChecked,
+
+ // Other configs...
+ ],
+ languageOptions: {
+ parserOptions: {
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
+ tsconfigRootDir: import.meta.dirname,
+ },
+ // other options...
+ },
+ },
+])
+```
+
+You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
+
+```js
+// eslint.config.js
+import reactX from 'eslint-plugin-react-x'
+import reactDom from 'eslint-plugin-react-dom'
+
+export default defineConfig([
+ globalIgnores(['dist']),
+ {
+ files: ['**/*.{ts,tsx}'],
+ extends: [
+ // Other configs...
+ // Enable lint rules for React
+ reactX.configs['recommended-typescript'],
+ // Enable lint rules for React DOM
+ reactDom.configs.recommended,
+ ],
+ languageOptions: {
+ parserOptions: {
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
+ tsconfigRootDir: import.meta.dirname,
+ },
+ // other options...
+ },
+ },
+])
+```
diff --git a/src/problem2/fancy-form/components.json b/src/problem2/fancy-form/components.json
new file mode 100644
index 0000000000..15addee81f
--- /dev/null
+++ b/src/problem2/fancy-form/components.json
@@ -0,0 +1,25 @@
+{
+ "$schema": "https://ui.shadcn.com/schema.json",
+ "style": "base-nova",
+ "rsc": false,
+ "tsx": true,
+ "tailwind": {
+ "config": "",
+ "css": "src/index.css",
+ "baseColor": "neutral",
+ "cssVariables": true,
+ "prefix": ""
+ },
+ "iconLibrary": "lucide",
+ "rtl": false,
+ "aliases": {
+ "components": "@/components",
+ "utils": "@/lib/utils",
+ "ui": "@/components/ui",
+ "lib": "@/lib",
+ "hooks": "@/hooks"
+ },
+ "menuColor": "default",
+ "menuAccent": "subtle",
+ "registries": {}
+}
diff --git a/src/problem2/fancy-form/eslint.config.js b/src/problem2/fancy-form/eslint.config.js
new file mode 100644
index 0000000000..82f37d2941
--- /dev/null
+++ b/src/problem2/fancy-form/eslint.config.js
@@ -0,0 +1,36 @@
+import js from '@eslint/js';
+import globals from 'globals';
+import reactHooks from 'eslint-plugin-react-hooks';
+import reactRefresh from 'eslint-plugin-react-refresh';
+import tseslint from 'typescript-eslint';
+import eslintPluginPrettier from 'eslint-plugin-prettier';
+import eslintConfigPrettier from 'eslint-config-prettier';
+import { defineConfig, globalIgnores } from 'eslint/config';
+
+export default defineConfig([
+ globalIgnores(['dist']),
+ {
+ files: ['**/*.{ts,tsx}'],
+ extends: [
+ js.configs.recommended,
+ tseslint.configs.recommended,
+ reactHooks.configs.flat.recommended,
+ reactRefresh.configs.vite,
+ ],
+ languageOptions: {
+ globals: globals.browser,
+ },
+ plugins: {
+ prettier: eslintPluginPrettier,
+ },
+ rules: {
+ ...eslintConfigPrettier.rules,
+ 'prettier/prettier': 'warn',
+ '@typescript-eslint/no-unused-vars': [
+ 'warn',
+ { argsIgnorePattern: '^_', varsIgnorePattern: '^_' },
+ ],
+ '@typescript-eslint/consistent-type-imports': 'warn',
+ },
+ },
+]);
diff --git a/src/problem2/fancy-form/index.html b/src/problem2/fancy-form/index.html
new file mode 100644
index 0000000000..c7932bfbb6
--- /dev/null
+++ b/src/problem2/fancy-form/index.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+ Fancy Form — Token Swap
+
+
+
+
+
+
diff --git a/src/problem2/fancy-form/package-lock.json b/src/problem2/fancy-form/package-lock.json
new file mode 100644
index 0000000000..ddd2db0d90
--- /dev/null
+++ b/src/problem2/fancy-form/package-lock.json
@@ -0,0 +1,3433 @@
+{
+ "name": "fancy-form",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "fancy-form",
+ "version": "0.0.0",
+ "dependencies": {
+ "@base-ui/react": "^1.4.1",
+ "@radix-ui/react-dialog": "^1.1.15",
+ "@radix-ui/react-slot": "^1.2.4",
+ "@tanstack/react-query": "^5.100.5",
+ "class-variance-authority": "^0.7.1",
+ "clsx": "^2.1.1",
+ "framer-motion": "^12.38.0",
+ "lucide-react": "^1.11.0",
+ "react": "^19.2.5",
+ "react-dom": "^19.2.5",
+ "react-hot-toast": "^2.6.0",
+ "tailwind-merge": "^3.5.0"
+ },
+ "devDependencies": {
+ "@eslint/js": "^10.0.1",
+ "@tailwindcss/vite": "^4.2.4",
+ "@types/node": "^24.12.2",
+ "@types/react": "^19.2.14",
+ "@types/react-dom": "^19.2.3",
+ "@vitejs/plugin-react": "^6.0.1",
+ "eslint": "^10.2.1",
+ "eslint-config-prettier": "^10.1.8",
+ "eslint-plugin-prettier": "^5.5.5",
+ "eslint-plugin-react-hooks": "^7.1.1",
+ "eslint-plugin-react-refresh": "^0.5.2",
+ "globals": "^17.5.0",
+ "prettier": "^3.8.3",
+ "tailwindcss": "^4.2.4",
+ "typescript": "~6.0.2",
+ "typescript-eslint": "^8.58.2",
+ "vite": "^8.0.10"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
+ "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz",
+ "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz",
+ "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.0",
+ "@babel/generator": "^7.29.0",
+ "@babel/helper-compilation-targets": "^7.28.6",
+ "@babel/helper-module-transforms": "^7.28.6",
+ "@babel/helpers": "^7.28.6",
+ "@babel/parser": "^7.29.0",
+ "@babel/template": "^7.28.6",
+ "@babel/traverse": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "@jridgewell/remapping": "^2.3.5",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.29.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz",
+ "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz",
+ "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.28.6",
+ "@babel/helper-validator-option": "^7.27.1",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-globals": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
+ "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
+ "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.28.6",
+ "@babel/types": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
+ "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.28.6",
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "@babel/traverse": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz",
+ "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.28.6",
+ "@babel/types": "^7.29.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz",
+ "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.0"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
+ "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
+ "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.28.6",
+ "@babel/parser": "^7.28.6",
+ "@babel/types": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz",
+ "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.0",
+ "@babel/generator": "^7.29.0",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/parser": "^7.29.0",
+ "@babel/template": "^7.28.6",
+ "@babel/types": "^7.29.0",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
+ "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.28.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@base-ui/react": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/@base-ui/react/-/react-1.4.1.tgz",
+ "integrity": "sha512-Ab5/LIhcmL8BQcsBUYiOfkSDRdLpvgUBzMK30cu684JPcLclYlztharvCZyNNgzJtbAiREzI9q0pI5erHCMgCw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.29.2",
+ "@base-ui/utils": "0.2.8",
+ "@floating-ui/react-dom": "^2.1.8",
+ "@floating-ui/utils": "^0.2.11",
+ "use-sync-external-store": "^1.6.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@date-fns/tz": "^1.2.0",
+ "@types/react": "^17 || ^18 || ^19",
+ "date-fns": "^4.0.0",
+ "react": "^17 || ^18 || ^19",
+ "react-dom": "^17 || ^18 || ^19"
+ },
+ "peerDependenciesMeta": {
+ "@date-fns/tz": {
+ "optional": true
+ },
+ "@types/react": {
+ "optional": true
+ },
+ "date-fns": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@base-ui/utils": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmjs.org/@base-ui/utils/-/utils-0.2.8.tgz",
+ "integrity": "sha512-jvOi+c+ftGlGotNcKnzPVg2IhCaDTB6/6R3JeqdjdXktuAJi3wKH9T7+svuaKh1mmfVU11UWzUZVH74JDfi/wQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.29.2",
+ "@floating-ui/utils": "^0.2.11",
+ "reselect": "^5.1.1",
+ "use-sync-external-store": "^1.6.0"
+ },
+ "peerDependencies": {
+ "@types/react": "^17 || ^18 || ^19",
+ "react": "^17 || ^18 || ^19",
+ "react-dom": "^17 || ^18 || ^19"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
+ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.23.5",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz",
+ "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^3.0.5",
+ "debug": "^4.3.1",
+ "minimatch": "^10.2.4"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.5.tgz",
+ "integrity": "sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^1.2.1"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz",
+ "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz",
+ "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "eslint": "^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz",
+ "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.1.tgz",
+ "integrity": "sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^1.2.1",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@floating-ui/core": {
+ "version": "1.7.5",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz",
+ "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/utils": "^0.2.11"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.7.6",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz",
+ "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/core": "^1.7.5",
+ "@floating-ui/utils": "^0.2.11"
+ }
+ },
+ "node_modules/@floating-ui/react-dom": {
+ "version": "2.1.8",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz",
+ "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/dom": "^1.7.6"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.2.11",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz",
+ "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==",
+ "license": "MIT"
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
+ "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/types": "^0.15.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.8",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz",
+ "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.2",
+ "@humanfs/types": "^0.15.0",
+ "@humanwhocodes/retry": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/types": {
+ "version": "0.15.0",
+ "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz",
+ "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@oxc-project/types": {
+ "version": "0.127.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz",
+ "integrity": "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ }
+ },
+ "node_modules/@pkgr/core": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz",
+ "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/pkgr"
+ }
+ },
+ "node_modules/@radix-ui/primitive": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz",
+ "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==",
+ "license": "MIT"
+ },
+ "node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz",
+ "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-context": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz",
+ "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dialog": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz",
+ "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-dismissable-layer": "1.1.11",
+ "@radix-ui/react-focus-guards": "1.1.3",
+ "@radix-ui/react-focus-scope": "1.1.7",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-portal": "1.1.9",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-slot": "1.2.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "aria-hidden": "^1.2.4",
+ "react-remove-scroll": "^2.6.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dismissable-layer": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz",
+ "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-escape-keydown": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-focus-guards": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz",
+ "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-focus-scope": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz",
+ "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-id": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz",
+ "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-portal": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz",
+ "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-presence": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz",
+ "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-primitive": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz",
+ "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-slot": "1.2.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-slot": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz",
+ "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-callback-ref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz",
+ "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-controllable-state": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz",
+ "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-effect-event": "0.0.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-effect-event": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz",
+ "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-escape-keydown": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz",
+ "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-callback-ref": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-layout-effect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz",
+ "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rolldown/binding-win32-x64-msvc": {
+ "version": "1.0.0-rc.17",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.17.tgz",
+ "integrity": "sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-rc.7",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz",
+ "integrity": "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@tailwindcss/node": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.4.tgz",
+ "integrity": "sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/remapping": "^2.3.5",
+ "enhanced-resolve": "^5.19.0",
+ "jiti": "^2.6.1",
+ "lightningcss": "1.32.0",
+ "magic-string": "^0.30.21",
+ "source-map-js": "^1.2.1",
+ "tailwindcss": "4.2.4"
+ }
+ },
+ "node_modules/@tailwindcss/oxide": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.4.tgz",
+ "integrity": "sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20"
+ },
+ "optionalDependencies": {
+ "@tailwindcss/oxide-android-arm64": "4.2.4",
+ "@tailwindcss/oxide-darwin-arm64": "4.2.4",
+ "@tailwindcss/oxide-darwin-x64": "4.2.4",
+ "@tailwindcss/oxide-freebsd-x64": "4.2.4",
+ "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.4",
+ "@tailwindcss/oxide-linux-arm64-gnu": "4.2.4",
+ "@tailwindcss/oxide-linux-arm64-musl": "4.2.4",
+ "@tailwindcss/oxide-linux-x64-gnu": "4.2.4",
+ "@tailwindcss/oxide-linux-x64-musl": "4.2.4",
+ "@tailwindcss/oxide-wasm32-wasi": "4.2.4",
+ "@tailwindcss/oxide-win32-arm64-msvc": "4.2.4",
+ "@tailwindcss/oxide-win32-x64-msvc": "4.2.4"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-android-arm64": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.4.tgz",
+ "integrity": "sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-arm64": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.4.tgz",
+ "integrity": "sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-x64": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.4.tgz",
+ "integrity": "sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-freebsd-x64": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.4.tgz",
+ "integrity": "sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.4.tgz",
+ "integrity": "sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.4.tgz",
+ "integrity": "sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.4.tgz",
+ "integrity": "sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.4.tgz",
+ "integrity": "sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-musl": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.4.tgz",
+ "integrity": "sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.4.tgz",
+ "integrity": "sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw==",
+ "bundleDependencies": [
+ "@napi-rs/wasm-runtime",
+ "@emnapi/core",
+ "@emnapi/runtime",
+ "@tybys/wasm-util",
+ "@emnapi/wasi-threads",
+ "tslib"
+ ],
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.8.1",
+ "@emnapi/runtime": "^1.8.1",
+ "@emnapi/wasi-threads": "^1.1.0",
+ "@napi-rs/wasm-runtime": "^1.1.1",
+ "@tybys/wasm-util": "^0.10.1",
+ "tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.4.tgz",
+ "integrity": "sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.4.tgz",
+ "integrity": "sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/vite": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.4.tgz",
+ "integrity": "sha512-pCvohwOCspk3ZFn6eJzrrX3g4n2JY73H6MmYC87XfGPyTty4YsCjYTMArRZm/zOI8dIt3+EcrLHAFPe5A4bgtw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@tailwindcss/node": "4.2.4",
+ "@tailwindcss/oxide": "4.2.4",
+ "tailwindcss": "4.2.4"
+ },
+ "peerDependencies": {
+ "vite": "^5.2.0 || ^6 || ^7 || ^8"
+ }
+ },
+ "node_modules/@tanstack/query-core": {
+ "version": "5.100.5",
+ "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.100.5.tgz",
+ "integrity": "sha512-t20KrhKkf0HXzqQkPbJ5erhFesup68BAbwFgYmTrS7bxMF7O5MdmL8jUkik4thsG7Hg00fblz30h6yF1d5TxGg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ }
+ },
+ "node_modules/@tanstack/react-query": {
+ "version": "5.100.5",
+ "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.100.5.tgz",
+ "integrity": "sha512-aNwj1mi2v2bQ9IxkyR1grLOUkv3BYWoykHy9KDyLNbjC3tsahbOHJibK+Wjtr1wRhG59/AvJhiJG5OlthaCgJA==",
+ "license": "MIT",
+ "dependencies": {
+ "@tanstack/query-core": "5.100.5"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ },
+ "peerDependencies": {
+ "react": "^18 || ^19"
+ }
+ },
+ "node_modules/@types/esrecurse": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz",
+ "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "24.12.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz",
+ "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~7.16.0"
+ }
+ },
+ "node_modules/@types/react": {
+ "version": "19.2.14",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
+ "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "csstype": "^3.2.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "19.2.3",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz",
+ "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
+ "devOptional": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^19.2.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.59.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.0.tgz",
+ "integrity": "sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.12.2",
+ "@typescript-eslint/scope-manager": "8.59.0",
+ "@typescript-eslint/type-utils": "8.59.0",
+ "@typescript-eslint/utils": "8.59.0",
+ "@typescript-eslint/visitor-keys": "8.59.0",
+ "ignore": "^7.0.5",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.59.0",
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.59.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.0.tgz",
+ "integrity": "sha512-TI1XGwKbDpo9tRW8UDIXCOeLk55qe9ZFGs8MTKU6/M08HWTw52DD/IYhfQtOEhEdPhLMT26Ka/x7p70nd3dzDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.59.0",
+ "@typescript-eslint/types": "8.59.0",
+ "@typescript-eslint/typescript-estree": "8.59.0",
+ "@typescript-eslint/visitor-keys": "8.59.0",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.59.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.0.tgz",
+ "integrity": "sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.59.0",
+ "@typescript-eslint/types": "^8.59.0",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.59.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.0.tgz",
+ "integrity": "sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.59.0",
+ "@typescript-eslint/visitor-keys": "8.59.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.59.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.0.tgz",
+ "integrity": "sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.59.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.0.tgz",
+ "integrity": "sha512-3TRiZaQSltGqGeNrJzzr1+8YcEobKH9rHnqIp/1psfKFmhRQDNMGP5hBufanYTGznwShzVLs3Mz+gDN7HkWfXg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.59.0",
+ "@typescript-eslint/typescript-estree": "8.59.0",
+ "@typescript-eslint/utils": "8.59.0",
+ "debug": "^4.4.3",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.59.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.0.tgz",
+ "integrity": "sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.59.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.0.tgz",
+ "integrity": "sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/project-service": "8.59.0",
+ "@typescript-eslint/tsconfig-utils": "8.59.0",
+ "@typescript-eslint/types": "8.59.0",
+ "@typescript-eslint/visitor-keys": "8.59.0",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.59.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.0.tgz",
+ "integrity": "sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.59.0",
+ "@typescript-eslint/types": "8.59.0",
+ "@typescript-eslint/typescript-estree": "8.59.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.59.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.0.tgz",
+ "integrity": "sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.59.0",
+ "eslint-visitor-keys": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@vitejs/plugin-react": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz",
+ "integrity": "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@rolldown/pluginutils": "1.0.0-rc.7"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0",
+ "babel-plugin-react-compiler": "^1.0.0",
+ "vite": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@rolldown/plugin-babel": {
+ "optional": true
+ },
+ "babel-plugin-react-compiler": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
+ "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/aria-hidden": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz",
+ "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.10.23",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.23.tgz",
+ "integrity": "sha512-xwVXGqevyKPsiuQdLj+dZMVjidjJV508TBqexND5HrF89cGdCYCJFB3qhcxRHSeMctdCfbR1jrxBajhDy7o29g==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz",
+ "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.28.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz",
+ "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "baseline-browser-mapping": "^2.10.12",
+ "caniuse-lite": "^1.0.30001782",
+ "electron-to-chromium": "^1.5.328",
+ "node-releases": "^2.0.36",
+ "update-browserslist-db": "^1.2.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001791",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz",
+ "integrity": "sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/class-variance-authority": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
+ "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "clsx": "^2.1.1"
+ },
+ "funding": {
+ "url": "https://polar.sh/cva"
+ }
+ },
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/detect-node-es": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
+ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
+ "license": "MIT"
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.344",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.344.tgz",
+ "integrity": "sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.21.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz",
+ "integrity": "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.3.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "10.2.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.2.1.tgz",
+ "integrity": "sha512-wiyGaKsDgqXvF40P8mDwiUp/KQjE1FdrIEJsM8PZ3XCiniTMXS3OHWWUe5FI5agoCnr8x4xPrTDZuxsBlNHl+Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.2",
+ "@eslint/config-array": "^0.23.5",
+ "@eslint/config-helpers": "^0.5.5",
+ "@eslint/core": "^1.2.1",
+ "@eslint/plugin-kit": "^0.7.1",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "ajv": "^6.14.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^9.1.2",
+ "eslint-visitor-keys": "^5.0.1",
+ "espree": "^11.2.0",
+ "esquery": "^1.7.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "minimatch": "^10.2.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-config-prettier": {
+ "version": "10.1.8",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz",
+ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint-config-prettier"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-prettier": {
+ "version": "5.5.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz",
+ "integrity": "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prettier-linter-helpers": "^1.0.1",
+ "synckit": "^0.11.12"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint-plugin-prettier"
+ },
+ "peerDependencies": {
+ "@types/eslint": ">=8.0.0",
+ "eslint": ">=8.0.0",
+ "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0",
+ "prettier": ">=3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/eslint": {
+ "optional": true
+ },
+ "eslint-config-prettier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz",
+ "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.24.4",
+ "@babel/parser": "^7.24.4",
+ "hermes-parser": "^0.25.1",
+ "zod": "^3.25.0 || ^4.0.0",
+ "zod-validation-error": "^3.5.0 || ^4.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-react-refresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz",
+ "integrity": "sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "eslint": "^9 || ^10"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "9.1.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz",
+ "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@types/esrecurse": "^4.3.1",
+ "@types/estree": "^1.0.8",
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz",
+ "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.16.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^5.0.1"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-diff": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
+ "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
+ "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/framer-motion": {
+ "version": "12.38.0",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.38.0.tgz",
+ "integrity": "sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g==",
+ "license": "MIT",
+ "dependencies": {
+ "motion-dom": "^12.38.0",
+ "motion-utils": "^12.36.0",
+ "tslib": "^2.4.0"
+ },
+ "peerDependencies": {
+ "@emotion/is-prop-valid": "*",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/is-prop-valid": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-nonce": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
+ "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "17.5.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-17.5.0.tgz",
+ "integrity": "sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/goober": {
+ "version": "2.1.18",
+ "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.18.tgz",
+ "integrity": "sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "csstype": "^3.0.10"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/hermes-estree": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz",
+ "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/hermes-parser": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz",
+ "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hermes-estree": "0.25.1"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/jiti": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
+ "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lightningcss": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
+ "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "detect-libc": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "lightningcss-android-arm64": "1.32.0",
+ "lightningcss-darwin-arm64": "1.32.0",
+ "lightningcss-darwin-x64": "1.32.0",
+ "lightningcss-freebsd-x64": "1.32.0",
+ "lightningcss-linux-arm-gnueabihf": "1.32.0",
+ "lightningcss-linux-arm64-gnu": "1.32.0",
+ "lightningcss-linux-arm64-musl": "1.32.0",
+ "lightningcss-linux-x64-gnu": "1.32.0",
+ "lightningcss-linux-x64-musl": "1.32.0",
+ "lightningcss-win32-arm64-msvc": "1.32.0",
+ "lightningcss-win32-x64-msvc": "1.32.0"
+ }
+ },
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
+ "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/lucide-react": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.11.0.tgz",
+ "integrity": "sha512-UOhjdztXCgdBReRcIhsvz2siIBogfv/lhJEIViCpLt924dO+GDms9T7DNoucI23s6kEPpe988m5N0D2ajnzb2g==",
+ "license": "ISC",
+ "peerDependencies": {
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.5"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/motion-dom": {
+ "version": "12.38.0",
+ "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.38.0.tgz",
+ "integrity": "sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA==",
+ "license": "MIT",
+ "dependencies": {
+ "motion-utils": "^12.36.0"
+ }
+ },
+ "node_modules/motion-utils": {
+ "version": "12.36.0",
+ "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.36.0.tgz",
+ "integrity": "sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==",
+ "license": "MIT"
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.38",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz",
+ "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.12",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.12.tgz",
+ "integrity": "sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.8.3",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz",
+ "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/prettier-linter-helpers": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz",
+ "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-diff": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/react": {
+ "version": "19.2.5",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz",
+ "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.2.5",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz",
+ "integrity": "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==",
+ "license": "MIT",
+ "dependencies": {
+ "scheduler": "^0.27.0"
+ },
+ "peerDependencies": {
+ "react": "^19.2.5"
+ }
+ },
+ "node_modules/react-hot-toast": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.6.0.tgz",
+ "integrity": "sha512-bH+2EBMZ4sdyou/DPrfgIouFpcRLCJ+HoCA32UoAYHn6T3Ur5yfcDCeSr5mwldl6pFOsiocmrXMuoCJ1vV8bWg==",
+ "license": "MIT",
+ "dependencies": {
+ "csstype": "^3.1.3",
+ "goober": "^2.1.16"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "react": ">=16",
+ "react-dom": ">=16"
+ }
+ },
+ "node_modules/react-remove-scroll": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz",
+ "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==",
+ "license": "MIT",
+ "dependencies": {
+ "react-remove-scroll-bar": "^2.3.7",
+ "react-style-singleton": "^2.2.3",
+ "tslib": "^2.1.0",
+ "use-callback-ref": "^1.3.3",
+ "use-sidecar": "^1.1.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-remove-scroll-bar": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz",
+ "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==",
+ "license": "MIT",
+ "dependencies": {
+ "react-style-singleton": "^2.2.2",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-style-singleton": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz",
+ "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==",
+ "license": "MIT",
+ "dependencies": {
+ "get-nonce": "^1.0.0",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/reselect": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz",
+ "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==",
+ "license": "MIT"
+ },
+ "node_modules/rolldown": {
+ "version": "1.0.0-rc.17",
+ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.17.tgz",
+ "integrity": "sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@oxc-project/types": "=0.127.0",
+ "@rolldown/pluginutils": "1.0.0-rc.17"
+ },
+ "bin": {
+ "rolldown": "bin/cli.mjs"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "optionalDependencies": {
+ "@rolldown/binding-android-arm64": "1.0.0-rc.17",
+ "@rolldown/binding-darwin-arm64": "1.0.0-rc.17",
+ "@rolldown/binding-darwin-x64": "1.0.0-rc.17",
+ "@rolldown/binding-freebsd-x64": "1.0.0-rc.17",
+ "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.17",
+ "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.17",
+ "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.17",
+ "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.17",
+ "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.17",
+ "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.17",
+ "@rolldown/binding-linux-x64-musl": "1.0.0-rc.17",
+ "@rolldown/binding-openharmony-arm64": "1.0.0-rc.17",
+ "@rolldown/binding-wasm32-wasi": "1.0.0-rc.17",
+ "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.17",
+ "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.17"
+ }
+ },
+ "node_modules/rolldown/node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-rc.17",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.17.tgz",
+ "integrity": "sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/scheduler": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
+ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/synckit": {
+ "version": "0.11.12",
+ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz",
+ "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@pkgr/core": "^0.2.9"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/synckit"
+ }
+ },
+ "node_modules/tailwind-merge": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.5.0.tgz",
+ "integrity": "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/dcastil"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.4.tgz",
+ "integrity": "sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tapable": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
+ "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.16",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
+ "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
+ "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz",
+ "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/typescript-eslint": {
+ "version": "8.59.0",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.0.tgz",
+ "integrity": "sha512-BU3ONW9X+v90EcCH9ZS6LMackcVtxRLlI3XrYyqZIwVSHIk7Qf7bFw1z0M9Q0IUxhTMZCf8piY9hTYaNEIASrw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/eslint-plugin": "8.59.0",
+ "@typescript-eslint/parser": "8.59.0",
+ "@typescript-eslint/typescript-estree": "8.59.0",
+ "@typescript-eslint/utils": "8.59.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
+ "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/use-callback-ref": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz",
+ "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/use-sidecar": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz",
+ "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "detect-node-es": "^1.1.0",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/use-sync-external-store": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
+ "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/vite": {
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.10.tgz",
+ "integrity": "sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lightningcss": "^1.32.0",
+ "picomatch": "^4.0.4",
+ "postcss": "^8.5.10",
+ "rolldown": "1.0.0-rc.17",
+ "tinyglobby": "^0.2.16"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "@vitejs/devtools": "^0.1.0",
+ "esbuild": "^0.27.0 || ^0.28.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "@vitejs/devtools": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zod": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz",
+ "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/zod-validation-error": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz",
+ "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "zod": "^3.25.0 || ^4.0.0"
+ }
+ }
+ }
+}
diff --git a/src/problem2/fancy-form/package.json b/src/problem2/fancy-form/package.json
new file mode 100644
index 0000000000..9135ca1381
--- /dev/null
+++ b/src/problem2/fancy-form/package.json
@@ -0,0 +1,45 @@
+{
+ "name": "fancy-form",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc -b && vite build",
+ "lint": "eslint .",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@base-ui/react": "^1.4.1",
+ "@radix-ui/react-dialog": "^1.1.15",
+ "@radix-ui/react-slot": "^1.2.4",
+ "@tanstack/react-query": "^5.100.5",
+ "class-variance-authority": "^0.7.1",
+ "clsx": "^2.1.1",
+ "framer-motion": "^12.38.0",
+ "lucide-react": "^1.11.0",
+ "react": "^19.2.5",
+ "react-dom": "^19.2.5",
+ "react-hot-toast": "^2.6.0",
+ "tailwind-merge": "^3.5.0"
+ },
+ "devDependencies": {
+ "@eslint/js": "^10.0.1",
+ "@tailwindcss/vite": "^4.2.4",
+ "@types/node": "^24.12.2",
+ "@types/react": "^19.2.14",
+ "@types/react-dom": "^19.2.3",
+ "@vitejs/plugin-react": "^6.0.1",
+ "eslint": "^10.2.1",
+ "eslint-config-prettier": "^10.1.8",
+ "eslint-plugin-prettier": "^5.5.5",
+ "eslint-plugin-react-hooks": "^7.1.1",
+ "eslint-plugin-react-refresh": "^0.5.2",
+ "globals": "^17.5.0",
+ "prettier": "^3.8.3",
+ "tailwindcss": "^4.2.4",
+ "typescript": "~6.0.2",
+ "typescript-eslint": "^8.58.2",
+ "vite": "^8.0.10"
+ }
+}
diff --git a/src/problem2/fancy-form/public/favicon.svg b/src/problem2/fancy-form/public/favicon.svg
new file mode 100644
index 0000000000..6893eb1323
--- /dev/null
+++ b/src/problem2/fancy-form/public/favicon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/problem2/fancy-form/public/icons.svg b/src/problem2/fancy-form/public/icons.svg
new file mode 100644
index 0000000000..e9522193d9
--- /dev/null
+++ b/src/problem2/fancy-form/public/icons.svg
@@ -0,0 +1,24 @@
+
diff --git a/src/problem2/fancy-form/src/App.css b/src/problem2/fancy-form/src/App.css
new file mode 100644
index 0000000000..f90339d8f7
--- /dev/null
+++ b/src/problem2/fancy-form/src/App.css
@@ -0,0 +1,184 @@
+.counter {
+ font-size: 16px;
+ padding: 5px 10px;
+ border-radius: 5px;
+ color: var(--accent);
+ background: var(--accent-bg);
+ border: 2px solid transparent;
+ transition: border-color 0.3s;
+ margin-bottom: 24px;
+
+ &:hover {
+ border-color: var(--accent-border);
+ }
+ &:focus-visible {
+ outline: 2px solid var(--accent);
+ outline-offset: 2px;
+ }
+}
+
+.hero {
+ position: relative;
+
+ .base,
+ .framework,
+ .vite {
+ inset-inline: 0;
+ margin: 0 auto;
+ }
+
+ .base {
+ width: 170px;
+ position: relative;
+ z-index: 0;
+ }
+
+ .framework,
+ .vite {
+ position: absolute;
+ }
+
+ .framework {
+ z-index: 1;
+ top: 34px;
+ height: 28px;
+ transform: perspective(2000px) rotateZ(300deg) rotateX(44deg) rotateY(39deg)
+ scale(1.4);
+ }
+
+ .vite {
+ z-index: 0;
+ top: 107px;
+ height: 26px;
+ width: auto;
+ transform: perspective(2000px) rotateZ(300deg) rotateX(40deg) rotateY(39deg)
+ scale(0.8);
+ }
+}
+
+#center {
+ display: flex;
+ flex-direction: column;
+ gap: 25px;
+ place-content: center;
+ place-items: center;
+ flex-grow: 1;
+
+ @media (max-width: 1024px) {
+ padding: 32px 20px 24px;
+ gap: 18px;
+ }
+}
+
+#next-steps {
+ display: flex;
+ border-top: 1px solid var(--border);
+ text-align: left;
+
+ & > div {
+ flex: 1 1 0;
+ padding: 32px;
+ @media (max-width: 1024px) {
+ padding: 24px 20px;
+ }
+ }
+
+ .icon {
+ margin-bottom: 16px;
+ width: 22px;
+ height: 22px;
+ }
+
+ @media (max-width: 1024px) {
+ flex-direction: column;
+ text-align: center;
+ }
+}
+
+#docs {
+ border-right: 1px solid var(--border);
+
+ @media (max-width: 1024px) {
+ border-right: none;
+ border-bottom: 1px solid var(--border);
+ }
+}
+
+#next-steps ul {
+ list-style: none;
+ padding: 0;
+ display: flex;
+ gap: 8px;
+ margin: 32px 0 0;
+
+ .logo {
+ height: 18px;
+ }
+
+ a {
+ color: var(--text-h);
+ font-size: 16px;
+ border-radius: 6px;
+ background: var(--social-bg);
+ display: flex;
+ padding: 6px 12px;
+ align-items: center;
+ gap: 8px;
+ text-decoration: none;
+ transition: box-shadow 0.3s;
+
+ &:hover {
+ box-shadow: var(--shadow);
+ }
+ .button-icon {
+ height: 18px;
+ width: 18px;
+ }
+ }
+
+ @media (max-width: 1024px) {
+ margin-top: 20px;
+ flex-wrap: wrap;
+ justify-content: center;
+
+ li {
+ flex: 1 1 calc(50% - 8px);
+ }
+
+ a {
+ width: 100%;
+ justify-content: center;
+ box-sizing: border-box;
+ }
+ }
+}
+
+#spacer {
+ height: 88px;
+ border-top: 1px solid var(--border);
+ @media (max-width: 1024px) {
+ height: 48px;
+ }
+}
+
+.ticks {
+ position: relative;
+ width: 100%;
+
+ &::before,
+ &::after {
+ content: '';
+ position: absolute;
+ top: -4.5px;
+ border: 5px solid transparent;
+ }
+
+ &::before {
+ left: 0;
+ border-left-color: var(--border);
+ }
+ &::after {
+ right: 0;
+ border-right-color: var(--border);
+ }
+}
diff --git a/src/problem2/fancy-form/src/App.tsx b/src/problem2/fancy-form/src/App.tsx
new file mode 100644
index 0000000000..46e6cf8e20
--- /dev/null
+++ b/src/problem2/fancy-form/src/App.tsx
@@ -0,0 +1,41 @@
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
+import { Toaster } from 'react-hot-toast';
+import { ThemeProvider } from '@/context/ThemeContext';
+import { SwapCard } from '@/components/swap/SwapCard';
+import { Background } from '@/components/layout/Background';
+import { ThemeToggle } from '@/components/layout/ThemeToggle';
+
+const queryClient = new QueryClient({
+ defaultOptions: {
+ queries: {
+ refetchOnWindowFocus: false,
+ },
+ },
+});
+
+function App() {
+ return (
+
+
+
+
+
+ {/* Theme toggle - top right */}
+
+
+
+
+ {/* Swap Form */}
+
+
+
+
+ {/* Toast notifications */}
+
+
+
+
+ );
+}
+
+export default App;
diff --git a/src/problem2/fancy-form/src/api/client.ts b/src/problem2/fancy-form/src/api/client.ts
new file mode 100644
index 0000000000..6386df2169
--- /dev/null
+++ b/src/problem2/fancy-form/src/api/client.ts
@@ -0,0 +1,33 @@
+const API_BASE_URL = 'https://interview.switcheo.com';
+const DEFAULT_TIMEOUT_MS = 10_000;
+
+/**
+ * Lightweight fetch wrapper with timeout and error handling.
+ */
+export async function apiGet(endpoint: string): Promise {
+ const controller = new AbortController();
+ const timeoutId = setTimeout(() => controller.abort(), DEFAULT_TIMEOUT_MS);
+
+ try {
+ const response = await fetch(`${API_BASE_URL}${endpoint}`, {
+ method: 'GET',
+ signal: controller.signal,
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+
+ if (!response.ok) {
+ throw new Error(`API Error: ${response.status} ${response.statusText}`);
+ }
+
+ return (await response.json()) as T;
+ } catch (error) {
+ if (error instanceof DOMException && error.name === 'AbortError') {
+ throw new Error('Request timed out. Please try again.');
+ }
+ throw error;
+ } finally {
+ clearTimeout(timeoutId);
+ }
+}
diff --git a/src/problem2/fancy-form/src/api/mockData.ts b/src/problem2/fancy-form/src/api/mockData.ts
new file mode 100644
index 0000000000..f6806c4620
--- /dev/null
+++ b/src/problem2/fancy-form/src/api/mockData.ts
@@ -0,0 +1,44 @@
+import type { TokenPrice } from '@/types';
+
+/**
+ * Fallback mock data for token prices.
+ * Used when the API call fails (e.g., due to CORS restrictions in browser).
+ */
+export const MOCK_TOKEN_PRICES: TokenPrice[] = [
+ { currency: 'BLUR', date: '2023-08-29T07:10:40.000Z', price: 0.20811525423728813 },
+ { currency: 'bNEO', date: '2023-08-29T07:10:50.000Z', price: 7.1282679 },
+ { currency: 'BUSD', date: '2023-08-29T07:10:40.000Z', price: 0.999183113 },
+ { currency: 'BUSD', date: '2023-08-29T07:10:40.000Z', price: 0.9998782611186441 },
+ { currency: 'USD', date: '2023-08-29T07:10:30.000Z', price: 1 },
+ { currency: 'ETH', date: '2023-08-29T07:10:52.000Z', price: 1645.9337373737374 },
+ { currency: 'GMX', date: '2023-08-29T07:10:40.000Z', price: 36.345114372881355 },
+ { currency: 'STEVMOS', date: '2023-08-29T07:10:40.000Z', price: 0.07276706779661017 },
+ { currency: 'LUNA', date: '2023-08-29T07:10:40.000Z', price: 0.40955638983050846 },
+ { currency: 'RATOM', date: '2023-08-29T07:10:40.000Z', price: 10.250918915254237 },
+ { currency: 'STRD', date: '2023-08-29T07:10:40.000Z', price: 0.7386553389830508 },
+ { currency: 'EVMOS', date: '2023-08-29T07:10:40.000Z', price: 0.06246181355932203 },
+ { currency: 'IBCX', date: '2023-08-29T07:10:40.000Z', price: 41.26811355932203 },
+ { currency: 'IRIS', date: '2023-08-29T07:10:40.000Z', price: 0.0177095593220339 },
+ { currency: 'ampLUNA', date: '2023-08-29T07:10:40.000Z', price: 0.49548589830508477 },
+ { currency: 'KUJI', date: '2023-08-29T07:10:45.000Z', price: 0.675 },
+ { currency: 'STOSMO', date: '2023-08-29T07:10:45.000Z', price: 0.431318 },
+ { currency: 'USDC', date: '2023-08-29T07:10:40.000Z', price: 0.989832 },
+ { currency: 'axlUSDC', date: '2023-08-29T07:10:40.000Z', price: 0.989832 },
+ { currency: 'ATOM', date: '2023-08-29T07:10:50.000Z', price: 7.186657333333334 },
+ { currency: 'STATOM', date: '2023-08-29T07:10:45.000Z', price: 8.512162050847458 },
+ { currency: 'OSMO', date: '2023-08-29T07:10:50.000Z', price: 0.3772974333333333 },
+ { currency: 'rSWTH', date: '2023-08-29T07:10:40.000Z', price: 0.00408771 },
+ { currency: 'STLUNA', date: '2023-08-29T07:10:40.000Z', price: 0.44232210169491526 },
+ { currency: 'LSI', date: '2023-08-29T07:10:50.000Z', price: 67.69661525423729 },
+ { currency: 'OKB', date: '2023-08-29T07:10:40.000Z', price: 42.97562059322034 },
+ { currency: 'OKT', date: '2023-08-29T07:10:40.000Z', price: 13.561577966101694 },
+ { currency: 'SWTH', date: '2023-08-29T07:10:45.000Z', price: 0.004039850455012084 },
+ { currency: 'USC', date: '2023-08-29T07:10:40.000Z', price: 0.994 },
+ { currency: 'USDC', date: '2023-08-29T07:10:30.000Z', price: 1 },
+ { currency: 'USDC', date: '2023-08-29T07:10:30.000Z', price: 1 },
+ { currency: 'USDC', date: '2023-08-29T07:10:40.000Z', price: 0.9998782611186441 },
+ { currency: 'WBTC', date: '2023-08-29T07:10:52.000Z', price: 26002.82202020202 },
+ { currency: 'wstETH', date: '2023-08-29T07:10:40.000Z', price: 1872.2579742372882 },
+ { currency: 'YieldUSD', date: '2023-08-29T07:10:40.000Z', price: 1.0290847966101695 },
+ { currency: 'ZIL', date: '2023-08-29T07:10:50.000Z', price: 0.01651813559322034 },
+];
diff --git a/src/problem2/fancy-form/src/api/prices.ts b/src/problem2/fancy-form/src/api/prices.ts
new file mode 100644
index 0000000000..350e00af1a
--- /dev/null
+++ b/src/problem2/fancy-form/src/api/prices.ts
@@ -0,0 +1,19 @@
+import type { TokenPrice } from '@/types';
+import { apiGet } from './client';
+import { MOCK_TOKEN_PRICES } from './mockData';
+
+/**
+ * Fetches token price data from the Switcheo API.
+ * Falls back to mock data if the API call fails (e.g., CORS restrictions).
+ */
+export async function fetchTokenPrices(): Promise {
+ try {
+ return await apiGet('/prices.json');
+ } catch (error) {
+ console.warn(
+ '[fetchTokenPrices] API call failed, using mock data as fallback.',
+ error instanceof Error ? error.message : error,
+ );
+ return MOCK_TOKEN_PRICES;
+ }
+}
diff --git a/src/problem2/fancy-form/src/assets/hero.png b/src/problem2/fancy-form/src/assets/hero.png
new file mode 100644
index 0000000000..02251f4b95
Binary files /dev/null and b/src/problem2/fancy-form/src/assets/hero.png differ
diff --git a/src/problem2/fancy-form/src/assets/react.svg b/src/problem2/fancy-form/src/assets/react.svg
new file mode 100644
index 0000000000..6c87de9bb3
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/react.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/problem2/fancy-form/src/assets/token-icon/1INCH.svg b/src/problem2/fancy-form/src/assets/token-icon/1INCH.svg
new file mode 100644
index 0000000000..5970f7bd55
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/1INCH.svg
@@ -0,0 +1,17 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/AAVE.svg b/src/problem2/fancy-form/src/assets/token-icon/AAVE.svg
new file mode 100644
index 0000000000..10e65a3210
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/AAVE.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ACT.svg b/src/problem2/fancy-form/src/assets/token-icon/ACT.svg
new file mode 100644
index 0000000000..2415fef55c
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ACT.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ADA.svg b/src/problem2/fancy-form/src/assets/token-icon/ADA.svg
new file mode 100644
index 0000000000..c57bee9598
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ADA.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/AEVO.svg b/src/problem2/fancy-form/src/assets/token-icon/AEVO.svg
new file mode 100644
index 0000000000..26c36a62dd
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/AEVO.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/AGI.svg b/src/problem2/fancy-form/src/assets/token-icon/AGI.svg
new file mode 100644
index 0000000000..2617764b4c
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/AGI.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/AI16Z.svg b/src/problem2/fancy-form/src/assets/token-icon/AI16Z.svg
new file mode 100644
index 0000000000..d6b38455f9
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/AI16Z.svg
@@ -0,0 +1,19 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/AIXBT.svg b/src/problem2/fancy-form/src/assets/token-icon/AIXBT.svg
new file mode 100644
index 0000000000..2fd4c736d7
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/AIXBT.svg
@@ -0,0 +1,19 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/AKRO.svg b/src/problem2/fancy-form/src/assets/token-icon/AKRO.svg
new file mode 100644
index 0000000000..33501e5c2e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/AKRO.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/AKT.svg b/src/problem2/fancy-form/src/assets/token-icon/AKT.svg
new file mode 100644
index 0000000000..a0733cd5e8
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/AKT.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ALGO.svg b/src/problem2/fancy-form/src/assets/token-icon/ALGO.svg
new file mode 100644
index 0000000000..0c79ab88fd
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ALGO.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ALPHA.svg b/src/problem2/fancy-form/src/assets/token-icon/ALPHA.svg
new file mode 100644
index 0000000000..9d916fb949
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ALPHA.svg
@@ -0,0 +1,20 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ALT.svg b/src/problem2/fancy-form/src/assets/token-icon/ALT.svg
new file mode 100644
index 0000000000..fb551dfa7d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ALT.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/AMP.svg b/src/problem2/fancy-form/src/assets/token-icon/AMP.svg
new file mode 100644
index 0000000000..71bec9f9b4
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/AMP.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ANC.svg b/src/problem2/fancy-form/src/assets/token-icon/ANC.svg
new file mode 100644
index 0000000000..bd414783cf
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ANC.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ANDR.svg b/src/problem2/fancy-form/src/assets/token-icon/ANDR.svg
new file mode 100644
index 0000000000..fc7e23b4ef
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ANDR.svg
@@ -0,0 +1,48 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ANIME.svg b/src/problem2/fancy-form/src/assets/token-icon/ANIME.svg
new file mode 100644
index 0000000000..975db35cd4
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ANIME.svg
@@ -0,0 +1,97 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ANKR.svg b/src/problem2/fancy-form/src/assets/token-icon/ANKR.svg
new file mode 100644
index 0000000000..b8599f0165
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ANKR.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ANT.svg b/src/problem2/fancy-form/src/assets/token-icon/ANT.svg
new file mode 100644
index 0000000000..f805ff79f5
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ANT.svg
@@ -0,0 +1,20 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ANY.svg b/src/problem2/fancy-form/src/assets/token-icon/ANY.svg
new file mode 100644
index 0000000000..c504391175
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ANY.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/APE.svg b/src/problem2/fancy-form/src/assets/token-icon/APE.svg
new file mode 100644
index 0000000000..26ff9cfd4e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/APE.svg
@@ -0,0 +1,14 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/APOLLO.svg b/src/problem2/fancy-form/src/assets/token-icon/APOLLO.svg
new file mode 100644
index 0000000000..852aa5cea2
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/APOLLO.svg
@@ -0,0 +1,21 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/APT.svg b/src/problem2/fancy-form/src/assets/token-icon/APT.svg
new file mode 100644
index 0000000000..df0a169047
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/APT.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/AR.svg b/src/problem2/fancy-form/src/assets/token-icon/AR.svg
new file mode 100644
index 0000000000..5efc91fdb4
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/AR.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ARB.svg b/src/problem2/fancy-form/src/assets/token-icon/ARB.svg
new file mode 100644
index 0000000000..2666c28ab2
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ARB.svg
@@ -0,0 +1,16 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ARCH.svg b/src/problem2/fancy-form/src/assets/token-icon/ARCH.svg
new file mode 100644
index 0000000000..b6deb843a1
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ARCH.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ASA.svg b/src/problem2/fancy-form/src/assets/token-icon/ASA.svg
new file mode 100644
index 0000000000..7023a06245
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ASA.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ASTRO.svg b/src/problem2/fancy-form/src/assets/token-icon/ASTRO.svg
new file mode 100644
index 0000000000..23047ab947
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ASTRO.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ATOM-dATOM.svg b/src/problem2/fancy-form/src/assets/token-icon/ATOM-dATOM.svg
new file mode 100644
index 0000000000..07e4a7d4c2
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ATOM-dATOM.svg
@@ -0,0 +1,20 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ATOM.svg b/src/problem2/fancy-form/src/assets/token-icon/ATOM.svg
new file mode 100644
index 0000000000..f3f9d10429
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ATOM.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/AUDIO.svg b/src/problem2/fancy-form/src/assets/token-icon/AUDIO.svg
new file mode 100644
index 0000000000..527d7ae79e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/AUDIO.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/AUT.svg b/src/problem2/fancy-form/src/assets/token-icon/AUT.svg
new file mode 100644
index 0000000000..4f442bcfe1
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/AUT.svg
@@ -0,0 +1,208 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/AVA.svg b/src/problem2/fancy-form/src/assets/token-icon/AVA.svg
new file mode 100644
index 0000000000..b88859ee56
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/AVA.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/AVAIL.svg b/src/problem2/fancy-form/src/assets/token-icon/AVAIL.svg
new file mode 100644
index 0000000000..6b011a7f67
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/AVAIL.svg
@@ -0,0 +1,200 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/AVAX.svg b/src/problem2/fancy-form/src/assets/token-icon/AVAX.svg
new file mode 100644
index 0000000000..e85981529c
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/AVAX.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/AXL.svg b/src/problem2/fancy-form/src/assets/token-icon/AXL.svg
new file mode 100644
index 0000000000..a0d81a72ff
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/AXL.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/AXS.svg b/src/problem2/fancy-form/src/assets/token-icon/AXS.svg
new file mode 100644
index 0000000000..ab64a1a097
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/AXS.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/AXT.svg b/src/problem2/fancy-form/src/assets/token-icon/AXT.svg
new file mode 100644
index 0000000000..a0be2a7e32
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/AXT.svg
@@ -0,0 +1,71 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BAKE.svg b/src/problem2/fancy-form/src/assets/token-icon/BAKE.svg
new file mode 100644
index 0000000000..48e18cc4c8
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BAKE.svg
@@ -0,0 +1,16 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BAL.svg b/src/problem2/fancy-form/src/assets/token-icon/BAL.svg
new file mode 100644
index 0000000000..274d48692b
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BAL.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BAND.svg b/src/problem2/fancy-form/src/assets/token-icon/BAND.svg
new file mode 100644
index 0000000000..fe0b053178
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BAND.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BAT.svg b/src/problem2/fancy-form/src/assets/token-icon/BAT.svg
new file mode 100644
index 0000000000..6bea15edba
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BAT.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BCD.svg b/src/problem2/fancy-form/src/assets/token-icon/BCD.svg
new file mode 100644
index 0000000000..2eae4d86ac
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BCD.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BCH.svg b/src/problem2/fancy-form/src/assets/token-icon/BCH.svg
new file mode 100644
index 0000000000..c1b2185860
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BCH.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BCHA.svg b/src/problem2/fancy-form/src/assets/token-icon/BCHA.svg
new file mode 100644
index 0000000000..d1c50093bd
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BCHA.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BCN.svg b/src/problem2/fancy-form/src/assets/token-icon/BCN.svg
new file mode 100644
index 0000000000..446afbc222
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BCN.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BCNA.svg b/src/problem2/fancy-form/src/assets/token-icon/BCNA.svg
new file mode 100644
index 0000000000..81cb2950dc
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BCNA.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BELT.svg b/src/problem2/fancy-form/src/assets/token-icon/BELT.svg
new file mode 100644
index 0000000000..0711b1485c
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BELT.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BERA.svg b/src/problem2/fancy-form/src/assets/token-icon/BERA.svg
new file mode 100644
index 0000000000..e77de0c563
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BERA.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BETH.svg b/src/problem2/fancy-form/src/assets/token-icon/BETH.svg
new file mode 100644
index 0000000000..46a2401959
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BETH.svg
@@ -0,0 +1,21 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BHC.svg b/src/problem2/fancy-form/src/assets/token-icon/BHC.svg
new file mode 100644
index 0000000000..c1b2185860
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BHC.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BIT.svg b/src/problem2/fancy-form/src/assets/token-icon/BIT.svg
new file mode 100644
index 0000000000..123a839eb5
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BIT.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BLAST.svg b/src/problem2/fancy-form/src/assets/token-icon/BLAST.svg
new file mode 100644
index 0000000000..d931df3f89
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BLAST.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BLD.svg b/src/problem2/fancy-form/src/assets/token-icon/BLD.svg
new file mode 100644
index 0000000000..1674899d4e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BLD.svg
@@ -0,0 +1,19 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BLOX.svg b/src/problem2/fancy-form/src/assets/token-icon/BLOX.svg
new file mode 100644
index 0000000000..7a3045c57f
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BLOX.svg
@@ -0,0 +1,23 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BLUR.svg b/src/problem2/fancy-form/src/assets/token-icon/BLUR.svg
new file mode 100644
index 0000000000..bf1e280984
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BLUR.svg
@@ -0,0 +1,19 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BNB.svg b/src/problem2/fancy-form/src/assets/token-icon/BNB.svg
new file mode 100644
index 0000000000..a7c6699768
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BNB.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BNT.svg b/src/problem2/fancy-form/src/assets/token-icon/BNT.svg
new file mode 100644
index 0000000000..4c29bec3c9
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BNT.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BOLT.svg b/src/problem2/fancy-form/src/assets/token-icon/BOLT.svg
new file mode 100644
index 0000000000..a74a21608e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BOLT.svg
@@ -0,0 +1,21 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BONK.svg b/src/problem2/fancy-form/src/assets/token-icon/BONK.svg
new file mode 100644
index 0000000000..5df777e894
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BONK.svg
@@ -0,0 +1,424 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BOOT.svg b/src/problem2/fancy-form/src/assets/token-icon/BOOT.svg
new file mode 100644
index 0000000000..2469b80cfd
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BOOT.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BRAINS.svg b/src/problem2/fancy-form/src/assets/token-icon/BRAINS.svg
new file mode 100644
index 0000000000..5c6a1d4184
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BRAINS.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BRETT.svg b/src/problem2/fancy-form/src/assets/token-icon/BRETT.svg
new file mode 100644
index 0000000000..a799d64779
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BRETT.svg
@@ -0,0 +1,34 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BRKL.svg b/src/problem2/fancy-form/src/assets/token-icon/BRKL.svg
new file mode 100644
index 0000000000..5963d18244
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BRKL.svg
@@ -0,0 +1,276 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BTC.svg b/src/problem2/fancy-form/src/assets/token-icon/BTC.svg
new file mode 100644
index 0000000000..cd3b1e78e2
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BTC.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BTCST.svg b/src/problem2/fancy-form/src/assets/token-icon/BTCST.svg
new file mode 100644
index 0000000000..63d5b3c441
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BTCST.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BTG.svg b/src/problem2/fancy-form/src/assets/token-icon/BTG.svg
new file mode 100644
index 0000000000..41629e7d6a
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BTG.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BTM.svg b/src/problem2/fancy-form/src/assets/token-icon/BTM.svg
new file mode 100644
index 0000000000..16fdbdfda4
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BTM.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BTMX.svg b/src/problem2/fancy-form/src/assets/token-icon/BTMX.svg
new file mode 100644
index 0000000000..5e4a26a71e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BTMX.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BTSG.svg b/src/problem2/fancy-form/src/assets/token-icon/BTSG.svg
new file mode 100644
index 0000000000..9b82cf6a0b
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BTSG.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BTT.svg b/src/problem2/fancy-form/src/assets/token-icon/BTT.svg
new file mode 100644
index 0000000000..736450a2db
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BTT.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BUNNY.svg b/src/problem2/fancy-form/src/assets/token-icon/BUNNY.svg
new file mode 100644
index 0000000000..4bed16291f
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BUNNY.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BUSD.svg b/src/problem2/fancy-form/src/assets/token-icon/BUSD.svg
new file mode 100644
index 0000000000..b992764bd1
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BUSD.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/BUSDT.svg b/src/problem2/fancy-form/src/assets/token-icon/BUSDT.svg
new file mode 100644
index 0000000000..08bbf0587d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/BUSDT.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/C98.svg b/src/problem2/fancy-form/src/assets/token-icon/C98.svg
new file mode 100644
index 0000000000..3a0ff2bb70
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/C98.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/CAKE.svg b/src/problem2/fancy-form/src/assets/token-icon/CAKE.svg
new file mode 100644
index 0000000000..ce45fbe253
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/CAKE.svg
@@ -0,0 +1,8 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/CANTO.svg b/src/problem2/fancy-form/src/assets/token-icon/CANTO.svg
new file mode 100644
index 0000000000..d2758becf9
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/CANTO.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/CARB.svg b/src/problem2/fancy-form/src/assets/token-icon/CARB.svg
new file mode 100644
index 0000000000..02e14d0bfe
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/CARB.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/CAT.svg b/src/problem2/fancy-form/src/assets/token-icon/CAT.svg
new file mode 100644
index 0000000000..8f81af95be
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/CAT.svg
@@ -0,0 +1,65 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/CEL.svg b/src/problem2/fancy-form/src/assets/token-icon/CEL.svg
new file mode 100644
index 0000000000..02cfbd269c
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/CEL.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/CELO.svg b/src/problem2/fancy-form/src/assets/token-icon/CELO.svg
new file mode 100644
index 0000000000..5ff3c6c83c
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/CELO.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/CETH.svg b/src/problem2/fancy-form/src/assets/token-icon/CETH.svg
new file mode 100644
index 0000000000..448a94a7a7
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/CETH.svg
@@ -0,0 +1,17 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/CFX.svg b/src/problem2/fancy-form/src/assets/token-icon/CFX.svg
new file mode 100644
index 0000000000..07e8c434db
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/CFX.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/CGAS.svg b/src/problem2/fancy-form/src/assets/token-icon/CGAS.svg
new file mode 100644
index 0000000000..3c31d75c0c
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/CGAS.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/CHEQ.svg b/src/problem2/fancy-form/src/assets/token-icon/CHEQ.svg
new file mode 100644
index 0000000000..ed1621a482
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/CHEQ.svg
@@ -0,0 +1,34 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/CHOG.svg b/src/problem2/fancy-form/src/assets/token-icon/CHOG.svg
new file mode 100644
index 0000000000..adee63f975
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/CHOG.svg
@@ -0,0 +1,20 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/CHSB.svg b/src/problem2/fancy-form/src/assets/token-icon/CHSB.svg
new file mode 100644
index 0000000000..0118cfce5c
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/CHSB.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/CHT.svg b/src/problem2/fancy-form/src/assets/token-icon/CHT.svg
new file mode 100644
index 0000000000..19d6392712
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/CHT.svg
@@ -0,0 +1,54 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/CHZ.svg b/src/problem2/fancy-form/src/assets/token-icon/CHZ.svg
new file mode 100644
index 0000000000..68897c58f1
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/CHZ.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/CKB.svg b/src/problem2/fancy-form/src/assets/token-icon/CKB.svg
new file mode 100644
index 0000000000..888ff3323e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/CKB.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/CMDX.svg b/src/problem2/fancy-form/src/assets/token-icon/CMDX.svg
new file mode 100644
index 0000000000..028d44e951
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/CMDX.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/CMST.svg b/src/problem2/fancy-form/src/assets/token-icon/CMST.svg
new file mode 100644
index 0000000000..cd6cb419eb
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/CMST.svg
@@ -0,0 +1,13 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/CNT.svg b/src/problem2/fancy-form/src/assets/token-icon/CNT.svg
new file mode 100644
index 0000000000..c098860f72
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/CNT.svg
@@ -0,0 +1,110 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/COIN.svg b/src/problem2/fancy-form/src/assets/token-icon/COIN.svg
new file mode 100644
index 0000000000..098ee36d37
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/COIN.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/COMP.svg b/src/problem2/fancy-form/src/assets/token-icon/COMP.svg
new file mode 100644
index 0000000000..563bf3af25
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/COMP.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/COOK.svg b/src/problem2/fancy-form/src/assets/token-icon/COOK.svg
new file mode 100644
index 0000000000..615625b404
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/COOK.svg
@@ -0,0 +1,40 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/CRBRUS.svg b/src/problem2/fancy-form/src/assets/token-icon/CRBRUS.svg
new file mode 100644
index 0000000000..d847b37b3c
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/CRBRUS.svg
@@ -0,0 +1,88 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/CRE.svg b/src/problem2/fancy-form/src/assets/token-icon/CRE.svg
new file mode 100644
index 0000000000..4008331be2
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/CRE.svg
@@ -0,0 +1,42 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/CRO.svg b/src/problem2/fancy-form/src/assets/token-icon/CRO.svg
new file mode 100644
index 0000000000..75ddad7d51
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/CRO.svg
@@ -0,0 +1,8 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/CRV.svg b/src/problem2/fancy-form/src/assets/token-icon/CRV.svg
new file mode 100644
index 0000000000..f9fa597fac
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/CRV.svg
@@ -0,0 +1,790 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/CTK.svg b/src/problem2/fancy-form/src/assets/token-icon/CTK.svg
new file mode 100644
index 0000000000..96bfa4f618
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/CTK.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/CW.svg b/src/problem2/fancy-form/src/assets/token-icon/CW.svg
new file mode 100644
index 0000000000..e0d8eef0af
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/CW.svg
@@ -0,0 +1,13 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/DAG.svg b/src/problem2/fancy-form/src/assets/token-icon/DAG.svg
new file mode 100644
index 0000000000..a06db4c405
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/DAG.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/DAI.svg b/src/problem2/fancy-form/src/assets/token-icon/DAI.svg
new file mode 100644
index 0000000000..00fdd7ae1b
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/DAI.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/DAK.svg b/src/problem2/fancy-form/src/assets/token-icon/DAK.svg
new file mode 100644
index 0000000000..bbfa1b2640
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/DAK.svg
@@ -0,0 +1,20 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/DARC.svg b/src/problem2/fancy-form/src/assets/token-icon/DARC.svg
new file mode 100644
index 0000000000..8e131ded9b
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/DARC.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/DASH.svg b/src/problem2/fancy-form/src/assets/token-icon/DASH.svg
new file mode 100644
index 0000000000..17e5eb7146
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/DASH.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/DBC.svg b/src/problem2/fancy-form/src/assets/token-icon/DBC.svg
new file mode 100644
index 0000000000..91e7b72378
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/DBC.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/DCR.svg b/src/problem2/fancy-form/src/assets/token-icon/DCR.svg
new file mode 100644
index 0000000000..d97040bcfe
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/DCR.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/DEC.svg b/src/problem2/fancy-form/src/assets/token-icon/DEC.svg
new file mode 100644
index 0000000000..025f6329b0
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/DEC.svg
@@ -0,0 +1,38 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/DEGEN.svg b/src/problem2/fancy-form/src/assets/token-icon/DEGEN.svg
new file mode 100644
index 0000000000..44233e8e9d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/DEGEN.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/DENT.svg b/src/problem2/fancy-form/src/assets/token-icon/DENT.svg
new file mode 100644
index 0000000000..10035d5a1a
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/DENT.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/DGB.svg b/src/problem2/fancy-form/src/assets/token-icon/DGB.svg
new file mode 100644
index 0000000000..ecf85eb29f
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/DGB.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/DIG.svg b/src/problem2/fancy-form/src/assets/token-icon/DIG.svg
new file mode 100644
index 0000000000..b75f6740df
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/DIG.svg
@@ -0,0 +1,54 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/DKT.svg b/src/problem2/fancy-form/src/assets/token-icon/DKT.svg
new file mode 100644
index 0000000000..8d1d5a5604
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/DKT.svg
@@ -0,0 +1,65 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/DODO.svg b/src/problem2/fancy-form/src/assets/token-icon/DODO.svg
new file mode 100644
index 0000000000..514dd23b5e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/DODO.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/DOGE.svg b/src/problem2/fancy-form/src/assets/token-icon/DOGE.svg
new file mode 100644
index 0000000000..f019ca4b5e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/DOGE.svg
@@ -0,0 +1,124 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/DOT.svg b/src/problem2/fancy-form/src/assets/token-icon/DOT.svg
new file mode 100644
index 0000000000..db6de54b24
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/DOT.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/DPL.svg b/src/problem2/fancy-form/src/assets/token-icon/DPL.svg
new file mode 100644
index 0000000000..e511541f14
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/DPL.svg
@@ -0,0 +1,16 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/DPX.svg b/src/problem2/fancy-form/src/assets/token-icon/DPX.svg
new file mode 100644
index 0000000000..d96e812979
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/DPX.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/DRFT.svg b/src/problem2/fancy-form/src/assets/token-icon/DRFT.svg
new file mode 100644
index 0000000000..3f64fd9620
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/DRFT.svg
@@ -0,0 +1,83 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/DROP.svg b/src/problem2/fancy-form/src/assets/token-icon/DROP.svg
new file mode 100644
index 0000000000..dbb6c318b4
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/DROP.svg
@@ -0,0 +1,13 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/DSM.svg b/src/problem2/fancy-form/src/assets/token-icon/DSM.svg
new file mode 100644
index 0000000000..b305f5f5ea
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/DSM.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/DUVT.svg b/src/problem2/fancy-form/src/assets/token-icon/DUVT.svg
new file mode 100644
index 0000000000..4bced3bdb9
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/DUVT.svg
@@ -0,0 +1,24 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/DVPN.svg b/src/problem2/fancy-form/src/assets/token-icon/DVPN.svg
new file mode 100644
index 0000000000..cb35dbc086
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/DVPN.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/DYDX.svg b/src/problem2/fancy-form/src/assets/token-icon/DYDX.svg
new file mode 100644
index 0000000000..7977307c0f
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/DYDX.svg
@@ -0,0 +1,20 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/DYM.svg b/src/problem2/fancy-form/src/assets/token-icon/DYM.svg
new file mode 100644
index 0000000000..e696de4fd5
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/DYM.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/EEUR.svg b/src/problem2/fancy-form/src/assets/token-icon/EEUR.svg
new file mode 100644
index 0000000000..25f940a5b3
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/EEUR.svg
@@ -0,0 +1,16 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/EGLD.svg b/src/problem2/fancy-form/src/assets/token-icon/EGLD.svg
new file mode 100644
index 0000000000..e42ad2510e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/EGLD.svg
@@ -0,0 +1,36 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/EIGEN.svg b/src/problem2/fancy-form/src/assets/token-icon/EIGEN.svg
new file mode 100644
index 0000000000..350b748dd4
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/EIGEN.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ELA.svg b/src/problem2/fancy-form/src/assets/token-icon/ELA.svg
new file mode 100644
index 0000000000..7612168452
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ELA.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ELF.svg b/src/problem2/fancy-form/src/assets/token-icon/ELF.svg
new file mode 100644
index 0000000000..fd3bc6cfe8
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ELF.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ENA.svg b/src/problem2/fancy-form/src/assets/token-icon/ENA.svg
new file mode 100644
index 0000000000..2445033b08
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ENA.svg
@@ -0,0 +1,21 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ENJ.svg b/src/problem2/fancy-form/src/assets/token-icon/ENJ.svg
new file mode 100644
index 0000000000..7b832779f7
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ENJ.svg
@@ -0,0 +1,63 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ENS.svg b/src/problem2/fancy-form/src/assets/token-icon/ENS.svg
new file mode 100644
index 0000000000..94d385bc10
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ENS.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/EOS.svg b/src/problem2/fancy-form/src/assets/token-icon/EOS.svg
new file mode 100644
index 0000000000..61de71db6d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/EOS.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/EPS.svg b/src/problem2/fancy-form/src/assets/token-icon/EPS.svg
new file mode 100644
index 0000000000..ef8bb614e1
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/EPS.svg
@@ -0,0 +1,25 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ETC.svg b/src/problem2/fancy-form/src/assets/token-icon/ETC.svg
new file mode 100644
index 0000000000..7b3e8b3869
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ETC.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ETH.svg b/src/problem2/fancy-form/src/assets/token-icon/ETH.svg
new file mode 100644
index 0000000000..6a7cd5afc4
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ETH.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ETHBTC.svg b/src/problem2/fancy-form/src/assets/token-icon/ETHBTC.svg
new file mode 100644
index 0000000000..bd01fc187e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ETHBTC.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ETN.svg b/src/problem2/fancy-form/src/assets/token-icon/ETN.svg
new file mode 100644
index 0000000000..a13bc14247
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ETN.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/EUROC.svg b/src/problem2/fancy-form/src/assets/token-icon/EUROC.svg
new file mode 100644
index 0000000000..81134495c6
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/EUROC.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/EUT.svg b/src/problem2/fancy-form/src/assets/token-icon/EUT.svg
new file mode 100644
index 0000000000..56c4d324a5
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/EUT.svg
@@ -0,0 +1,208 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/EVMOS.svg b/src/problem2/fancy-form/src/assets/token-icon/EVMOS.svg
new file mode 100644
index 0000000000..8d0b90acb4
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/EVMOS.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/EWT.svg b/src/problem2/fancy-form/src/assets/token-icon/EWT.svg
new file mode 100644
index 0000000000..db6e0ec632
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/EWT.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/FARTCOIN.svg b/src/problem2/fancy-form/src/assets/token-icon/FARTCOIN.svg
new file mode 100644
index 0000000000..9fa8534fdc
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/FARTCOIN.svg
@@ -0,0 +1,158 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/FBTC.svg b/src/problem2/fancy-form/src/assets/token-icon/FBTC.svg
new file mode 100644
index 0000000000..89b376bbf9
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/FBTC.svg
@@ -0,0 +1,29 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/FEES.svg b/src/problem2/fancy-form/src/assets/token-icon/FEES.svg
new file mode 100644
index 0000000000..f31a2e1f85
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/FEES.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/FET.svg b/src/problem2/fancy-form/src/assets/token-icon/FET.svg
new file mode 100644
index 0000000000..20b53be3d1
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/FET.svg
@@ -0,0 +1,19 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/FIL.svg b/src/problem2/fancy-form/src/assets/token-icon/FIL.svg
new file mode 100644
index 0000000000..a875441006
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/FIL.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/FIS.svg b/src/problem2/fancy-form/src/assets/token-icon/FIS.svg
new file mode 100644
index 0000000000..ae28f926c9
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/FIS.svg
@@ -0,0 +1,20 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/FLIX.svg b/src/problem2/fancy-form/src/assets/token-icon/FLIX.svg
new file mode 100644
index 0000000000..962e47fb2d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/FLIX.svg
@@ -0,0 +1,37 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/FLM.svg b/src/problem2/fancy-form/src/assets/token-icon/FLM.svg
new file mode 100644
index 0000000000..73ba619981
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/FLM.svg
@@ -0,0 +1,13 @@
+
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/FLOW.svg b/src/problem2/fancy-form/src/assets/token-icon/FLOW.svg
new file mode 100644
index 0000000000..7cf7e32db2
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/FLOW.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/FLUID.svg b/src/problem2/fancy-form/src/assets/token-icon/FLUID.svg
new file mode 100644
index 0000000000..9202222f8f
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/FLUID.svg
@@ -0,0 +1,53 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/FLUO.svg b/src/problem2/fancy-form/src/assets/token-icon/FLUO.svg
new file mode 100644
index 0000000000..d4e4c7f345
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/FLUO.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/FRANK.svg b/src/problem2/fancy-form/src/assets/token-icon/FRANK.svg
new file mode 100644
index 0000000000..6a49dcfec1
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/FRANK.svg
@@ -0,0 +1,268 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/FSGLP.svg b/src/problem2/fancy-form/src/assets/token-icon/FSGLP.svg
new file mode 100644
index 0000000000..1392a246bb
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/FSGLP.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/FTM.svg b/src/problem2/fancy-form/src/assets/token-icon/FTM.svg
new file mode 100644
index 0000000000..0f46c6923c
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/FTM.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/FTT.svg b/src/problem2/fancy-form/src/assets/token-icon/FTT.svg
new file mode 100644
index 0000000000..fcd829ef4f
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/FTT.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/FTTC.svg b/src/problem2/fancy-form/src/assets/token-icon/FTTC.svg
new file mode 100644
index 0000000000..b53103bc49
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/FTTC.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/FUN.svg b/src/problem2/fancy-form/src/assets/token-icon/FUN.svg
new file mode 100644
index 0000000000..59cdc4bf25
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/FUN.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/GALA.svg b/src/problem2/fancy-form/src/assets/token-icon/GALA.svg
new file mode 100644
index 0000000000..58a423f8bb
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/GALA.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/GAMBIT.svg b/src/problem2/fancy-form/src/assets/token-icon/GAMBIT.svg
new file mode 100644
index 0000000000..b2ef5aadb3
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/GAMBIT.svg
@@ -0,0 +1,24 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/GAS.svg b/src/problem2/fancy-form/src/assets/token-icon/GAS.svg
new file mode 100644
index 0000000000..3c31d75c0c
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/GAS.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/GBT.svg b/src/problem2/fancy-form/src/assets/token-icon/GBT.svg
new file mode 100644
index 0000000000..7dcf617c3e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/GBT.svg
@@ -0,0 +1,212 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/GLP.svg b/src/problem2/fancy-form/src/assets/token-icon/GLP.svg
new file mode 100644
index 0000000000..c5eefed0ad
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/GLP.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/GM.svg b/src/problem2/fancy-form/src/assets/token-icon/GM.svg
new file mode 100644
index 0000000000..7739426dcb
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/GM.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/GMX.svg b/src/problem2/fancy-form/src/assets/token-icon/GMX.svg
new file mode 100644
index 0000000000..80a8c19e74
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/GMX.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/GNO.svg b/src/problem2/fancy-form/src/assets/token-icon/GNO.svg
new file mode 100644
index 0000000000..b53b4961bc
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/GNO.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/GNS.svg b/src/problem2/fancy-form/src/assets/token-icon/GNS.svg
new file mode 100644
index 0000000000..f47eaabf71
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/GNS.svg
@@ -0,0 +1,34 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/GOAT.svg b/src/problem2/fancy-form/src/assets/token-icon/GOAT.svg
new file mode 100644
index 0000000000..f52285aaa9
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/GOAT.svg
@@ -0,0 +1,2174 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/GRASS.svg b/src/problem2/fancy-form/src/assets/token-icon/GRASS.svg
new file mode 100644
index 0000000000..caa370fffe
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/GRASS.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/GRAV.svg b/src/problem2/fancy-form/src/assets/token-icon/GRAV.svg
new file mode 100644
index 0000000000..658e155072
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/GRAV.svg
@@ -0,0 +1,44 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/GRT.svg b/src/problem2/fancy-form/src/assets/token-icon/GRT.svg
new file mode 100644
index 0000000000..2d283004da
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/GRT.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/GT.svg b/src/problem2/fancy-form/src/assets/token-icon/GT.svg
new file mode 100644
index 0000000000..6cb00ff5c5
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/GT.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/HBAR.svg b/src/problem2/fancy-form/src/assets/token-icon/HBAR.svg
new file mode 100644
index 0000000000..62d8831906
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/HBAR.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/HDN.png b/src/problem2/fancy-form/src/assets/token-icon/HDN.png
new file mode 100644
index 0000000000..fd7e612922
Binary files /dev/null and b/src/problem2/fancy-form/src/assets/token-icon/HDN.png differ
diff --git a/src/problem2/fancy-form/src/assets/token-icon/HDN.svg b/src/problem2/fancy-form/src/assets/token-icon/HDN.svg
new file mode 100644
index 0000000000..f5fb0b1a70
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/HDN.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/HELMET.svg b/src/problem2/fancy-form/src/assets/token-icon/HELMET.svg
new file mode 100644
index 0000000000..1a50859878
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/HELMET.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/HKT.svg b/src/problem2/fancy-form/src/assets/token-icon/HKT.svg
new file mode 100644
index 0000000000..d2f5c930a7
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/HKT.svg
@@ -0,0 +1,45 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/HNT.svg b/src/problem2/fancy-form/src/assets/token-icon/HNT.svg
new file mode 100644
index 0000000000..402e236890
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/HNT.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/HOPE.svg b/src/problem2/fancy-form/src/assets/token-icon/HOPE.svg
new file mode 100644
index 0000000000..b7541ae4a9
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/HOPE.svg
@@ -0,0 +1,144 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/HOT.svg b/src/problem2/fancy-form/src/assets/token-icon/HOT.svg
new file mode 100644
index 0000000000..eab9101a1f
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/HOT.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/HT.svg b/src/problem2/fancy-form/src/assets/token-icon/HT.svg
new file mode 100644
index 0000000000..72cdfdd097
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/HT.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/HUAHUA.svg b/src/problem2/fancy-form/src/assets/token-icon/HUAHUA.svg
new file mode 100644
index 0000000000..e94cd98d8d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/HUAHUA.svg
@@ -0,0 +1,22 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/HUNY.svg b/src/problem2/fancy-form/src/assets/token-icon/HUNY.svg
new file mode 100644
index 0000000000..b06f2f5457
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/HUNY.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/problem2/fancy-form/src/assets/token-icon/HUSD.svg b/src/problem2/fancy-form/src/assets/token-icon/HUSD.svg
new file mode 100644
index 0000000000..30b26c0373
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/HUSD.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/HYPE.svg b/src/problem2/fancy-form/src/assets/token-icon/HYPE.svg
new file mode 100644
index 0000000000..24eb8536f1
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/HYPE.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/IBCX.svg b/src/problem2/fancy-form/src/assets/token-icon/IBCX.svg
new file mode 100644
index 0000000000..061c6ccefe
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/IBCX.svg
@@ -0,0 +1,14 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ICP.svg b/src/problem2/fancy-form/src/assets/token-icon/ICP.svg
new file mode 100644
index 0000000000..c7a99ba9bd
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ICP.svg
@@ -0,0 +1,16 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ICX.svg b/src/problem2/fancy-form/src/assets/token-icon/ICX.svg
new file mode 100644
index 0000000000..53efc54ef9
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ICX.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/IDT.svg b/src/problem2/fancy-form/src/assets/token-icon/IDT.svg
new file mode 100644
index 0000000000..91288c58bf
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/IDT.svg
@@ -0,0 +1,54 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/INIT.svg b/src/problem2/fancy-form/src/assets/token-icon/INIT.svg
new file mode 100644
index 0000000000..47395f6439
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/INIT.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/INJ.svg b/src/problem2/fancy-form/src/assets/token-icon/INJ.svg
new file mode 100644
index 0000000000..b6d304e498
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/INJ.svg
@@ -0,0 +1,14 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/INT.svg b/src/problem2/fancy-form/src/assets/token-icon/INT.svg
new file mode 100644
index 0000000000..9ab0d29f35
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/INT.svg
@@ -0,0 +1,82 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ION.svg b/src/problem2/fancy-form/src/assets/token-icon/ION.svg
new file mode 100644
index 0000000000..adad5f300f
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ION.svg
@@ -0,0 +1,114 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/IOST.svg b/src/problem2/fancy-form/src/assets/token-icon/IOST.svg
new file mode 100644
index 0000000000..8f791796a3
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/IOST.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/IOTX.svg b/src/problem2/fancy-form/src/assets/token-icon/IOTX.svg
new file mode 100644
index 0000000000..97a8461838
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/IOTX.svg
@@ -0,0 +1,26 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/IOV.svg b/src/problem2/fancy-form/src/assets/token-icon/IOV.svg
new file mode 100644
index 0000000000..2c37835fff
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/IOV.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/IP.svg b/src/problem2/fancy-form/src/assets/token-icon/IP.svg
new file mode 100644
index 0000000000..be63bba6d7
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/IP.svg
@@ -0,0 +1,24 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/IRIS.svg b/src/problem2/fancy-form/src/assets/token-icon/IRIS.svg
new file mode 100644
index 0000000000..59b13b5aa6
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/IRIS.svg
@@ -0,0 +1,51 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/IXO.svg b/src/problem2/fancy-form/src/assets/token-icon/IXO.svg
new file mode 100644
index 0000000000..0d1fb10136
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/IXO.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/JPT.svg b/src/problem2/fancy-form/src/assets/token-icon/JPT.svg
new file mode 100644
index 0000000000..14014e4cb8
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/JPT.svg
@@ -0,0 +1,54 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/JTO.svg b/src/problem2/fancy-form/src/assets/token-icon/JTO.svg
new file mode 100644
index 0000000000..3ce7f51587
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/JTO.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/JUNO.svg b/src/problem2/fancy-form/src/assets/token-icon/JUNO.svg
new file mode 100644
index 0000000000..d65fb3da31
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/JUNO.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/JUP.svg b/src/problem2/fancy-form/src/assets/token-icon/JUP.svg
new file mode 100644
index 0000000000..adf9284819
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/JUP.svg
@@ -0,0 +1,34 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/KAITO.svg b/src/problem2/fancy-form/src/assets/token-icon/KAITO.svg
new file mode 100644
index 0000000000..f51471047a
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/KAITO.svg
@@ -0,0 +1,16 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/KAS.svg b/src/problem2/fancy-form/src/assets/token-icon/KAS.svg
new file mode 100644
index 0000000000..1c9ea6bc49
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/KAS.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/KBONK.svg b/src/problem2/fancy-form/src/assets/token-icon/KBONK.svg
new file mode 100644
index 0000000000..5df777e894
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/KBONK.svg
@@ -0,0 +1,424 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/KCS.svg b/src/problem2/fancy-form/src/assets/token-icon/KCS.svg
new file mode 100644
index 0000000000..a4b333dfb8
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/KCS.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/KFLOKI.svg b/src/problem2/fancy-form/src/assets/token-icon/KFLOKI.svg
new file mode 100644
index 0000000000..d35699e87e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/KFLOKI.svg
@@ -0,0 +1,40 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/KLAY.svg b/src/problem2/fancy-form/src/assets/token-icon/KLAY.svg
new file mode 100644
index 0000000000..6f1d4cabef
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/KLAY.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/KMD.svg b/src/problem2/fancy-form/src/assets/token-icon/KMD.svg
new file mode 100644
index 0000000000..62598658bb
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/KMD.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/KNC.svg b/src/problem2/fancy-form/src/assets/token-icon/KNC.svg
new file mode 100644
index 0000000000..d9ed00657f
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/KNC.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/KPEPE.svg b/src/problem2/fancy-form/src/assets/token-icon/KPEPE.svg
new file mode 100644
index 0000000000..92665e5502
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/KPEPE.svg
@@ -0,0 +1,28 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/KRT.svg b/src/problem2/fancy-form/src/assets/token-icon/KRT.svg
new file mode 100644
index 0000000000..e6ea416cf6
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/KRT.svg
@@ -0,0 +1,248 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/KSHIB.svg b/src/problem2/fancy-form/src/assets/token-icon/KSHIB.svg
new file mode 100644
index 0000000000..adbb2f009b
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/KSHIB.svg
@@ -0,0 +1,17 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/KSM.svg b/src/problem2/fancy-form/src/assets/token-icon/KSM.svg
new file mode 100644
index 0000000000..771f73596e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/KSM.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/KUJI.svg b/src/problem2/fancy-form/src/assets/token-icon/KUJI.svg
new file mode 100644
index 0000000000..7c169dd724
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/KUJI.svg
@@ -0,0 +1,19 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LAYER.svg b/src/problem2/fancy-form/src/assets/token-icon/LAYER.svg
new file mode 100644
index 0000000000..9e9036df30
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LAYER.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LBTC.svg b/src/problem2/fancy-form/src/assets/token-icon/LBTC.svg
new file mode 100644
index 0000000000..1476de62ab
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LBTC.svg
@@ -0,0 +1,26 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LDO.svg b/src/problem2/fancy-form/src/assets/token-icon/LDO.svg
new file mode 100644
index 0000000000..c8860768cf
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LDO.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LEO.svg b/src/problem2/fancy-form/src/assets/token-icon/LEO.svg
new file mode 100644
index 0000000000..f94a11c945
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LEO.svg
@@ -0,0 +1,77 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LET.svg b/src/problem2/fancy-form/src/assets/token-icon/LET.svg
new file mode 100644
index 0000000000..8f6a4a06e6
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LET.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LIKE.svg b/src/problem2/fancy-form/src/assets/token-icon/LIKE.svg
new file mode 100644
index 0000000000..a0ac6ac6ac
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LIKE.svg
@@ -0,0 +1,41 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LINK.svg b/src/problem2/fancy-form/src/assets/token-icon/LINK.svg
new file mode 100644
index 0000000000..8484106a43
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LINK.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LKT.svg b/src/problem2/fancy-form/src/assets/token-icon/LKT.svg
new file mode 100644
index 0000000000..f224ae0ff2
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LKT.svg
@@ -0,0 +1,16 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LOOM.svg b/src/problem2/fancy-form/src/assets/token-icon/LOOM.svg
new file mode 100644
index 0000000000..5ad0435613
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LOOM.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LOOP.svg b/src/problem2/fancy-form/src/assets/token-icon/LOOP.svg
new file mode 100644
index 0000000000..6c69420439
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LOOP.svg
@@ -0,0 +1,35 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LOTA.svg b/src/problem2/fancy-form/src/assets/token-icon/LOTA.svg
new file mode 100644
index 0000000000..10c742ae6d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LOTA.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LPLBTC_29MAY2025.svg b/src/problem2/fancy-form/src/assets/token-icon/LPLBTC_29MAY2025.svg
new file mode 100644
index 0000000000..d75f81bcd5
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LPLBTC_29MAY2025.svg
@@ -0,0 +1,35 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LPT.svg b/src/problem2/fancy-form/src/assets/token-icon/LPT.svg
new file mode 100644
index 0000000000..c026842d93
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LPT.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LPberaSTONE_10APR2025.svg b/src/problem2/fancy-form/src/assets/token-icon/LPberaSTONE_10APR2025.svg
new file mode 100644
index 0000000000..24fd8ebe9a
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LPberaSTONE_10APR2025.svg
@@ -0,0 +1,29 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LPcmETH_26JUN2025.svg b/src/problem2/fancy-form/src/assets/token-icon/LPcmETH_26JUN2025.svg
new file mode 100644
index 0000000000..dd4bb6fbbc
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LPcmETH_26JUN2025.svg
@@ -0,0 +1,31 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LRC.svg b/src/problem2/fancy-form/src/assets/token-icon/LRC.svg
new file mode 100644
index 0000000000..2319bb063d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LRC.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LSI.svg b/src/problem2/fancy-form/src/assets/token-icon/LSI.svg
new file mode 100644
index 0000000000..48618f66b3
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LSI.svg
@@ -0,0 +1,53 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LSK.svg b/src/problem2/fancy-form/src/assets/token-icon/LSK.svg
new file mode 100644
index 0000000000..d7b38f123e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LSK.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LTC.svg b/src/problem2/fancy-form/src/assets/token-icon/LTC.svg
new file mode 100644
index 0000000000..d734c3ac54
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LTC.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LUM.svg b/src/problem2/fancy-form/src/assets/token-icon/LUM.svg
new file mode 100644
index 0000000000..8994d02ad5
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LUM.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LUNA.svg b/src/problem2/fancy-form/src/assets/token-icon/LUNA.svg
new file mode 100644
index 0000000000..6a839981dd
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LUNA.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LUNAX.svg b/src/problem2/fancy-form/src/assets/token-icon/LUNAX.svg
new file mode 100644
index 0000000000..afc19e17de
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LUNAX.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LUNC.svg b/src/problem2/fancy-form/src/assets/token-icon/LUNC.svg
new file mode 100644
index 0000000000..fe40173c96
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LUNC.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LUNI.svg b/src/problem2/fancy-form/src/assets/token-icon/LUNI.svg
new file mode 100644
index 0000000000..1721643744
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LUNI.svg
@@ -0,0 +1,29 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LUNR.svg b/src/problem2/fancy-form/src/assets/token-icon/LUNR.svg
new file mode 100644
index 0000000000..1b8b15237f
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LUNR.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LUV.svg b/src/problem2/fancy-form/src/assets/token-icon/LUV.svg
new file mode 100644
index 0000000000..0f7342c490
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LUV.svg
@@ -0,0 +1,49 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/LVN.svg b/src/problem2/fancy-form/src/assets/token-icon/LVN.svg
new file mode 100644
index 0000000000..65aac46ea5
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/LVN.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/Liquid Staking Index.svg b/src/problem2/fancy-form/src/assets/token-icon/Liquid Staking Index.svg
new file mode 100644
index 0000000000..58533746be
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/Liquid Staking Index.svg
@@ -0,0 +1,29 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/M87.svg b/src/problem2/fancy-form/src/assets/token-icon/M87.svg
new file mode 100644
index 0000000000..77f8c882b5
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/M87.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/MANA.svg b/src/problem2/fancy-form/src/assets/token-icon/MANA.svg
new file mode 100644
index 0000000000..0629467224
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/MANA.svg
@@ -0,0 +1,26 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/MANTA.svg b/src/problem2/fancy-form/src/assets/token-icon/MANTA.svg
new file mode 100644
index 0000000000..1970537a1f
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/MANTA.svg
@@ -0,0 +1,25 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/MARBLE.svg b/src/problem2/fancy-form/src/assets/token-icon/MARBLE.svg
new file mode 100644
index 0000000000..4e9c2214f2
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/MARBLE.svg
@@ -0,0 +1,8 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/MATH.svg b/src/problem2/fancy-form/src/assets/token-icon/MATH.svg
new file mode 100644
index 0000000000..144d40f0bb
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/MATH.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/MATIC.svg b/src/problem2/fancy-form/src/assets/token-icon/MATIC.svg
new file mode 100644
index 0000000000..98d07c7d95
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/MATIC.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/MDX.svg b/src/problem2/fancy-form/src/assets/token-icon/MDX.svg
new file mode 100644
index 0000000000..8f3b267801
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/MDX.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ME.svg b/src/problem2/fancy-form/src/assets/token-icon/ME.svg
new file mode 100644
index 0000000000..f354182728
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ME.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/MED.svg b/src/problem2/fancy-form/src/assets/token-icon/MED.svg
new file mode 100644
index 0000000000..900d139258
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/MED.svg
@@ -0,0 +1,8 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/MEME.svg b/src/problem2/fancy-form/src/assets/token-icon/MEME.svg
new file mode 100644
index 0000000000..d784304a65
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/MEME.svg
@@ -0,0 +1,13 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/METIS.svg b/src/problem2/fancy-form/src/assets/token-icon/METIS.svg
new file mode 100644
index 0000000000..3bd43ffadb
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/METIS.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/MEW.svg b/src/problem2/fancy-form/src/assets/token-icon/MEW.svg
new file mode 100644
index 0000000000..dc9532c537
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/MEW.svg
@@ -0,0 +1,25 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/MIAW.svg b/src/problem2/fancy-form/src/assets/token-icon/MIAW.svg
new file mode 100644
index 0000000000..ddf46721c7
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/MIAW.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/MILK.svg b/src/problem2/fancy-form/src/assets/token-icon/MILK.svg
new file mode 100644
index 0000000000..e6a434e9c1
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/MILK.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/MINA.svg b/src/problem2/fancy-form/src/assets/token-icon/MINA.svg
new file mode 100644
index 0000000000..d5aafd7398
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/MINA.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/MINE.svg b/src/problem2/fancy-form/src/assets/token-icon/MINE.svg
new file mode 100644
index 0000000000..ff71cab9e7
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/MINE.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/MIOTA.svg b/src/problem2/fancy-form/src/assets/token-icon/MIOTA.svg
new file mode 100644
index 0000000000..3d3c08c604
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/MIOTA.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/MIR.svg b/src/problem2/fancy-form/src/assets/token-icon/MIR.svg
new file mode 100644
index 0000000000..0247791318
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/MIR.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/MKR.svg b/src/problem2/fancy-form/src/assets/token-icon/MKR.svg
new file mode 100644
index 0000000000..9a639d1374
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/MKR.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/MMOG.svg b/src/problem2/fancy-form/src/assets/token-icon/MMOG.svg
new file mode 100644
index 0000000000..6bb1f33b10
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/MMOG.svg
@@ -0,0 +1,20 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/MNT.svg b/src/problem2/fancy-form/src/assets/token-icon/MNT.svg
new file mode 100644
index 0000000000..1aa231ddd4
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/MNT.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/MNTA.svg b/src/problem2/fancy-form/src/assets/token-icon/MNTA.svg
new file mode 100644
index 0000000000..e3b7cfa957
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/MNTA.svg
@@ -0,0 +1,18 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/MNTL.svg b/src/problem2/fancy-form/src/assets/token-icon/MNTL.svg
new file mode 100644
index 0000000000..71e1c497e9
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/MNTL.svg
@@ -0,0 +1,17 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/MON.svg b/src/problem2/fancy-form/src/assets/token-icon/MON.svg
new file mode 100644
index 0000000000..be988333af
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/MON.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/MOODENG.svg b/src/problem2/fancy-form/src/assets/token-icon/MOODENG.svg
new file mode 100644
index 0000000000..679ffc5b35
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/MOODENG.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/MORPHO.svg b/src/problem2/fancy-form/src/assets/token-icon/MORPHO.svg
new file mode 100644
index 0000000000..a27a0fb363
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/MORPHO.svg
@@ -0,0 +1,14 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/MYT.svg b/src/problem2/fancy-form/src/assets/token-icon/MYT.svg
new file mode 100644
index 0000000000..92cbc6468d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/MYT.svg
@@ -0,0 +1,171 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/NANO.svg b/src/problem2/fancy-form/src/assets/token-icon/NANO.svg
new file mode 100644
index 0000000000..9ed54dd843
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/NANO.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/NAS.svg b/src/problem2/fancy-form/src/assets/token-icon/NAS.svg
new file mode 100644
index 0000000000..071766c17c
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/NAS.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/NAT.svg b/src/problem2/fancy-form/src/assets/token-icon/NAT.svg
new file mode 100644
index 0000000000..d72f7e18fc
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/NAT.svg
@@ -0,0 +1,8 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/NEAR.svg b/src/problem2/fancy-form/src/assets/token-icon/NEAR.svg
new file mode 100644
index 0000000000..7bc784c808
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/NEAR.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/NEIROETH.svg b/src/problem2/fancy-form/src/assets/token-icon/NEIROETH.svg
new file mode 100644
index 0000000000..3ced226feb
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/NEIROETH.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/NEO.svg b/src/problem2/fancy-form/src/assets/token-icon/NEO.svg
new file mode 100644
index 0000000000..d4a90e1b27
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/NEO.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/NETA.svg b/src/problem2/fancy-form/src/assets/token-icon/NETA.svg
new file mode 100644
index 0000000000..b617dbef98
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/NETA.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/NEX.svg b/src/problem2/fancy-form/src/assets/token-icon/NEX.svg
new file mode 100644
index 0000000000..34be620b9e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/NEX.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/NEXO.svg b/src/problem2/fancy-form/src/assets/token-icon/NEXO.svg
new file mode 100644
index 0000000000..4f8507a40f
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/NEXO.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/NGM.svg b/src/problem2/fancy-form/src/assets/token-icon/NGM.svg
new file mode 100644
index 0000000000..ebdc8a035d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/NGM.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/NIM.svg b/src/problem2/fancy-form/src/assets/token-icon/NIM.svg
new file mode 100644
index 0000000000..ec74006b7c
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/NIM.svg
@@ -0,0 +1,23 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/NKN.svg b/src/problem2/fancy-form/src/assets/token-icon/NKN.svg
new file mode 100644
index 0000000000..e008ac5d71
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/NKN.svg
@@ -0,0 +1,22 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/NMR.svg b/src/problem2/fancy-form/src/assets/token-icon/NMR.svg
new file mode 100644
index 0000000000..fcb458cafa
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/NMR.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/NOT.svg b/src/problem2/fancy-form/src/assets/token-icon/NOT.svg
new file mode 100644
index 0000000000..5561ccec77
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/NOT.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/NOTE.svg b/src/problem2/fancy-form/src/assets/token-icon/NOTE.svg
new file mode 100644
index 0000000000..9f44e1971f
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/NOTE.svg
@@ -0,0 +1,17 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/NTRN-dATOM.svg b/src/problem2/fancy-form/src/assets/token-icon/NTRN-dATOM.svg
new file mode 100644
index 0000000000..5b3303f21b
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/NTRN-dATOM.svg
@@ -0,0 +1,21 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/NTRN.svg b/src/problem2/fancy-form/src/assets/token-icon/NTRN.svg
new file mode 100644
index 0000000000..150a6137d2
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/NTRN.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/NXM.svg b/src/problem2/fancy-form/src/assets/token-icon/NXM.svg
new file mode 100644
index 0000000000..165bc3b984
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/NXM.svg
@@ -0,0 +1,8 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/OCEAN.svg b/src/problem2/fancy-form/src/assets/token-icon/OCEAN.svg
new file mode 100644
index 0000000000..ad0f99d6ae
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/OCEAN.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/OCH.svg b/src/problem2/fancy-form/src/assets/token-icon/OCH.svg
new file mode 100644
index 0000000000..51c3f8e039
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/OCH.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/OGN.svg b/src/problem2/fancy-form/src/assets/token-icon/OGN.svg
new file mode 100644
index 0000000000..e15dbac858
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/OGN.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/OKB.svg b/src/problem2/fancy-form/src/assets/token-icon/OKB.svg
new file mode 100644
index 0000000000..786f75ba42
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/OKB.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/OKT.svg b/src/problem2/fancy-form/src/assets/token-icon/OKT.svg
new file mode 100644
index 0000000000..0afcd8a1cf
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/OKT.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/OM.svg b/src/problem2/fancy-form/src/assets/token-icon/OM.svg
new file mode 100644
index 0000000000..6305bd1560
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/OM.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/OMG.svg b/src/problem2/fancy-form/src/assets/token-icon/OMG.svg
new file mode 100644
index 0000000000..2d3d8ae8e6
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/OMG.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/OMG_2.svg b/src/problem2/fancy-form/src/assets/token-icon/OMG_2.svg
new file mode 100644
index 0000000000..5735f9f726
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/OMG_2.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/OMI.svg b/src/problem2/fancy-form/src/assets/token-icon/OMI.svg
new file mode 100644
index 0000000000..b1d5020084
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/OMI.svg
@@ -0,0 +1,18 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/OMNI.svg b/src/problem2/fancy-form/src/assets/token-icon/OMNI.svg
new file mode 100644
index 0000000000..ea1ce8353d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/OMNI.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ONDO.svg b/src/problem2/fancy-form/src/assets/token-icon/ONDO.svg
new file mode 100644
index 0000000000..84482f794d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ONDO.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ONE.svg b/src/problem2/fancy-form/src/assets/token-icon/ONE.svg
new file mode 100644
index 0000000000..63c1260c06
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ONE.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ONT.svg b/src/problem2/fancy-form/src/assets/token-icon/ONT.svg
new file mode 100644
index 0000000000..93378b4745
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ONT.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/OP.svg b/src/problem2/fancy-form/src/assets/token-icon/OP.svg
new file mode 100644
index 0000000000..b5feac7946
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/OP.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/OPUL.svg b/src/problem2/fancy-form/src/assets/token-icon/OPUL.svg
new file mode 100644
index 0000000000..c7ae4dbf3e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/OPUL.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ORDI.svg b/src/problem2/fancy-form/src/assets/token-icon/ORDI.svg
new file mode 100644
index 0000000000..380181270d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ORDI.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ORION.svg b/src/problem2/fancy-form/src/assets/token-icon/ORION.svg
new file mode 100644
index 0000000000..b5f9ba6fff
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ORION.svg
@@ -0,0 +1,8 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ORNE.svg b/src/problem2/fancy-form/src/assets/token-icon/ORNE.svg
new file mode 100644
index 0000000000..d986b3f31e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ORNE.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/OSMO.svg b/src/problem2/fancy-form/src/assets/token-icon/OSMO.svg
new file mode 100644
index 0000000000..e98545517b
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/OSMO.svg
@@ -0,0 +1,121 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/OXT.svg b/src/problem2/fancy-form/src/assets/token-icon/OXT.svg
new file mode 100644
index 0000000000..bba9547da1
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/OXT.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/OXY.svg b/src/problem2/fancy-form/src/assets/token-icon/OXY.svg
new file mode 100644
index 0000000000..9175a0b900
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/OXY.svg
@@ -0,0 +1,22 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/PAX.svg b/src/problem2/fancy-form/src/assets/token-icon/PAX.svg
new file mode 100644
index 0000000000..32b0ef8211
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/PAX.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/PAXG.svg b/src/problem2/fancy-form/src/assets/token-icon/PAXG.svg
new file mode 100644
index 0000000000..5ff89051f8
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/PAXG.svg
@@ -0,0 +1,22 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/PENDLE.svg b/src/problem2/fancy-form/src/assets/token-icon/PENDLE.svg
new file mode 100644
index 0000000000..367540fbb0
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/PENDLE.svg
@@ -0,0 +1,17 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/PENGU.svg b/src/problem2/fancy-form/src/assets/token-icon/PENGU.svg
new file mode 100644
index 0000000000..a5c99add38
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/PENGU.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/PEPE.svg b/src/problem2/fancy-form/src/assets/token-icon/PEPE.svg
new file mode 100644
index 0000000000..1e6ba151a3
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/PEPE.svg
@@ -0,0 +1,28 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/PHT.svg b/src/problem2/fancy-form/src/assets/token-icon/PHT.svg
new file mode 100644
index 0000000000..d515118058
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/PHT.svg
@@ -0,0 +1,124 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/PLAY.svg b/src/problem2/fancy-form/src/assets/token-icon/PLAY.svg
new file mode 100644
index 0000000000..bae2577420
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/PLAY.svg
@@ -0,0 +1,23 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/PLQ.svg b/src/problem2/fancy-form/src/assets/token-icon/PLQ.svg
new file mode 100644
index 0000000000..31b353bb45
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/PLQ.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/PLY.svg b/src/problem2/fancy-form/src/assets/token-icon/PLY.svg
new file mode 100644
index 0000000000..c79b320445
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/PLY.svg
@@ -0,0 +1,42 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/PNUT.svg b/src/problem2/fancy-form/src/assets/token-icon/PNUT.svg
new file mode 100644
index 0000000000..90abdb384d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/PNUT.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/POL.svg b/src/problem2/fancy-form/src/assets/token-icon/POL.svg
new file mode 100644
index 0000000000..ceff03709c
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/POL.svg
@@ -0,0 +1,19 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/POLY.svg b/src/problem2/fancy-form/src/assets/token-icon/POLY.svg
new file mode 100644
index 0000000000..b894fef5d5
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/POLY.svg
@@ -0,0 +1,55 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/POPCAT.svg b/src/problem2/fancy-form/src/assets/token-icon/POPCAT.svg
new file mode 100644
index 0000000000..ab8fa4c5e5
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/POPCAT.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/PORT.svg b/src/problem2/fancy-form/src/assets/token-icon/PORT.svg
new file mode 100644
index 0000000000..d846537361
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/PORT.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/PROM.svg b/src/problem2/fancy-form/src/assets/token-icon/PROM.svg
new file mode 100644
index 0000000000..044c9e3576
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/PROM.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/PSI.svg b/src/problem2/fancy-form/src/assets/token-icon/PSI.svg
new file mode 100644
index 0000000000..674744b4e5
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/PSI.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/PSTAKE.svg b/src/problem2/fancy-form/src/assets/token-icon/PSTAKE.svg
new file mode 100644
index 0000000000..caf13d8d63
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/PSTAKE.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/PTLBTC_29MAY2025.svg b/src/problem2/fancy-form/src/assets/token-icon/PTLBTC_29MAY2025.svg
new file mode 100644
index 0000000000..afb01c923b
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/PTLBTC_29MAY2025.svg
@@ -0,0 +1,27 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/PTMETH_26DEC2024.svg b/src/problem2/fancy-form/src/assets/token-icon/PTMETH_26DEC2024.svg
new file mode 100644
index 0000000000..3256ec9f5f
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/PTMETH_26DEC2024.svg
@@ -0,0 +1,30 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/PTberaSTONE_10APR2025.svg b/src/problem2/fancy-form/src/assets/token-icon/PTberaSTONE_10APR2025.svg
new file mode 100644
index 0000000000..1444e75dfb
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/PTberaSTONE_10APR2025.svg
@@ -0,0 +1,21 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/PTcmETH_26JUN2025.svg b/src/problem2/fancy-form/src/assets/token-icon/PTcmETH_26JUN2025.svg
new file mode 100644
index 0000000000..860a1e3892
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/PTcmETH_26JUN2025.svg
@@ -0,0 +1,23 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/PUDGY.svg b/src/problem2/fancy-form/src/assets/token-icon/PUDGY.svg
new file mode 100644
index 0000000000..239424d8cd
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/PUDGY.svg
@@ -0,0 +1,23 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/PUMP.svg b/src/problem2/fancy-form/src/assets/token-icon/PUMP.svg
new file mode 100644
index 0000000000..3b8ac28fda
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/PUMP.svg
@@ -0,0 +1,67 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/PUNDIX.svg b/src/problem2/fancy-form/src/assets/token-icon/PUNDIX.svg
new file mode 100644
index 0000000000..a522d0d26e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/PUNDIX.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/PURR.svg b/src/problem2/fancy-form/src/assets/token-icon/PURR.svg
new file mode 100644
index 0000000000..c8b82375cb
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/PURR.svg
@@ -0,0 +1,62 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/PURSE.svg b/src/problem2/fancy-form/src/assets/token-icon/PURSE.svg
new file mode 100644
index 0000000000..9188e092de
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/PURSE.svg
@@ -0,0 +1,22 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/PYTH.svg b/src/problem2/fancy-form/src/assets/token-icon/PYTH.svg
new file mode 100644
index 0000000000..b34cc9ea3d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/PYTH.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/QCK.svg b/src/problem2/fancy-form/src/assets/token-icon/QCK.svg
new file mode 100644
index 0000000000..358cb7dbbf
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/QCK.svg
@@ -0,0 +1,80 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/QKC.svg b/src/problem2/fancy-form/src/assets/token-icon/QKC.svg
new file mode 100644
index 0000000000..e312777506
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/QKC.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/QNT.svg b/src/problem2/fancy-form/src/assets/token-icon/QNT.svg
new file mode 100644
index 0000000000..a611eaa24a
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/QNT.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/QTUM.svg b/src/problem2/fancy-form/src/assets/token-icon/QTUM.svg
new file mode 100644
index 0000000000..e96f6cf2ca
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/QTUM.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/RAY.svg b/src/problem2/fancy-form/src/assets/token-icon/RAY.svg
new file mode 100644
index 0000000000..e769284e27
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/RAY.svg
@@ -0,0 +1,14 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/RBN.svg b/src/problem2/fancy-form/src/assets/token-icon/RBN.svg
new file mode 100644
index 0000000000..ef40c376d8
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/RBN.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/REEF.svg b/src/problem2/fancy-form/src/assets/token-icon/REEF.svg
new file mode 100644
index 0000000000..5c777f840f
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/REEF.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/REGEN.svg b/src/problem2/fancy-form/src/assets/token-icon/REGEN.svg
new file mode 100644
index 0000000000..242a4c66c9
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/REGEN.svg
@@ -0,0 +1,24 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/REN.svg b/src/problem2/fancy-form/src/assets/token-icon/REN.svg
new file mode 100644
index 0000000000..bae08ca56f
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/REN.svg
@@ -0,0 +1,16 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/REP.svg b/src/problem2/fancy-form/src/assets/token-icon/REP.svg
new file mode 100644
index 0000000000..c311970b6d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/REP.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/REV.svg b/src/problem2/fancy-form/src/assets/token-icon/REV.svg
new file mode 100644
index 0000000000..6dcaa131aa
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/REV.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/RLB.svg b/src/problem2/fancy-form/src/assets/token-icon/RLB.svg
new file mode 100644
index 0000000000..344fe8e022
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/RLB.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/RLC.svg b/src/problem2/fancy-form/src/assets/token-icon/RLC.svg
new file mode 100644
index 0000000000..c816edf016
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/RLC.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/RNDR.svg b/src/problem2/fancy-form/src/assets/token-icon/RNDR.svg
new file mode 100644
index 0000000000..031e8816b3
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/RNDR.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ROAR.svg b/src/problem2/fancy-form/src/assets/token-icon/ROAR.svg
new file mode 100644
index 0000000000..d29ab09634
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ROAR.svg
@@ -0,0 +1,18 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ROWAN.svg b/src/problem2/fancy-form/src/assets/token-icon/ROWAN.svg
new file mode 100644
index 0000000000..6b395742d4
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ROWAN.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/RSR.svg b/src/problem2/fancy-form/src/assets/token-icon/RSR.svg
new file mode 100644
index 0000000000..f85bb78c23
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/RSR.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/RUNE.svg b/src/problem2/fancy-form/src/assets/token-icon/RUNE.svg
new file mode 100644
index 0000000000..ccbb65ceff
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/RUNE.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/RVN.svg b/src/problem2/fancy-form/src/assets/token-icon/RVN.svg
new file mode 100644
index 0000000000..4d6d30eeef
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/RVN.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/S.svg b/src/problem2/fancy-form/src/assets/token-icon/S.svg
new file mode 100644
index 0000000000..b216a1804f
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/S.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SAFEMOON.svg b/src/problem2/fancy-form/src/assets/token-icon/SAFEMOON.svg
new file mode 100644
index 0000000000..9ff12873a5
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SAFEMOON.svg
@@ -0,0 +1,27 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SAGA.svg b/src/problem2/fancy-form/src/assets/token-icon/SAGA.svg
new file mode 100644
index 0000000000..53455ea0dd
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SAGA.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SAND.svg b/src/problem2/fancy-form/src/assets/token-icon/SAND.svg
new file mode 100644
index 0000000000..4e01196b45
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SAND.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SAYVE.svg b/src/problem2/fancy-form/src/assets/token-icon/SAYVE.svg
new file mode 100644
index 0000000000..2cea35fc51
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SAYVE.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SC.svg b/src/problem2/fancy-form/src/assets/token-icon/SC.svg
new file mode 100644
index 0000000000..aebc27644b
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SC.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SCRT.svg b/src/problem2/fancy-form/src/assets/token-icon/SCRT.svg
new file mode 100644
index 0000000000..9451de4116
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SCRT.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SDT.svg b/src/problem2/fancy-form/src/assets/token-icon/SDT.svg
new file mode 100644
index 0000000000..222a72897f
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SDT.svg
@@ -0,0 +1,48 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SEI.svg b/src/problem2/fancy-form/src/assets/token-icon/SEI.svg
new file mode 100644
index 0000000000..65ea99277e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SEI.svg
@@ -0,0 +1,14 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SET.svg b/src/problem2/fancy-form/src/assets/token-icon/SET.svg
new file mode 100644
index 0000000000..f46a6ba24f
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SET.svg
@@ -0,0 +1,65 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SGT.svg b/src/problem2/fancy-form/src/assets/token-icon/SGT.svg
new file mode 100644
index 0000000000..a975dece90
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SGT.svg
@@ -0,0 +1,138 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SHD.svg b/src/problem2/fancy-form/src/assets/token-icon/SHD.svg
new file mode 100644
index 0000000000..bdb7e6c29c
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SHD.svg
@@ -0,0 +1,34 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SHIB.svg b/src/problem2/fancy-form/src/assets/token-icon/SHIB.svg
new file mode 100644
index 0000000000..adbb2f009b
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SHIB.svg
@@ -0,0 +1,17 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SHIDO.svg b/src/problem2/fancy-form/src/assets/token-icon/SHIDO.svg
new file mode 100644
index 0000000000..bd7deeeb4b
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SHIDO.svg
@@ -0,0 +1,20 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SITY.svg b/src/problem2/fancy-form/src/assets/token-icon/SITY.svg
new file mode 100644
index 0000000000..7cfb8209bf
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SITY.svg
@@ -0,0 +1,8 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SLERF.svg b/src/problem2/fancy-form/src/assets/token-icon/SLERF.svg
new file mode 100644
index 0000000000..713f29af95
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SLERF.svg
@@ -0,0 +1,24 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SNT.svg b/src/problem2/fancy-form/src/assets/token-icon/SNT.svg
new file mode 100644
index 0000000000..cc8ad2df4c
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SNT.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SNX.svg b/src/problem2/fancy-form/src/assets/token-icon/SNX.svg
new file mode 100644
index 0000000000..14e0591389
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SNX.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SOL.svg b/src/problem2/fancy-form/src/assets/token-icon/SOL.svg
new file mode 100644
index 0000000000..0568e80881
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SOL.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SOLETH.svg b/src/problem2/fancy-form/src/assets/token-icon/SOLETH.svg
new file mode 100644
index 0000000000..c7f81893f8
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SOLETH.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SOM.svg b/src/problem2/fancy-form/src/assets/token-icon/SOM.svg
new file mode 100644
index 0000000000..778bf9b5c9
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SOM.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SOMM.svg b/src/problem2/fancy-form/src/assets/token-icon/SOMM.svg
new file mode 100644
index 0000000000..fa82d261ee
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SOMM.svg
@@ -0,0 +1,65 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SPEC.svg b/src/problem2/fancy-form/src/assets/token-icon/SPEC.svg
new file mode 100644
index 0000000000..75c9b37b2b
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SPEC.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SRM.svg b/src/problem2/fancy-form/src/assets/token-icon/SRM.svg
new file mode 100644
index 0000000000..e488de82db
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SRM.svg
@@ -0,0 +1,20 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SRV.svg b/src/problem2/fancy-form/src/assets/token-icon/SRV.svg
new file mode 100644
index 0000000000..b15a61c77f
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SRV.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/STARS.svg b/src/problem2/fancy-form/src/assets/token-icon/STARS.svg
new file mode 100644
index 0000000000..de6d376db8
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/STARS.svg
@@ -0,0 +1,16 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/STEEM.svg b/src/problem2/fancy-form/src/assets/token-icon/STEEM.svg
new file mode 100644
index 0000000000..503009b90d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/STEEM.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/STMX.svg b/src/problem2/fancy-form/src/assets/token-icon/STMX.svg
new file mode 100644
index 0000000000..976e86474b
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/STMX.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/STORJ.svg b/src/problem2/fancy-form/src/assets/token-icon/STORJ.svg
new file mode 100644
index 0000000000..85a332a6ce
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/STORJ.svg
@@ -0,0 +1,13 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/STRAX.svg b/src/problem2/fancy-form/src/assets/token-icon/STRAX.svg
new file mode 100644
index 0000000000..a34822931d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/STRAX.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/STRD.svg b/src/problem2/fancy-form/src/assets/token-icon/STRD.svg
new file mode 100644
index 0000000000..f25a48536c
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/STRD.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/STREAM.svg b/src/problem2/fancy-form/src/assets/token-icon/STREAM.svg
new file mode 100644
index 0000000000..fba4ce0609
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/STREAM.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/STRK.svg b/src/problem2/fancy-form/src/assets/token-icon/STRK.svg
new file mode 100644
index 0000000000..22c139824d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/STRK.svg
@@ -0,0 +1,13 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/STT.svg b/src/problem2/fancy-form/src/assets/token-icon/STT.svg
new file mode 100644
index 0000000000..d37590a8d3
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/STT.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/STX.svg b/src/problem2/fancy-form/src/assets/token-icon/STX.svg
new file mode 100644
index 0000000000..ed89fc9276
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/STX.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SUI.svg b/src/problem2/fancy-form/src/assets/token-icon/SUI.svg
new file mode 100644
index 0000000000..7687a88042
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SUI.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SUN.svg b/src/problem2/fancy-form/src/assets/token-icon/SUN.svg
new file mode 100644
index 0000000000..1159b6cbfd
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SUN.svg
@@ -0,0 +1,60 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SUSHI.svg b/src/problem2/fancy-form/src/assets/token-icon/SUSHI.svg
new file mode 100644
index 0000000000..e118f213b5
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SUSHI.svg
@@ -0,0 +1,26 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SWTH-LEGACY.svg b/src/problem2/fancy-form/src/assets/token-icon/SWTH-LEGACY.svg
new file mode 100644
index 0000000000..60ba0650e1
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SWTH-LEGACY.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SWTH.svg b/src/problem2/fancy-form/src/assets/token-icon/SWTH.svg
new file mode 100644
index 0000000000..353c1b5bcc
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SWTH.svg
@@ -0,0 +1,71 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/SXP.svg b/src/problem2/fancy-form/src/assets/token-icon/SXP.svg
new file mode 100644
index 0000000000..89fd3b147e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/SXP.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/TAO.svg b/src/problem2/fancy-form/src/assets/token-icon/TAO.svg
new file mode 100644
index 0000000000..9f0dbfcf8e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/TAO.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/TEL.svg b/src/problem2/fancy-form/src/assets/token-icon/TEL.svg
new file mode 100644
index 0000000000..2992514bf1
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/TEL.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/TFUEL.svg b/src/problem2/fancy-form/src/assets/token-icon/TFUEL.svg
new file mode 100644
index 0000000000..d57d7d9493
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/TFUEL.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/THETA.svg b/src/problem2/fancy-form/src/assets/token-icon/THETA.svg
new file mode 100644
index 0000000000..8ff93f4019
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/THETA.svg
@@ -0,0 +1,13 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/THT.svg b/src/problem2/fancy-form/src/assets/token-icon/THT.svg
new file mode 100644
index 0000000000..8ee5eb9ff3
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/THT.svg
@@ -0,0 +1,68 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/TIA.svg b/src/problem2/fancy-form/src/assets/token-icon/TIA.svg
new file mode 100644
index 0000000000..41d8ab96c1
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/TIA.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/TICK.svg b/src/problem2/fancy-form/src/assets/token-icon/TICK.svg
new file mode 100644
index 0000000000..3be70db269
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/TICK.svg
@@ -0,0 +1,17 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/TITAN.svg b/src/problem2/fancy-form/src/assets/token-icon/TITAN.svg
new file mode 100644
index 0000000000..d52faa138c
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/TITAN.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/TLAND.svg b/src/problem2/fancy-form/src/assets/token-icon/TLAND.svg
new file mode 100644
index 0000000000..9f9e3e2330
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/TLAND.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/TLM.svg b/src/problem2/fancy-form/src/assets/token-icon/TLM.svg
new file mode 100644
index 0000000000..1fe3283fee
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/TLM.svg
@@ -0,0 +1,16 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/TOMO.svg b/src/problem2/fancy-form/src/assets/token-icon/TOMO.svg
new file mode 100644
index 0000000000..45bda83d4b
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/TOMO.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/TON.svg b/src/problem2/fancy-form/src/assets/token-icon/TON.svg
new file mode 100644
index 0000000000..c1e0b91485
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/TON.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/TPC.svg b/src/problem2/fancy-form/src/assets/token-icon/TPC.svg
new file mode 100644
index 0000000000..29f8a4af8d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/TPC.svg
@@ -0,0 +1,17 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/TRAXX.svg b/src/problem2/fancy-form/src/assets/token-icon/TRAXX.svg
new file mode 100644
index 0000000000..05c2ec0999
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/TRAXX.svg
@@ -0,0 +1,14 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/TRB.svg b/src/problem2/fancy-form/src/assets/token-icon/TRB.svg
new file mode 100644
index 0000000000..e319e65d7e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/TRB.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/TRU.svg b/src/problem2/fancy-form/src/assets/token-icon/TRU.svg
new file mode 100644
index 0000000000..29ddc8ac24
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/TRU.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/TRUMP.svg b/src/problem2/fancy-form/src/assets/token-icon/TRUMP.svg
new file mode 100644
index 0000000000..2571b5e20f
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/TRUMP.svg
@@ -0,0 +1,20 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/TRX.svg b/src/problem2/fancy-form/src/assets/token-icon/TRX.svg
new file mode 100644
index 0000000000..c105ddc307
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/TRX.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/TTT.svg b/src/problem2/fancy-form/src/assets/token-icon/TTT.svg
new file mode 100644
index 0000000000..13e6080a8a
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/TTT.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/TUSD.svg b/src/problem2/fancy-form/src/assets/token-icon/TUSD.svg
new file mode 100644
index 0000000000..712ec923da
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/TUSD.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/TWD.svg b/src/problem2/fancy-form/src/assets/token-icon/TWD.svg
new file mode 100644
index 0000000000..014f525557
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/TWD.svg
@@ -0,0 +1,18 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/TWT.svg b/src/problem2/fancy-form/src/assets/token-icon/TWT.svg
new file mode 100644
index 0000000000..b67bf37535
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/TWT.svg
@@ -0,0 +1,77 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/Token.svg b/src/problem2/fancy-form/src/assets/token-icon/Token.svg
new file mode 100644
index 0000000000..bed64e2942
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/Token.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/UBQ.svg b/src/problem2/fancy-form/src/assets/token-icon/UBQ.svg
new file mode 100644
index 0000000000..139af049ce
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/UBQ.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/UMEE.svg b/src/problem2/fancy-form/src/assets/token-icon/UMEE.svg
new file mode 100644
index 0000000000..f9243257df
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/UMEE.svg
@@ -0,0 +1,39 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/UNA.svg b/src/problem2/fancy-form/src/assets/token-icon/UNA.svg
new file mode 100644
index 0000000000..077c1555e7
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/UNA.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/UNI.svg b/src/problem2/fancy-form/src/assets/token-icon/UNI.svg
new file mode 100644
index 0000000000..37996b6c05
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/UNI.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/UOS.svg b/src/problem2/fancy-form/src/assets/token-icon/UOS.svg
new file mode 100644
index 0000000000..eb07c3cce8
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/UOS.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/USC-Minted.svg b/src/problem2/fancy-form/src/assets/token-icon/USC-Minted.svg
new file mode 100644
index 0000000000..466cda74f0
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/USC-Minted.svg
@@ -0,0 +1,37 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/USC.svg b/src/problem2/fancy-form/src/assets/token-icon/USC.svg
new file mode 100644
index 0000000000..32bd9541f5
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/USC.svg
@@ -0,0 +1,37 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/USD.svg b/src/problem2/fancy-form/src/assets/token-icon/USD.svg
new file mode 100644
index 0000000000..abf67ab105
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/USD.svg
@@ -0,0 +1,8 @@
+
+
\ No newline at end of file
diff --git a/src/problem2/fancy-form/src/assets/token-icon/USDC-dATOM.svg b/src/problem2/fancy-form/src/assets/token-icon/USDC-dATOM.svg
new file mode 100644
index 0000000000..7202b50ae7
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/USDC-dATOM.svg
@@ -0,0 +1,17 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/USDC.e.svg b/src/problem2/fancy-form/src/assets/token-icon/USDC.e.svg
new file mode 100644
index 0000000000..eee4251a7b
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/USDC.e.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/USDC.grv.svg b/src/problem2/fancy-form/src/assets/token-icon/USDC.grv.svg
new file mode 100644
index 0000000000..458ab4901a
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/USDC.grv.svg
@@ -0,0 +1,14 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/USDC.svg b/src/problem2/fancy-form/src/assets/token-icon/USDC.svg
new file mode 100644
index 0000000000..eee4251a7b
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/USDC.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/USDP.svg b/src/problem2/fancy-form/src/assets/token-icon/USDP.svg
new file mode 100644
index 0000000000..b7e76ff9d1
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/USDP.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/USDT.svg b/src/problem2/fancy-form/src/assets/token-icon/USDT.svg
new file mode 100644
index 0000000000..8b3986d057
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/USDT.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/USDY.svg b/src/problem2/fancy-form/src/assets/token-icon/USDY.svg
new file mode 100644
index 0000000000..118da5939c
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/USDY.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/USK.svg b/src/problem2/fancy-form/src/assets/token-icon/USK.svg
new file mode 100644
index 0000000000..15ba03fe9d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/USK.svg
@@ -0,0 +1,19 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/UST.svg b/src/problem2/fancy-form/src/assets/token-icon/UST.svg
new file mode 100644
index 0000000000..2a0a597074
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/UST.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/USUAL.svg b/src/problem2/fancy-form/src/assets/token-icon/USUAL.svg
new file mode 100644
index 0000000000..1bdf52827d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/USUAL.svg
@@ -0,0 +1,48 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/VDL.svg b/src/problem2/fancy-form/src/assets/token-icon/VDL.svg
new file mode 100644
index 0000000000..d839e0da4d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/VDL.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/VET.svg b/src/problem2/fancy-form/src/assets/token-icon/VET.svg
new file mode 100644
index 0000000000..88ebf982a5
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/VET.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/VIRTUAL.svg b/src/problem2/fancy-form/src/assets/token-icon/VIRTUAL.svg
new file mode 100644
index 0000000000..7d623039a9
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/VIRTUAL.svg
@@ -0,0 +1,24 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/VKR.svg b/src/problem2/fancy-form/src/assets/token-icon/VKR.svg
new file mode 100644
index 0000000000..cb3c68d595
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/VKR.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/VRTX.svg b/src/problem2/fancy-form/src/assets/token-icon/VRTX.svg
new file mode 100644
index 0000000000..8cb3dc30ef
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/VRTX.svg
@@ -0,0 +1,22 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/W.svg b/src/problem2/fancy-form/src/assets/token-icon/W.svg
new file mode 100644
index 0000000000..95823f2252
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/W.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/WAL.svg b/src/problem2/fancy-form/src/assets/token-icon/WAL.svg
new file mode 100644
index 0000000000..8d06c07e14
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/WAL.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/WAVAX.svg b/src/problem2/fancy-form/src/assets/token-icon/WAVAX.svg
new file mode 100644
index 0000000000..e244ad3aa6
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/WAVAX.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/WAVE.svg b/src/problem2/fancy-form/src/assets/token-icon/WAVE.svg
new file mode 100644
index 0000000000..2ca6ac0708
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/WAVE.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/WBNB.svg b/src/problem2/fancy-form/src/assets/token-icon/WBNB.svg
new file mode 100644
index 0000000000..e45c696b5c
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/WBNB.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/WBTC.svg b/src/problem2/fancy-form/src/assets/token-icon/WBTC.svg
new file mode 100644
index 0000000000..b597b84a4a
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/WBTC.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/WETH.svg b/src/problem2/fancy-form/src/assets/token-icon/WETH.svg
new file mode 100644
index 0000000000..cba6f1d783
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/WETH.svg
@@ -0,0 +1,17 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/WHALE.svg b/src/problem2/fancy-form/src/assets/token-icon/WHALE.svg
new file mode 100644
index 0000000000..a42a2449d8
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/WHALE.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/WIF.svg b/src/problem2/fancy-form/src/assets/token-icon/WIF.svg
new file mode 100644
index 0000000000..6df4ea15a2
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/WIF.svg
@@ -0,0 +1,23 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/WIN.svg b/src/problem2/fancy-form/src/assets/token-icon/WIN.svg
new file mode 100644
index 0000000000..bc2435409b
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/WIN.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/WLD.svg b/src/problem2/fancy-form/src/assets/token-icon/WLD.svg
new file mode 100644
index 0000000000..62191032d6
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/WLD.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/WMATIC.svg b/src/problem2/fancy-form/src/assets/token-icon/WMATIC.svg
new file mode 100644
index 0000000000..ba0630b510
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/WMATIC.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/WMNT.svg b/src/problem2/fancy-form/src/assets/token-icon/WMNT.svg
new file mode 100644
index 0000000000..8b8784b36a
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/WMNT.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/WMON.png b/src/problem2/fancy-form/src/assets/token-icon/WMON.png
new file mode 100644
index 0000000000..452cae24b2
Binary files /dev/null and b/src/problem2/fancy-form/src/assets/token-icon/WMON.png differ
diff --git a/src/problem2/fancy-form/src/assets/token-icon/WRX.svg b/src/problem2/fancy-form/src/assets/token-icon/WRX.svg
new file mode 100644
index 0000000000..543f570909
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/WRX.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/XCAD.svg b/src/problem2/fancy-form/src/assets/token-icon/XCAD.svg
new file mode 100644
index 0000000000..545a88d1b9
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/XCAD.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/XDC.svg b/src/problem2/fancy-form/src/assets/token-icon/XDC.svg
new file mode 100644
index 0000000000..c90381022e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/XDC.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/XEM.svg b/src/problem2/fancy-form/src/assets/token-icon/XEM.svg
new file mode 100644
index 0000000000..da54e72a22
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/XEM.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/XKI.svg b/src/problem2/fancy-form/src/assets/token-icon/XKI.svg
new file mode 100644
index 0000000000..dd5fea7cf0
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/XKI.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/XLM.svg b/src/problem2/fancy-form/src/assets/token-icon/XLM.svg
new file mode 100644
index 0000000000..d836619c15
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/XLM.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/XMR.svg b/src/problem2/fancy-form/src/assets/token-icon/XMR.svg
new file mode 100644
index 0000000000..475a95cb7d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/XMR.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/XPRT.svg b/src/problem2/fancy-form/src/assets/token-icon/XPRT.svg
new file mode 100644
index 0000000000..7ecd4ace95
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/XPRT.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/XRP.svg b/src/problem2/fancy-form/src/assets/token-icon/XRP.svg
new file mode 100644
index 0000000000..b3d441bf40
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/XRP.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/XSGD.svg b/src/problem2/fancy-form/src/assets/token-icon/XSGD.svg
new file mode 100644
index 0000000000..f04caab93b
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/XSGD.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/XTRA.svg b/src/problem2/fancy-form/src/assets/token-icon/XTRA.svg
new file mode 100644
index 0000000000..1c6367d3be
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/XTRA.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/XTZ.svg b/src/problem2/fancy-form/src/assets/token-icon/XTZ.svg
new file mode 100644
index 0000000000..28b924e5c7
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/XTZ.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/XVG.svg b/src/problem2/fancy-form/src/assets/token-icon/XVG.svg
new file mode 100644
index 0000000000..537378cff6
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/XVG.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/XVS.svg b/src/problem2/fancy-form/src/assets/token-icon/XVS.svg
new file mode 100644
index 0000000000..3176f9fb66
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/XVS.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/YAKI.svg b/src/problem2/fancy-form/src/assets/token-icon/YAKI.svg
new file mode 100644
index 0000000000..5179eb95aa
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/YAKI.svg
@@ -0,0 +1,20 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/YAM.svg b/src/problem2/fancy-form/src/assets/token-icon/YAM.svg
new file mode 100644
index 0000000000..2e8a654216
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/YAM.svg
@@ -0,0 +1,47 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/YFI.svg b/src/problem2/fancy-form/src/assets/token-icon/YFI.svg
new file mode 100644
index 0000000000..b7674608b7
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/YFI.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/YieldUSD.svg b/src/problem2/fancy-form/src/assets/token-icon/YieldUSD.svg
new file mode 100644
index 0000000000..e435a687c9
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/YieldUSD.svg
@@ -0,0 +1,17 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ZCH.svg b/src/problem2/fancy-form/src/assets/token-icon/ZCH.svg
new file mode 100644
index 0000000000..1e9d4250d4
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ZCH.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ZEC.svg b/src/problem2/fancy-form/src/assets/token-icon/ZEC.svg
new file mode 100644
index 0000000000..b6b86dcc1d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ZEC.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ZEN.svg b/src/problem2/fancy-form/src/assets/token-icon/ZEN.svg
new file mode 100644
index 0000000000..b305169acb
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ZEN.svg
@@ -0,0 +1,20 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ZIL.svg b/src/problem2/fancy-form/src/assets/token-icon/ZIL.svg
new file mode 100644
index 0000000000..c89e8ce16f
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ZIL.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ZRO.svg b/src/problem2/fancy-form/src/assets/token-icon/ZRO.svg
new file mode 100644
index 0000000000..e485e3b2ab
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ZRO.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ZRX.svg b/src/problem2/fancy-form/src/assets/token-icon/ZRX.svg
new file mode 100644
index 0000000000..f42e914a6a
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ZRX.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ZWAP.svg b/src/problem2/fancy-form/src/assets/token-icon/ZWAP.svg
new file mode 100644
index 0000000000..130d14d73b
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ZWAP.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ampKUJI.svg b/src/problem2/fancy-form/src/assets/token-icon/ampKUJI.svg
new file mode 100644
index 0000000000..2692787da5
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ampKUJI.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ampLUNA.svg b/src/problem2/fancy-form/src/assets/token-icon/ampLUNA.svg
new file mode 100644
index 0000000000..ebeab58687
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ampLUNA.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/axlUSDC.svg b/src/problem2/fancy-form/src/assets/token-icon/axlUSDC.svg
new file mode 100644
index 0000000000..fc879f679a
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/axlUSDC.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/bCFX.svg b/src/problem2/fancy-form/src/assets/token-icon/bCFX.svg
new file mode 100644
index 0000000000..07e8c434db
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/bCFX.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/bNEO.svg b/src/problem2/fancy-form/src/assets/token-icon/bNEO.svg
new file mode 100644
index 0000000000..561b2282d8
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/bNEO.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/beraSTONE.svg b/src/problem2/fancy-form/src/assets/token-icon/beraSTONE.svg
new file mode 100644
index 0000000000..3da255f504
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/beraSTONE.svg
@@ -0,0 +1,20 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/cUSD.svg b/src/problem2/fancy-form/src/assets/token-icon/cUSD.svg
new file mode 100644
index 0000000000..33407ebc96
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/cUSD.svg
@@ -0,0 +1,21 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/cbBTC.svg b/src/problem2/fancy-form/src/assets/token-icon/cbBTC.svg
new file mode 100644
index 0000000000..77fee5c013
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/cbBTC.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/cbETH.svg b/src/problem2/fancy-form/src/assets/token-icon/cbETH.svg
new file mode 100644
index 0000000000..5a18b92644
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/cbETH.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/cmETH.svg b/src/problem2/fancy-form/src/assets/token-icon/cmETH.svg
new file mode 100644
index 0000000000..0a82791d04
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/cmETH.svg
@@ -0,0 +1,22 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/dATOM.svg b/src/problem2/fancy-form/src/assets/token-icon/dATOM.svg
new file mode 100644
index 0000000000..b73e04155e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/dATOM.svg
@@ -0,0 +1,13 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/dGLP.svg b/src/problem2/fancy-form/src/assets/token-icon/dGLP.svg
new file mode 100644
index 0000000000..84cac9cdeb
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/dGLP.svg
@@ -0,0 +1,20 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/dINJ.svg b/src/problem2/fancy-form/src/assets/token-icon/dINJ.svg
new file mode 100644
index 0000000000..05b1763cc2
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/dINJ.svg
@@ -0,0 +1,20 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/dXCAD.svg b/src/problem2/fancy-form/src/assets/token-icon/dXCAD.svg
new file mode 100644
index 0000000000..881f50fd02
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/dXCAD.svg
@@ -0,0 +1,13 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/eGLD(1).svg b/src/problem2/fancy-form/src/assets/token-icon/eGLD(1).svg
new file mode 100644
index 0000000000..e42ad2510e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/eGLD(1).svg
@@ -0,0 +1,36 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/ePLAY.svg b/src/problem2/fancy-form/src/assets/token-icon/ePLAY.svg
new file mode 100644
index 0000000000..bae2577420
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/ePLAY.svg
@@ -0,0 +1,23 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/esFLUO.svg b/src/problem2/fancy-form/src/assets/token-icon/esFLUO.svg
new file mode 100644
index 0000000000..0b69ed3189
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/esFLUO.svg
@@ -0,0 +1,18 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/gZIL.svg b/src/problem2/fancy-form/src/assets/token-icon/gZIL.svg
new file mode 100644
index 0000000000..27334389ba
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/gZIL.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/iSEI.svg b/src/problem2/fancy-form/src/assets/token-icon/iSEI.svg
new file mode 100644
index 0000000000..246b86f8a1
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/iSEI.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/iUSD.svg b/src/problem2/fancy-form/src/assets/token-icon/iUSD.svg
new file mode 100644
index 0000000000..ca263a0474
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/iUSD.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/mETH.svg b/src/problem2/fancy-form/src/assets/token-icon/mETH.svg
new file mode 100644
index 0000000000..6d6d5d0762
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/mETH.svg
@@ -0,0 +1,24 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/milkTIA.svg b/src/problem2/fancy-form/src/assets/token-icon/milkTIA.svg
new file mode 100644
index 0000000000..d595abfa30
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/milkTIA.svg
@@ -0,0 +1,18 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/nLEND.svg b/src/problem2/fancy-form/src/assets/token-icon/nLEND.svg
new file mode 100644
index 0000000000..d5c91b274f
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/nLEND.svg
@@ -0,0 +1,19 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/nNEO.svg b/src/problem2/fancy-form/src/assets/token-icon/nNEO.svg
new file mode 100644
index 0000000000..d4a90e1b27
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/nNEO.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/rATOM.svg b/src/problem2/fancy-form/src/assets/token-icon/rATOM.svg
new file mode 100644
index 0000000000..8cd5f8056f
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/rATOM.svg
@@ -0,0 +1,55 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/rSWTH.svg b/src/problem2/fancy-form/src/assets/token-icon/rSWTH.svg
new file mode 100644
index 0000000000..d5250ff90d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/rSWTH.svg
@@ -0,0 +1,88 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/sARCH.svg b/src/problem2/fancy-form/src/assets/token-icon/sARCH.svg
new file mode 100644
index 0000000000..3ec2b656f0
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/sARCH.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/stATOM.svg b/src/problem2/fancy-form/src/assets/token-icon/stATOM.svg
new file mode 100644
index 0000000000..c3e505f8b3
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/stATOM.svg
@@ -0,0 +1,22 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/stDYDX.svg b/src/problem2/fancy-form/src/assets/token-icon/stDYDX.svg
new file mode 100644
index 0000000000..6d851637a8
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/stDYDX.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/stDYM.svg b/src/problem2/fancy-form/src/assets/token-icon/stDYM.svg
new file mode 100644
index 0000000000..d961755725
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/stDYM.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/stETH.svg b/src/problem2/fancy-form/src/assets/token-icon/stETH.svg
new file mode 100644
index 0000000000..8c490e47f0
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/stETH.svg
@@ -0,0 +1,18 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/stEVMOS.svg b/src/problem2/fancy-form/src/assets/token-icon/stEVMOS.svg
new file mode 100644
index 0000000000..a2a8888208
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/stEVMOS.svg
@@ -0,0 +1,16 @@
+
\ No newline at end of file
diff --git a/src/problem2/fancy-form/src/assets/token-icon/stFLUO.svg b/src/problem2/fancy-form/src/assets/token-icon/stFLUO.svg
new file mode 100644
index 0000000000..bf182c96de
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/stFLUO.svg
@@ -0,0 +1,18 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/stIBCX.svg b/src/problem2/fancy-form/src/assets/token-icon/stIBCX.svg
new file mode 100644
index 0000000000..8a10d241d5
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/stIBCX.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/stINJ.svg b/src/problem2/fancy-form/src/assets/token-icon/stINJ.svg
new file mode 100644
index 0000000000..6b97bec4f7
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/stINJ.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/stJUNO.svg b/src/problem2/fancy-form/src/assets/token-icon/stJUNO.svg
new file mode 100644
index 0000000000..8d92f375c6
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/stJUNO.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/stLUNA.svg b/src/problem2/fancy-form/src/assets/token-icon/stLUNA.svg
new file mode 100644
index 0000000000..606be7947d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/stLUNA.svg
@@ -0,0 +1,9 @@
+
\ No newline at end of file
diff --git a/src/problem2/fancy-form/src/assets/token-icon/stOKT.svg b/src/problem2/fancy-form/src/assets/token-icon/stOKT.svg
new file mode 100644
index 0000000000..33b541d11d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/stOKT.svg
@@ -0,0 +1,8 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/stOSMO.svg b/src/problem2/fancy-form/src/assets/token-icon/stOSMO.svg
new file mode 100644
index 0000000000..73d296046b
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/stOSMO.svg
@@ -0,0 +1,16 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/stSAGA.svg b/src/problem2/fancy-form/src/assets/token-icon/stSAGA.svg
new file mode 100644
index 0000000000..d6092fc7cf
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/stSAGA.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/stSTARS.svg b/src/problem2/fancy-form/src/assets/token-icon/stSTARS.svg
new file mode 100644
index 0000000000..ffc7def96a
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/stSTARS.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/stTIA.svg b/src/problem2/fancy-form/src/assets/token-icon/stTIA.svg
new file mode 100644
index 0000000000..3d3e28470d
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/stTIA.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/stZIL.svg b/src/problem2/fancy-form/src/assets/token-icon/stZIL.svg
new file mode 100644
index 0000000000..81323f746a
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/stZIL.svg
@@ -0,0 +1,8 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/stkATOM.svg b/src/problem2/fancy-form/src/assets/token-icon/stkATOM.svg
new file mode 100644
index 0000000000..1e6c7a2b2c
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/stkATOM.svg
@@ -0,0 +1,20 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/stkDYDX.svg b/src/problem2/fancy-form/src/assets/token-icon/stkDYDX.svg
new file mode 100644
index 0000000000..2d2883a9e6
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/stkDYDX.svg
@@ -0,0 +1,22 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/stkSTARS.svg b/src/problem2/fancy-form/src/assets/token-icon/stkSTARS.svg
new file mode 100644
index 0000000000..97e87da6ea
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/stkSTARS.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/vZWAP.svg b/src/problem2/fancy-form/src/assets/token-icon/vZWAP.svg
new file mode 100644
index 0000000000..0874b89e8b
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/vZWAP.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/veFLUO.svg b/src/problem2/fancy-form/src/assets/token-icon/veFLUO.svg
new file mode 100644
index 0000000000..3624b5647a
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/veFLUO.svg
@@ -0,0 +1,18 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/wKAS.svg b/src/problem2/fancy-form/src/assets/token-icon/wKAS.svg
new file mode 100644
index 0000000000..14185747c5
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/wKAS.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/problem2/fancy-form/src/assets/token-icon/wstETH.svg b/src/problem2/fancy-form/src/assets/token-icon/wstETH.svg
new file mode 100644
index 0000000000..15c8a9716e
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/token-icon/wstETH.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/problem2/fancy-form/src/assets/vite.svg b/src/problem2/fancy-form/src/assets/vite.svg
new file mode 100644
index 0000000000..5101b674df
--- /dev/null
+++ b/src/problem2/fancy-form/src/assets/vite.svg
@@ -0,0 +1 @@
+
diff --git a/src/problem2/fancy-form/src/components/layout/Background.tsx b/src/problem2/fancy-form/src/components/layout/Background.tsx
new file mode 100644
index 0000000000..9f874eab85
--- /dev/null
+++ b/src/problem2/fancy-form/src/components/layout/Background.tsx
@@ -0,0 +1,17 @@
+export function Background() {
+ return (
+
+ {/* Large blob - top right */}
+
+
+ {/* Medium blob - bottom left */}
+
+
+ {/* Small blob - center */}
+
+
+ {/* Subtle grid pattern */}
+
+
+ );
+}
diff --git a/src/problem2/fancy-form/src/components/layout/ThemeToggle.tsx b/src/problem2/fancy-form/src/components/layout/ThemeToggle.tsx
new file mode 100644
index 0000000000..586724e61c
--- /dev/null
+++ b/src/problem2/fancy-form/src/components/layout/ThemeToggle.tsx
@@ -0,0 +1,20 @@
+import { useTheme } from '@/context/ThemeContext';
+import { Button } from '@/components/ui/button';
+import { Sun, Moon } from 'lucide-react';
+
+export function ThemeToggle() {
+ const { isDark, toggleTheme } = useTheme();
+
+ return (
+
+ );
+}
diff --git a/src/problem2/fancy-form/src/components/swap/SwapButton.tsx b/src/problem2/fancy-form/src/components/swap/SwapButton.tsx
new file mode 100644
index 0000000000..a6f91407b8
--- /dev/null
+++ b/src/problem2/fancy-form/src/components/swap/SwapButton.tsx
@@ -0,0 +1,37 @@
+import { SwapStatus } from '@/types/swap';
+import { Spinner } from '@/components/ui/Spinner';
+import { Button } from '@/components/ui/button';
+import { CheckCircle2 } from 'lucide-react';
+
+interface SwapButtonProps {
+ label: string;
+ canSwap: boolean;
+ status: SwapStatus;
+ onSwap: () => void;
+}
+
+export function SwapButton({ label, canSwap, status, onSwap }: SwapButtonProps) {
+ const isProcessing = status === SwapStatus.PROCESSING;
+ const isSuccess = status === SwapStatus.SUCCESS;
+
+ return (
+
+ );
+}
diff --git a/src/problem2/fancy-form/src/components/swap/SwapCard.tsx b/src/problem2/fancy-form/src/components/swap/SwapCard.tsx
new file mode 100644
index 0000000000..d23567236a
--- /dev/null
+++ b/src/problem2/fancy-form/src/components/swap/SwapCard.tsx
@@ -0,0 +1,145 @@
+import { useState, lazy, Suspense } from 'react';
+import { SwapDirection } from '@/types/swap';
+import { useTokenPrices } from '@/hooks/useTokenPrices';
+import { useSwap } from '@/hooks/useSwap';
+import { TokenInput } from './TokenInput';
+import { SwapDirectionButton } from './SwapDirectionButton';
+import { SwapDetails } from './SwapDetails';
+import { SwapButton } from './SwapButton';
+
+import toast from 'react-hot-toast';
+import { Skeleton } from '../ui/skeleton';
+
+const TokenSelectModal = lazy(() =>
+ import('./TokenSelectModal').then((mod) => ({ default: mod.TokenSelectModal })),
+);
+
+export function SwapCard() {
+ const { data: tokens, isLoading, isError, error } = useTokenPrices();
+ const swap = useSwap();
+ const [modalOpen, setModalOpen] = useState(false);
+ const [modalDirection, setModalDirection] = useState(SwapDirection.SELL);
+
+ const openModal = (direction: SwapDirection) => {
+ setModalDirection(direction);
+ setModalOpen(true);
+ };
+
+ const handleSwap = async () => {
+ try {
+ await swap.executeSwap();
+ toast.success(
+ `Swapped ${swap.sellAmount} ${swap.sellToken?.currency} for ${swap.buyAmount} ${swap.buyToken?.currency}`,
+ {
+ duration: 3000,
+ style: {
+ borderRadius: '12px',
+ background: '#1e293b',
+ color: '#fff',
+ },
+ iconTheme: {
+ primary: '#22c55e',
+ secondary: '#fff',
+ },
+ },
+ );
+ } catch {
+ toast.error('Swap failed. Please try again.', {
+ style: {
+ borderRadius: '12px',
+ background: '#1e293b',
+ color: '#fff',
+ },
+ });
+ }
+ };
+
+ if (isLoading) {
+ return (
+
+
+
+
+
+
+ );
+ }
+
+ if (isError) {
+ return (
+
+
⚠️
+
+ Failed to load tokens
+
+
+ {error instanceof Error ? error.message : 'An unexpected error occurred.'}
+
+
+ );
+ }
+
+ return (
+ <>
+
+
+
Swap Tokens
+
+
+
openModal(SwapDirection.SELL)}
+ />
+
+
+
+ openModal(SwapDirection.BUY)}
+ />
+
+
+
+ {/* Swap Button */}
+
+
+
+ {/* Token Select Modal (lazy loaded) */}
+
+ setModalOpen(false)}
+ onSelect={(token) => {
+ if (modalDirection === SwapDirection.SELL) {
+ swap.setSellToken(token);
+ } else {
+ swap.setBuyToken(token);
+ }
+ }}
+ tokens={tokens ?? []}
+ selectedToken={
+ modalDirection === SwapDirection.SELL ? swap.sellToken : swap.buyToken
+ }
+ />
+
+ >
+ );
+}
diff --git a/src/problem2/fancy-form/src/components/swap/SwapDetails.tsx b/src/problem2/fancy-form/src/components/swap/SwapDetails.tsx
new file mode 100644
index 0000000000..bd0c0160a8
--- /dev/null
+++ b/src/problem2/fancy-form/src/components/swap/SwapDetails.tsx
@@ -0,0 +1,102 @@
+import { motion, AnimatePresence } from 'framer-motion';
+import type { Token } from '@/types';
+import { formatAmount } from '@/utils/format';
+import { useState } from 'react';
+import { Repeat, ChevronDown } from 'lucide-react';
+
+interface SwapDetailsProps {
+ sellToken: Token | null;
+ buyToken: Token | null;
+ exchangeRate: number | null;
+ priceImpact: number;
+}
+
+export function SwapDetails({ sellToken, buyToken, exchangeRate, priceImpact }: SwapDetailsProps) {
+ const [isExpanded, setIsExpanded] = useState(false);
+ const [isReversed, setIsReversed] = useState(false);
+
+ if (!sellToken || !buyToken || exchangeRate === null) return null;
+
+ const displayRate = isReversed ? 1 / exchangeRate : exchangeRate;
+ const fromToken = isReversed ? buyToken : sellToken;
+ const toToken = isReversed ? sellToken : buyToken;
+
+ return (
+
+ {/* Rate toggle row */}
+
+
+ {/* Expandable details */}
+
+ {isExpanded && (
+
+
+ 5
+ ? 'text-red-500'
+ : priceImpact > 3
+ ? 'text-amber-500'
+ : 'text-emerald-500'
+ }
+ />
+
+
+
+
+ )}
+
+
+ );
+}
+
+function DetailRow({
+ label,
+ value,
+ valueColor = 'text-slate-700 dark:text-slate-200',
+}: {
+ label: string;
+ value: string;
+ valueColor?: string;
+}) {
+ return (
+
+ {label}
+ {value}
+
+ );
+}
diff --git a/src/problem2/fancy-form/src/components/swap/SwapDirectionButton.tsx b/src/problem2/fancy-form/src/components/swap/SwapDirectionButton.tsx
new file mode 100644
index 0000000000..b4f60330e2
--- /dev/null
+++ b/src/problem2/fancy-form/src/components/swap/SwapDirectionButton.tsx
@@ -0,0 +1,37 @@
+import { motion } from 'framer-motion';
+import { useState } from 'react';
+import { ArrowDown } from 'lucide-react';
+
+interface SwapDirectionButtonProps {
+ onFlip: () => void;
+ disabled?: boolean;
+}
+
+export function SwapDirectionButton({ onFlip, disabled = false }: SwapDirectionButtonProps) {
+ const [rotation, setRotation] = useState(0);
+
+ const handleClick = () => {
+ if (disabled) return;
+ setRotation((prev) => prev + 180);
+ onFlip();
+ };
+
+ return (
+
+ );
+}
diff --git a/src/problem2/fancy-form/src/components/swap/TokenInput.tsx b/src/problem2/fancy-form/src/components/swap/TokenInput.tsx
new file mode 100644
index 0000000000..2e580f071f
--- /dev/null
+++ b/src/problem2/fancy-form/src/components/swap/TokenInput.tsx
@@ -0,0 +1,109 @@
+import { useCallback } from 'react';
+import type { Token } from '@/types';
+import type { SwapDirection } from '@/types/swap';
+import { sanitizeAmountInput, formatUsd } from '@/utils/format';
+import { Input } from '@/components/ui/input';
+import { Button } from '@/components/ui/button';
+import { ChevronDown } from 'lucide-react';
+
+interface TokenInputProps {
+ direction: SwapDirection;
+ token: Token | null;
+ amount: string;
+ usdValue: number;
+ onAmountChange: (amount: string) => void;
+ onTokenSelect: () => void;
+ disabled?: boolean;
+}
+
+export function TokenInput({
+ direction,
+ token,
+ amount,
+ usdValue,
+ onAmountChange,
+ onTokenSelect,
+ disabled = false,
+}: TokenInputProps) {
+ const label = direction === 'sell' ? 'You pay' : 'You receive';
+
+ const handleInputChange = useCallback(
+ (e: React.ChangeEvent) => {
+ const sanitized = sanitizeAmountInput(e.target.value);
+ if (sanitized !== null) {
+ onAmountChange(sanitized);
+ }
+ },
+ [onAmountChange],
+ );
+
+ return (
+
+ {/* Label */}
+
+ {label}
+
+
+ {/* Input + Token Selector Row */}
+
+ {/* Amount Input using Shadcn Input but styling it essentially to look seamless */}
+
+
+ {/* Token Selector Pill */}
+
+ {token ? (
+ <>
+ {token.hasIcon ? (
+
+ ) : (
+
+ {token.currency.slice(0, 2)}
+
+ )}
+ {token.currency}
+
+ >
+ ) : (
+ <>
+ Select token
+
+ >
+ )}
+
+
+
+ {/* USD Value */}
+
+ {amount && parseFloat(amount) > 0 && token ? formatUsd(usdValue) : ''}
+
+
+ );
+}
diff --git a/src/problem2/fancy-form/src/components/swap/TokenSelectModal.tsx b/src/problem2/fancy-form/src/components/swap/TokenSelectModal.tsx
new file mode 100644
index 0000000000..669344da1d
--- /dev/null
+++ b/src/problem2/fancy-form/src/components/swap/TokenSelectModal.tsx
@@ -0,0 +1,169 @@
+import { useState, useMemo, useCallback } from 'react';
+import type { Token } from '@/types';
+import {
+ Dialog,
+ DialogContent,
+ DialogHeader,
+ DialogTitle,
+} from '@/components/ui/dialog';
+import { Input } from '@/components/ui/input';
+import { Search, Check } from 'lucide-react';
+
+interface TokenSelectModalProps {
+ isOpen: boolean;
+ onClose: () => void;
+ onSelect: (token: Token) => void;
+ tokens: Token[];
+ selectedToken?: Token | null;
+}
+
+/** Popular tokens shown as quick-select pills at the top */
+const POPULAR_CURRENCIES = ['ETH', 'USDC', 'WBTC', 'BUSD', 'ATOM', 'SOL', 'BNB', 'DAI'];
+
+export function TokenSelectModal({
+ isOpen,
+ onClose,
+ onSelect,
+ tokens,
+ selectedToken,
+}: TokenSelectModalProps) {
+ const [search, setSearch] = useState('');
+
+ // Filter tokens by search query
+ const filteredTokens = useMemo(() => {
+ if (!search.trim()) return tokens;
+ const query = search.toLowerCase().trim();
+ return tokens.filter((t) => t.currency.toLowerCase().includes(query));
+ }, [tokens, search]);
+
+ // Popular tokens that exist in our token list
+ const popularTokens = useMemo(() => {
+ return POPULAR_CURRENCIES.map((c) => tokens.find((t) => t.currency === c)).filter(
+ (t): t is Token => t !== undefined,
+ );
+ }, [tokens]);
+
+ const handleSelect = useCallback(
+ (token: Token) => {
+ onSelect(token);
+ onClose();
+ },
+ [onSelect, onClose],
+ );
+
+ return (
+
+ );
+}
diff --git a/src/problem2/fancy-form/src/components/ui/Spinner.tsx b/src/problem2/fancy-form/src/components/ui/Spinner.tsx
new file mode 100644
index 0000000000..9f565dffc5
--- /dev/null
+++ b/src/problem2/fancy-form/src/components/ui/Spinner.tsx
@@ -0,0 +1,20 @@
+interface SpinnerProps {
+ size?: 'sm' | 'md' | 'lg';
+ className?: string;
+}
+
+const sizeMap = {
+ sm: 'h-4 w-4 border-2',
+ md: 'h-6 w-6 border-2',
+ lg: 'h-8 w-8 border-3',
+};
+
+export function Spinner({ size = 'md', className = '' }: SpinnerProps) {
+ return (
+
+ );
+}
diff --git a/src/problem2/fancy-form/src/components/ui/button.tsx b/src/problem2/fancy-form/src/components/ui/button.tsx
new file mode 100644
index 0000000000..09df753676
--- /dev/null
+++ b/src/problem2/fancy-form/src/components/ui/button.tsx
@@ -0,0 +1,58 @@
+import { Button as ButtonPrimitive } from "@base-ui/react/button"
+import { cva, type VariantProps } from "class-variance-authority"
+
+import { cn } from "@/lib/utils"
+
+const buttonVariants = cva(
+ "group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
+ {
+ variants: {
+ variant: {
+ default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80",
+ outline:
+ "border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
+ secondary:
+ "bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",
+ ghost:
+ "hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",
+ destructive:
+ "bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",
+ link: "text-primary underline-offset-4 hover:underline",
+ },
+ size: {
+ default:
+ "h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
+ xs: "h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
+ sm: "h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
+ lg: "h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
+ icon: "size-8",
+ "icon-xs":
+ "size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3",
+ "icon-sm":
+ "size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg",
+ "icon-lg": "size-9",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ size: "default",
+ },
+ }
+)
+
+function Button({
+ className,
+ variant = "default",
+ size = "default",
+ ...props
+}: ButtonPrimitive.Props & VariantProps) {
+ return (
+
+ )
+}
+
+export { Button, buttonVariants }
diff --git a/src/problem2/fancy-form/src/components/ui/dialog.tsx b/src/problem2/fancy-form/src/components/ui/dialog.tsx
new file mode 100644
index 0000000000..4f794c97d8
--- /dev/null
+++ b/src/problem2/fancy-form/src/components/ui/dialog.tsx
@@ -0,0 +1,158 @@
+import * as React from "react"
+import { Dialog as DialogPrimitive } from "@base-ui/react/dialog"
+
+import { cn } from "@/lib/utils"
+import { Button } from "@/components/ui/button"
+import { XIcon } from "lucide-react"
+
+function Dialog({ ...props }: DialogPrimitive.Root.Props) {
+ return
+}
+
+function DialogTrigger({ ...props }: DialogPrimitive.Trigger.Props) {
+ return
+}
+
+function DialogPortal({ ...props }: DialogPrimitive.Portal.Props) {
+ return
+}
+
+function DialogClose({ ...props }: DialogPrimitive.Close.Props) {
+ return
+}
+
+function DialogOverlay({
+ className,
+ ...props
+}: DialogPrimitive.Backdrop.Props) {
+ return (
+
+ )
+}
+
+function DialogContent({
+ className,
+ children,
+ showCloseButton = true,
+ ...props
+}: DialogPrimitive.Popup.Props & {
+ showCloseButton?: boolean
+}) {
+ return (
+
+
+
+ {children}
+ {showCloseButton && (
+
+ }
+ >
+
+ Close
+
+ )}
+
+
+ )
+}
+
+function DialogHeader({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+function DialogFooter({
+ className,
+ showCloseButton = false,
+ children,
+ ...props
+}: React.ComponentProps<"div"> & {
+ showCloseButton?: boolean
+}) {
+ return (
+
+ {children}
+ {showCloseButton && (
+ }>
+ Close
+
+ )}
+
+ )
+}
+
+function DialogTitle({ className, ...props }: DialogPrimitive.Title.Props) {
+ return (
+
+ )
+}
+
+function DialogDescription({
+ className,
+ ...props
+}: DialogPrimitive.Description.Props) {
+ return (
+
+ )
+}
+
+export {
+ Dialog,
+ DialogClose,
+ DialogContent,
+ DialogDescription,
+ DialogFooter,
+ DialogHeader,
+ DialogOverlay,
+ DialogPortal,
+ DialogTitle,
+ DialogTrigger,
+}
diff --git a/src/problem2/fancy-form/src/components/ui/input.tsx b/src/problem2/fancy-form/src/components/ui/input.tsx
new file mode 100644
index 0000000000..7d21babba9
--- /dev/null
+++ b/src/problem2/fancy-form/src/components/ui/input.tsx
@@ -0,0 +1,20 @@
+import * as React from "react"
+import { Input as InputPrimitive } from "@base-ui/react/input"
+
+import { cn } from "@/lib/utils"
+
+function Input({ className, type, ...props }: React.ComponentProps<"input">) {
+ return (
+
+ )
+}
+
+export { Input }
diff --git a/src/problem2/fancy-form/src/components/ui/skeleton.tsx b/src/problem2/fancy-form/src/components/ui/skeleton.tsx
new file mode 100644
index 0000000000..62f2fd82c6
--- /dev/null
+++ b/src/problem2/fancy-form/src/components/ui/skeleton.tsx
@@ -0,0 +1,15 @@
+import { cn } from "@/lib/utils"
+
+function Skeleton({
+ className,
+ ...props
+}: React.HTMLAttributes) {
+ return (
+
+ )
+}
+
+export { Skeleton }
diff --git a/src/problem2/fancy-form/src/context/ThemeContext.tsx b/src/problem2/fancy-form/src/context/ThemeContext.tsx
new file mode 100644
index 0000000000..3741ac0694
--- /dev/null
+++ b/src/problem2/fancy-form/src/context/ThemeContext.tsx
@@ -0,0 +1,49 @@
+import { createContext, useContext, useEffect, useState, useCallback } from 'react';
+import type { ReactNode } from 'react';
+
+type Theme = 'light' | 'dark';
+
+interface ThemeContextValue {
+ theme: Theme;
+ toggleTheme: () => void;
+ isDark: boolean;
+}
+
+const ThemeContext = createContext(null);
+
+const STORAGE_KEY = 'fancy-form-theme';
+
+function getInitialTheme(): Theme {
+ const stored = localStorage.getItem(STORAGE_KEY);
+ if (stored === 'light' || stored === 'dark') return stored;
+
+ return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
+}
+
+export function ThemeProvider({ children }: { children: ReactNode }) {
+ const [theme, setTheme] = useState(getInitialTheme);
+
+ useEffect(() => {
+ const root = document.documentElement;
+ root.classList.toggle('dark', theme === 'dark');
+ localStorage.setItem(STORAGE_KEY, theme);
+ }, [theme]);
+
+ const toggleTheme = useCallback(() => {
+ setTheme((prev) => (prev === 'light' ? 'dark' : 'light'));
+ }, []);
+
+ return (
+
+ {children}
+
+ );
+}
+
+export function useTheme(): ThemeContextValue {
+ const context = useContext(ThemeContext);
+ if (!context) {
+ throw new Error('useTheme must be used within a ThemeProvider');
+ }
+ return context;
+}
diff --git a/src/problem2/fancy-form/src/hooks/useSwap.ts b/src/problem2/fancy-form/src/hooks/useSwap.ts
new file mode 100644
index 0000000000..c33dbe59d0
--- /dev/null
+++ b/src/problem2/fancy-form/src/hooks/useSwap.ts
@@ -0,0 +1,193 @@
+import { useState, useCallback, useMemo } from 'react';
+import type { Token } from '@/types';
+import { SwapStatus } from '@/types/swap';
+import { parseAmountInput } from '@/utils/format';
+
+interface UseSwapReturn {
+ sellToken: Token | null;
+ buyToken: Token | null;
+ sellAmount: string;
+ buyAmount: string;
+ status: SwapStatus;
+ exchangeRate: number | null;
+ usdValueSell: number;
+ usdValueBuy: number;
+ priceImpact: number;
+ setSellToken: (token: Token) => void;
+ setBuyToken: (token: Token) => void;
+ setSellAmount: (amount: string) => void;
+ setBuyAmount: (amount: string) => void;
+ flipTokens: () => void;
+ executeSwap: () => Promise;
+ canSwap: boolean;
+ buttonLabel: string;
+}
+
+export function useSwap(): UseSwapReturn {
+ const [sellToken, setSellTokenState] = useState(null);
+ const [buyToken, setBuyTokenState] = useState(null);
+ const [sellAmount, setSellAmountState] = useState('');
+ const [buyAmount, setBuyAmountState] = useState('');
+ const [status, setStatus] = useState(SwapStatus.IDLE);
+ const [lastEdited, setLastEdited] = useState<'sell' | 'buy'>('sell');
+
+ // Calculate exchange rate between sell and buy tokens
+ const exchangeRate = useMemo(() => {
+ if (!sellToken || !buyToken || sellToken.price <= 0 || buyToken.price <= 0) return null;
+ return sellToken.price / buyToken.price;
+ }, [sellToken, buyToken]);
+
+ // USD values
+ const usdValueSell = useMemo(() => {
+ const amount = parseAmountInput(sellAmount);
+ return sellToken ? amount * sellToken.price : 0;
+ }, [sellAmount, sellToken]);
+
+ const usdValueBuy = useMemo(() => {
+ const amount = parseAmountInput(buyAmount);
+ return buyToken ? amount * buyToken.price : 0;
+ }, [buyAmount, buyToken]);
+
+ // Simulated price impact (small random variation for realism)
+ const priceImpact = useMemo(() => {
+ const sellNum = parseAmountInput(sellAmount);
+ if (!sellToken || !buyToken || sellNum <= 0) return 0;
+ // Simulate higher impact for larger trades
+ return Math.min(sellNum * 0.001, 5);
+ }, [sellAmount, sellToken, buyToken]);
+
+ // Auto-calculate the other amount when one changes
+ const setSellAmount = useCallback(
+ (amount: string) => {
+ setSellAmountState(amount);
+ setLastEdited('sell');
+ if (exchangeRate !== null) {
+ const parsed = parseAmountInput(amount);
+ if (parsed > 0) {
+ const computed = parsed * exchangeRate;
+ setBuyAmountState(computed.toFixed(6).replace(/\.?0+$/, ''));
+ } else {
+ setBuyAmountState('');
+ }
+ }
+ },
+ [exchangeRate],
+ );
+
+ const setBuyAmount = useCallback(
+ (amount: string) => {
+ setBuyAmountState(amount);
+ setLastEdited('buy');
+ if (exchangeRate !== null && exchangeRate > 0) {
+ const parsed = parseAmountInput(amount);
+ if (parsed > 0) {
+ const computed = parsed / exchangeRate;
+ setSellAmountState(computed.toFixed(6).replace(/\.?0+$/, ''));
+ } else {
+ setSellAmountState('');
+ }
+ }
+ },
+ [exchangeRate],
+ );
+
+ const setSellToken = useCallback(
+ (token: Token) => {
+ // Prevent selecting the same token for both sides
+ if (buyToken && token.currency === buyToken.currency) {
+ // Swap them
+ setBuyTokenState(sellToken);
+ }
+ setSellTokenState(token);
+ // Recalculate amounts based on new rate
+ if (buyToken && lastEdited === 'sell' && sellAmount) {
+ const rate = token.price / buyToken.price;
+ const parsed = parseAmountInput(sellAmount);
+ if (parsed > 0) {
+ setBuyAmountState((parsed * rate).toFixed(6).replace(/\.?0+$/, ''));
+ }
+ }
+ },
+ [buyToken, sellToken, sellAmount, lastEdited],
+ );
+
+ const setBuyToken = useCallback(
+ (token: Token) => {
+ if (sellToken && token.currency === sellToken.currency) {
+ setSellTokenState(buyToken);
+ }
+ setBuyTokenState(token);
+ if (sellToken && lastEdited === 'sell' && sellAmount) {
+ const rate = sellToken.price / token.price;
+ const parsed = parseAmountInput(sellAmount);
+ if (parsed > 0) {
+ setBuyAmountState((parsed * rate).toFixed(6).replace(/\.?0+$/, ''));
+ }
+ }
+ },
+ [sellToken, buyToken, sellAmount, lastEdited],
+ );
+
+ const flipTokens = useCallback(() => {
+ setSellTokenState(buyToken);
+ setBuyTokenState(sellToken);
+ setSellAmountState(buyAmount);
+ setBuyAmountState(sellAmount);
+ setLastEdited((prev) => (prev === 'sell' ? 'buy' : 'sell'));
+ }, [sellToken, buyToken, sellAmount, buyAmount]);
+
+ // Determine button state
+ const canSwap = useMemo(() => {
+ if (!sellToken || !buyToken) return false;
+ const sellNum = parseAmountInput(sellAmount);
+ return sellNum > 0 && status === SwapStatus.IDLE;
+ }, [sellToken, buyToken, sellAmount, status]);
+
+ const buttonLabel = useMemo(() => {
+ if (status === SwapStatus.PROCESSING) return 'Swapping...';
+ if (status === SwapStatus.SUCCESS) return 'Swap Successful!';
+ if (!sellToken || !buyToken) return 'Select tokens';
+ const sellNum = parseAmountInput(sellAmount);
+ if (sellNum <= 0) return 'Enter an amount';
+ return 'Swap';
+ }, [sellToken, buyToken, sellAmount, status]);
+
+ // Simulated swap execution
+ const executeSwap = useCallback(async () => {
+ if (!canSwap) return;
+
+ setStatus(SwapStatus.PROCESSING);
+
+ // Simulate network delay
+ await new Promise((resolve) => setTimeout(resolve, 2000));
+
+ setStatus(SwapStatus.SUCCESS);
+
+ // Reset after showing success
+ setTimeout(() => {
+ setStatus(SwapStatus.IDLE);
+ setSellAmountState('');
+ setBuyAmountState('');
+ }, 1500);
+ }, [canSwap]);
+
+ return {
+ sellToken,
+ buyToken,
+ sellAmount,
+ buyAmount,
+ status,
+ exchangeRate,
+ usdValueSell,
+ usdValueBuy,
+ priceImpact,
+ setSellToken,
+ setBuyToken,
+ setSellAmount,
+ setBuyAmount,
+ flipTokens,
+ executeSwap,
+ canSwap,
+ buttonLabel,
+ };
+}
diff --git a/src/problem2/fancy-form/src/hooks/useTokenPrices.ts b/src/problem2/fancy-form/src/hooks/useTokenPrices.ts
new file mode 100644
index 0000000000..93c0d25e72
--- /dev/null
+++ b/src/problem2/fancy-form/src/hooks/useTokenPrices.ts
@@ -0,0 +1,27 @@
+import { useQuery } from '@tanstack/react-query';
+import { fetchTokenPrices } from '@/api/prices';
+import { processTokenPrices } from '@/utils/token';
+import type { Token } from '@/types';
+
+const QUERY_KEY = ['token-prices'] as const;
+
+/**
+ * React Query hook for fetching and processing token prices.
+ * - Deduplicates tokens
+ * - Resolves icon URLs
+ * - Auto-refreshes every 60s
+ * - Stale after 30s
+ */
+export function useTokenPrices() {
+ return useQuery({
+ queryKey: QUERY_KEY,
+ queryFn: async () => {
+ const rawPrices = await fetchTokenPrices();
+ return processTokenPrices(rawPrices);
+ },
+ staleTime: 30_000,
+ refetchInterval: 60_000,
+ retry: 3,
+ retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 10_000),
+ });
+}
diff --git a/src/problem2/fancy-form/src/index.css b/src/problem2/fancy-form/src/index.css
new file mode 100644
index 0000000000..c6260a9d71
--- /dev/null
+++ b/src/problem2/fancy-form/src/index.css
@@ -0,0 +1,92 @@
+@import 'tailwindcss';
+@custom-variant dark (&:is(.dark *));
+@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');
+
+/* ===== Custom Theme ===== */
+@theme {
+ --font-sans: 'Inter', ui-sans-serif, system-ui, -apple-system, sans-serif;
+
+ --color-card: #ffffff;
+ --color-card-dark: #131c31;
+ --color-surface: #f0f5ff;
+ --color-surface-dark: #0b1120;
+
+ /* Custom animation for background blobs */
+ --animate-blob: blob 8s infinite;
+}
+
+/* ===== Base Styles ===== */
+@layer base {
+ *,
+ *::before,
+ *::after {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+ }
+
+ html {
+ font-family: var(--font-sans);
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ }
+
+ body {
+ min-width: 320px;
+ }
+
+ /* Remove number input spinners */
+ input[type='number']::-webkit-outer-spin-button,
+ input[type='number']::-webkit-inner-spin-button {
+ -webkit-appearance: none;
+ margin: 0;
+ }
+ input[type='number'] {
+ -moz-appearance: textfield;
+ }
+
+ /* Custom scrollbar */
+ ::-webkit-scrollbar {
+ width: 6px;
+ }
+ ::-webkit-scrollbar-track {
+ background: transparent;
+ }
+ ::-webkit-scrollbar-thumb {
+ background: #cbd5e1;
+ border-radius: 999px;
+ }
+ .dark ::-webkit-scrollbar-thumb {
+ background: #334155;
+ }
+}
+
+/* ===== Blob Animation ===== */
+@keyframes blob {
+ 0%,
+ 100% {
+ transform: translate(0, 0) scale(1);
+ }
+ 25% {
+ transform: translate(30px, -50px) scale(1.05);
+ }
+ 50% {
+ transform: translate(-20px, 20px) scale(0.95);
+ }
+ 75% {
+ transform: translate(20px, 40px) scale(1.02);
+ }
+}
+
+@utility animate-blob {
+ animation: blob 8s infinite ease-in-out;
+}
+
+/* Animation delays for staggered blobs */
+@utility animation-delay-2000 {
+ animation-delay: 2s;
+}
+
+@utility animation-delay-4000 {
+ animation-delay: 4s;
+}
diff --git a/src/problem2/fancy-form/src/lib/utils.ts b/src/problem2/fancy-form/src/lib/utils.ts
new file mode 100644
index 0000000000..bd0c391ddd
--- /dev/null
+++ b/src/problem2/fancy-form/src/lib/utils.ts
@@ -0,0 +1,6 @@
+import { clsx, type ClassValue } from "clsx"
+import { twMerge } from "tailwind-merge"
+
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs))
+}
diff --git a/src/problem2/fancy-form/src/main.tsx b/src/problem2/fancy-form/src/main.tsx
new file mode 100644
index 0000000000..dcf08c3d0e
--- /dev/null
+++ b/src/problem2/fancy-form/src/main.tsx
@@ -0,0 +1,10 @@
+import { StrictMode } from 'react';
+import { createRoot } from 'react-dom/client';
+import App from './App.tsx';
+import './index.css';
+
+createRoot(document.getElementById('root')!).render(
+
+
+ ,
+);
diff --git a/src/problem2/fancy-form/src/types/index.ts b/src/problem2/fancy-form/src/types/index.ts
new file mode 100644
index 0000000000..34b012101d
--- /dev/null
+++ b/src/problem2/fancy-form/src/types/index.ts
@@ -0,0 +1,3 @@
+export type { TokenPrice, Token } from './token';
+export type { SwapFormState } from './swap';
+export type { SwapDirection, SwapStatus } from './swap';
diff --git a/src/problem2/fancy-form/src/types/swap.ts b/src/problem2/fancy-form/src/types/swap.ts
new file mode 100644
index 0000000000..977ec73508
--- /dev/null
+++ b/src/problem2/fancy-form/src/types/swap.ts
@@ -0,0 +1,24 @@
+export const SwapDirection = {
+ SELL: 'sell',
+ BUY: 'buy',
+} as const;
+
+export type SwapDirection = (typeof SwapDirection)[keyof typeof SwapDirection];
+
+export const SwapStatus = {
+ IDLE: 'idle',
+ CONFIRMING: 'confirming',
+ PROCESSING: 'processing',
+ SUCCESS: 'success',
+ ERROR: 'error',
+} as const;
+
+export type SwapStatus = (typeof SwapStatus)[keyof typeof SwapStatus];
+
+export interface SwapFormState {
+ sellToken: import('./token').Token | null;
+ buyToken: import('./token').Token | null;
+ sellAmount: string;
+ buyAmount: string;
+ status: SwapStatus;
+}
diff --git a/src/problem2/fancy-form/src/types/token.ts b/src/problem2/fancy-form/src/types/token.ts
new file mode 100644
index 0000000000..2eafe24cc1
--- /dev/null
+++ b/src/problem2/fancy-form/src/types/token.ts
@@ -0,0 +1,14 @@
+/** Raw token price entry from the Switcheo API */
+export interface TokenPrice {
+ currency: string;
+ date: string;
+ price: number;
+}
+
+/** Processed token ready for UI consumption */
+export interface Token {
+ currency: string;
+ price: number;
+ iconUrl: string;
+ hasIcon: boolean;
+}
diff --git a/src/problem2/fancy-form/src/utils/format.ts b/src/problem2/fancy-form/src/utils/format.ts
new file mode 100644
index 0000000000..9e699b6e0b
--- /dev/null
+++ b/src/problem2/fancy-form/src/utils/format.ts
@@ -0,0 +1,77 @@
+/**
+ * Format a number as a currency-like display string.
+ * Uses compact notation for very large numbers.
+ */
+export function formatAmount(value: number, maxDecimals = 6): string {
+ if (value === 0) return '0';
+
+ if (Math.abs(value) < 0.000001) {
+ return value.toExponential(2);
+ }
+
+ if (Math.abs(value) >= 1_000_000) {
+ return new Intl.NumberFormat('en-US', {
+ notation: 'compact',
+ maximumFractionDigits: 2,
+ }).format(value);
+ }
+
+ // Determine appropriate decimal places based on magnitude
+ const decimals = Math.abs(value) >= 1 ? Math.min(maxDecimals, 4) : maxDecimals;
+
+ return new Intl.NumberFormat('en-US', {
+ minimumFractionDigits: 0,
+ maximumFractionDigits: decimals,
+ }).format(value);
+}
+
+/**
+ * Format a number as USD display.
+ */
+export function formatUsd(value: number): string {
+ if (value === 0) return '$0.00';
+
+ if (value < 0.01) {
+ return '<$0.01';
+ }
+
+ return new Intl.NumberFormat('en-US', {
+ style: 'currency',
+ currency: 'USD',
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+ }).format(value);
+}
+
+/**
+ * Parse a string input to a number, handling edge cases.
+ * Returns NaN for invalid inputs.
+ */
+export function parseAmountInput(input: string): number {
+ if (!input || input === '.' || input === '') return 0;
+ const parsed = parseFloat(input);
+ return isNaN(parsed) ? 0 : parsed;
+}
+
+/**
+ * Validate and sanitize numeric input for the amount field.
+ * Returns the sanitized string or null if invalid.
+ */
+export function sanitizeAmountInput(value: string): string | null {
+ // Allow empty
+ if (value === '') return '';
+
+ // Allow just a dot for starting decimal input
+ if (value === '.') return '0.';
+
+ // Only allow numbers and a single dot
+ const regex = /^\d*\.?\d*$/;
+ if (!regex.test(value)) return null;
+
+ // Prevent leading zeros except "0." or "0"
+ if (value.length > 1 && value.startsWith('0') && value[1] !== '.') {
+ return value.replace(/^0+/, '') || '0';
+ }
+
+ return value;
+}
diff --git a/src/problem2/fancy-form/src/utils/token.ts b/src/problem2/fancy-form/src/utils/token.ts
new file mode 100644
index 0000000000..4f93cf78bf
--- /dev/null
+++ b/src/problem2/fancy-form/src/utils/token.ts
@@ -0,0 +1,79 @@
+import type { Token, TokenPrice } from '@/types';
+
+// Map of token icon modules — these are imported as URLs by Vite
+const tokenIconModules = import.meta.glob('@/assets/token-icon/*.svg', {
+ eager: true,
+ query: '?url',
+ import: 'default',
+});
+
+/**
+ * Build a lookup map from currency name to its icon URL.
+ */
+function buildIconMap(): Map {
+ const map = new Map();
+
+ for (const [path, url] of Object.entries(tokenIconModules)) {
+ // Extract filename without extension, e.g., "/src/assets/token-icon/ETH.svg" -> "ETH"
+ const filename = path.split('/').pop()?.replace('.svg', '');
+ if (filename) {
+ map.set(filename, url);
+ }
+ }
+
+ return map;
+}
+
+const iconMap = buildIconMap();
+
+/** Fallback icon URL for tokens without a matching SVG */
+const FALLBACK_ICON = '';
+
+/**
+ * Resolve the icon URL for a given token currency.
+ */
+export function getTokenIconUrl(currency: string): string {
+ return iconMap.get(currency) ?? FALLBACK_ICON;
+}
+
+/**
+ * Check if a token has a local icon file.
+ */
+export function hasTokenIcon(currency: string): boolean {
+ return iconMap.has(currency);
+}
+
+/**
+ * Deduplicate token prices: keep the most recent entry per currency.
+ * Filter out tokens with invalid prices.
+ */
+export function deduplicateTokenPrices(prices: TokenPrice[]): TokenPrice[] {
+ const latestByToken = new Map();
+
+ for (const entry of prices) {
+ if (!entry.price || entry.price <= 0) continue;
+
+ const existing = latestByToken.get(entry.currency);
+ if (!existing || new Date(entry.date) > new Date(existing.date)) {
+ latestByToken.set(entry.currency, entry);
+ }
+ }
+
+ return Array.from(latestByToken.values());
+}
+
+/**
+ * Convert raw token prices to processed Token objects sorted alphabetically.
+ */
+export function processTokenPrices(rawPrices: TokenPrice[]): Token[] {
+ const deduplicated = deduplicateTokenPrices(rawPrices);
+
+ return deduplicated
+ .map((tp) => ({
+ currency: tp.currency,
+ price: tp.price,
+ iconUrl: getTokenIconUrl(tp.currency),
+ hasIcon: hasTokenIcon(tp.currency),
+ }))
+ .sort((a, b) => a.currency.localeCompare(b.currency));
+}
diff --git a/src/problem2/fancy-form/tsconfig.app.json b/src/problem2/fancy-form/tsconfig.app.json
new file mode 100644
index 0000000000..ebde7f0109
--- /dev/null
+++ b/src/problem2/fancy-form/tsconfig.app.json
@@ -0,0 +1,28 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
+ "target": "es2023",
+ "lib": ["ES2023", "DOM"],
+ "module": "esnext",
+ "types": ["vite/client"],
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "verbatimModuleSyntax": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+ "jsx": "react-jsx",
+ "paths": {
+ "@/*": ["./src/*"]
+ },
+
+ /* Linting */
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "erasableSyntaxOnly": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["src"]
+}
diff --git a/src/problem2/fancy-form/tsconfig.json b/src/problem2/fancy-form/tsconfig.json
new file mode 100644
index 0000000000..aa3c04f1be
--- /dev/null
+++ b/src/problem2/fancy-form/tsconfig.json
@@ -0,0 +1,13 @@
+{
+ "compilerOptions": {
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ },
+ "files": [],
+ "references": [
+ { "path": "./tsconfig.app.json" },
+ { "path": "./tsconfig.node.json" }
+ ]
+}
diff --git a/src/problem2/fancy-form/tsconfig.node.json b/src/problem2/fancy-form/tsconfig.node.json
new file mode 100644
index 0000000000..d3c52ea64c
--- /dev/null
+++ b/src/problem2/fancy-form/tsconfig.node.json
@@ -0,0 +1,24 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
+ "target": "es2023",
+ "lib": ["ES2023"],
+ "module": "esnext",
+ "types": ["node"],
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "verbatimModuleSyntax": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+
+ /* Linting */
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "erasableSyntaxOnly": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/src/problem2/fancy-form/vite.config.ts b/src/problem2/fancy-form/vite.config.ts
new file mode 100644
index 0000000000..e6da720dab
--- /dev/null
+++ b/src/problem2/fancy-form/vite.config.ts
@@ -0,0 +1,14 @@
+import { defineConfig } from 'vite';
+import react from '@vitejs/plugin-react';
+import tailwindcss from '@tailwindcss/vite';
+import path from 'path';
+
+// https://vite.dev/config/
+export default defineConfig({
+ plugins: [react(), tailwindcss()],
+ resolve: {
+ alias: {
+ '@': path.resolve(__dirname, './src'),
+ },
+ },
+});
diff --git a/src/problem2/fancy-form/yarn.lock b/src/problem2/fancy-form/yarn.lock
new file mode 100644
index 0000000000..b869ea8181
--- /dev/null
+++ b/src/problem2/fancy-form/yarn.lock
@@ -0,0 +1,1531 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0":
+ version "7.29.0"
+ resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz"
+ integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.28.5"
+ js-tokens "^4.0.0"
+ picocolors "^1.1.1"
+
+"@babel/compat-data@^7.28.6":
+ version "7.29.0"
+ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz"
+ integrity sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==
+
+"@babel/core@^7.0.0", "@babel/core@^7.24.4":
+ version "7.29.0"
+ resolved "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz"
+ integrity sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==
+ dependencies:
+ "@babel/code-frame" "^7.29.0"
+ "@babel/generator" "^7.29.0"
+ "@babel/helper-compilation-targets" "^7.28.6"
+ "@babel/helper-module-transforms" "^7.28.6"
+ "@babel/helpers" "^7.28.6"
+ "@babel/parser" "^7.29.0"
+ "@babel/template" "^7.28.6"
+ "@babel/traverse" "^7.29.0"
+ "@babel/types" "^7.29.0"
+ "@jridgewell/remapping" "^2.3.5"
+ convert-source-map "^2.0.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.3"
+ semver "^6.3.1"
+
+"@babel/generator@^7.29.0":
+ version "7.29.1"
+ resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz"
+ integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==
+ dependencies:
+ "@babel/parser" "^7.29.0"
+ "@babel/types" "^7.29.0"
+ "@jridgewell/gen-mapping" "^0.3.12"
+ "@jridgewell/trace-mapping" "^0.3.28"
+ jsesc "^3.0.2"
+
+"@babel/helper-compilation-targets@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz"
+ integrity sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==
+ dependencies:
+ "@babel/compat-data" "^7.28.6"
+ "@babel/helper-validator-option" "^7.27.1"
+ browserslist "^4.24.0"
+ lru-cache "^5.1.1"
+ semver "^6.3.1"
+
+"@babel/helper-globals@^7.28.0":
+ version "7.28.0"
+ resolved "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz"
+ integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==
+
+"@babel/helper-module-imports@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz"
+ integrity sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==
+ dependencies:
+ "@babel/traverse" "^7.28.6"
+ "@babel/types" "^7.28.6"
+
+"@babel/helper-module-transforms@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz"
+ integrity sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==
+ dependencies:
+ "@babel/helper-module-imports" "^7.28.6"
+ "@babel/helper-validator-identifier" "^7.28.5"
+ "@babel/traverse" "^7.28.6"
+
+"@babel/helper-string-parser@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz"
+ integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==
+
+"@babel/helper-validator-identifier@^7.28.5":
+ version "7.28.5"
+ resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz"
+ integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==
+
+"@babel/helper-validator-option@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz"
+ integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==
+
+"@babel/helpers@^7.28.6":
+ version "7.29.2"
+ resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz"
+ integrity sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==
+ dependencies:
+ "@babel/template" "^7.28.6"
+ "@babel/types" "^7.29.0"
+
+"@babel/parser@^7.24.4", "@babel/parser@^7.28.6", "@babel/parser@^7.29.0":
+ version "7.29.2"
+ resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz"
+ integrity sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==
+ dependencies:
+ "@babel/types" "^7.29.0"
+
+"@babel/runtime@^7.29.2":
+ version "7.29.2"
+ resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz"
+ integrity sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==
+
+"@babel/template@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz"
+ integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==
+ dependencies:
+ "@babel/code-frame" "^7.28.6"
+ "@babel/parser" "^7.28.6"
+ "@babel/types" "^7.28.6"
+
+"@babel/traverse@^7.28.6", "@babel/traverse@^7.29.0":
+ version "7.29.0"
+ resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz"
+ integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==
+ dependencies:
+ "@babel/code-frame" "^7.29.0"
+ "@babel/generator" "^7.29.0"
+ "@babel/helper-globals" "^7.28.0"
+ "@babel/parser" "^7.29.0"
+ "@babel/template" "^7.28.6"
+ "@babel/types" "^7.29.0"
+ debug "^4.3.1"
+
+"@babel/types@^7.28.6", "@babel/types@^7.29.0":
+ version "7.29.0"
+ resolved "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz"
+ integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==
+ dependencies:
+ "@babel/helper-string-parser" "^7.27.1"
+ "@babel/helper-validator-identifier" "^7.28.5"
+
+"@base-ui/react@^1.4.1":
+ version "1.4.1"
+ resolved "https://registry.npmjs.org/@base-ui/react/-/react-1.4.1.tgz"
+ integrity sha512-Ab5/LIhcmL8BQcsBUYiOfkSDRdLpvgUBzMK30cu684JPcLclYlztharvCZyNNgzJtbAiREzI9q0pI5erHCMgCw==
+ dependencies:
+ "@babel/runtime" "^7.29.2"
+ "@base-ui/utils" "0.2.8"
+ "@floating-ui/react-dom" "^2.1.8"
+ "@floating-ui/utils" "^0.2.11"
+ use-sync-external-store "^1.6.0"
+
+"@base-ui/utils@0.2.8":
+ version "0.2.8"
+ resolved "https://registry.npmjs.org/@base-ui/utils/-/utils-0.2.8.tgz"
+ integrity sha512-jvOi+c+ftGlGotNcKnzPVg2IhCaDTB6/6R3JeqdjdXktuAJi3wKH9T7+svuaKh1mmfVU11UWzUZVH74JDfi/wQ==
+ dependencies:
+ "@babel/runtime" "^7.29.2"
+ "@floating-ui/utils" "^0.2.11"
+ reselect "^5.1.1"
+ use-sync-external-store "^1.6.0"
+
+"@eslint-community/eslint-utils@^4.8.0", "@eslint-community/eslint-utils@^4.9.1":
+ version "4.9.1"
+ resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz"
+ integrity sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==
+ dependencies:
+ eslint-visitor-keys "^3.4.3"
+
+"@eslint-community/regexpp@^4.12.2":
+ version "4.12.2"
+ resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz"
+ integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==
+
+"@eslint/config-array@^0.23.5":
+ version "0.23.5"
+ resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz"
+ integrity sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==
+ dependencies:
+ "@eslint/object-schema" "^3.0.5"
+ debug "^4.3.1"
+ minimatch "^10.2.4"
+
+"@eslint/config-helpers@^0.5.5":
+ version "0.5.5"
+ resolved "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.5.tgz"
+ integrity sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==
+ dependencies:
+ "@eslint/core" "^1.2.1"
+
+"@eslint/core@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz"
+ integrity sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==
+ dependencies:
+ "@types/json-schema" "^7.0.15"
+
+"@eslint/js@^10.0.1":
+ version "10.0.1"
+ resolved "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz"
+ integrity sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==
+
+"@eslint/object-schema@^3.0.5":
+ version "3.0.5"
+ resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz"
+ integrity sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==
+
+"@eslint/plugin-kit@^0.7.1":
+ version "0.7.1"
+ resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.1.tgz"
+ integrity sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==
+ dependencies:
+ "@eslint/core" "^1.2.1"
+ levn "^0.4.1"
+
+"@floating-ui/core@^1.7.5":
+ version "1.7.5"
+ resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz"
+ integrity sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==
+ dependencies:
+ "@floating-ui/utils" "^0.2.11"
+
+"@floating-ui/dom@^1.7.6":
+ version "1.7.6"
+ resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz"
+ integrity sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==
+ dependencies:
+ "@floating-ui/core" "^1.7.5"
+ "@floating-ui/utils" "^0.2.11"
+
+"@floating-ui/react-dom@^2.1.8":
+ version "2.1.8"
+ resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz"
+ integrity sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==
+ dependencies:
+ "@floating-ui/dom" "^1.7.6"
+
+"@floating-ui/utils@^0.2.11":
+ version "0.2.11"
+ resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz"
+ integrity sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==
+
+"@humanfs/core@^0.19.2":
+ version "0.19.2"
+ resolved "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz"
+ integrity sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==
+ dependencies:
+ "@humanfs/types" "^0.15.0"
+
+"@humanfs/node@^0.16.6":
+ version "0.16.8"
+ resolved "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz"
+ integrity sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==
+ dependencies:
+ "@humanfs/core" "^0.19.2"
+ "@humanfs/types" "^0.15.0"
+ "@humanwhocodes/retry" "^0.4.0"
+
+"@humanfs/types@^0.15.0":
+ version "0.15.0"
+ resolved "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz"
+ integrity sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==
+
+"@humanwhocodes/module-importer@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz"
+ integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
+
+"@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2":
+ version "0.4.3"
+ resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz"
+ integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==
+
+"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5":
+ version "0.3.13"
+ resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz"
+ integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==
+ dependencies:
+ "@jridgewell/sourcemap-codec" "^1.5.0"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/remapping@^2.3.5":
+ version "2.3.5"
+ resolved "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz"
+ integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/resolve-uri@^3.1.0":
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz"
+ integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
+
+"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5":
+ version "1.5.5"
+ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz"
+ integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==
+
+"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28":
+ version "0.3.31"
+ resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz"
+ integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.1.0"
+ "@jridgewell/sourcemap-codec" "^1.4.14"
+
+"@oxc-project/types@=0.127.0":
+ version "0.127.0"
+ resolved "https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz"
+ integrity sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==
+
+"@pkgr/core@^0.2.9":
+ version "0.2.9"
+ resolved "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz"
+ integrity sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==
+
+"@radix-ui/primitive@1.1.3":
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz"
+ integrity sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==
+
+"@radix-ui/react-compose-refs@1.1.2":
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz"
+ integrity sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==
+
+"@radix-ui/react-context@1.1.2":
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz"
+ integrity sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==
+
+"@radix-ui/react-dialog@^1.1.15":
+ version "1.1.15"
+ resolved "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz"
+ integrity sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==
+ dependencies:
+ "@radix-ui/primitive" "1.1.3"
+ "@radix-ui/react-compose-refs" "1.1.2"
+ "@radix-ui/react-context" "1.1.2"
+ "@radix-ui/react-dismissable-layer" "1.1.11"
+ "@radix-ui/react-focus-guards" "1.1.3"
+ "@radix-ui/react-focus-scope" "1.1.7"
+ "@radix-ui/react-id" "1.1.1"
+ "@radix-ui/react-portal" "1.1.9"
+ "@radix-ui/react-presence" "1.1.5"
+ "@radix-ui/react-primitive" "2.1.3"
+ "@radix-ui/react-slot" "1.2.3"
+ "@radix-ui/react-use-controllable-state" "1.2.2"
+ aria-hidden "^1.2.4"
+ react-remove-scroll "^2.6.3"
+
+"@radix-ui/react-dismissable-layer@1.1.11":
+ version "1.1.11"
+ resolved "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz"
+ integrity sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==
+ dependencies:
+ "@radix-ui/primitive" "1.1.3"
+ "@radix-ui/react-compose-refs" "1.1.2"
+ "@radix-ui/react-primitive" "2.1.3"
+ "@radix-ui/react-use-callback-ref" "1.1.1"
+ "@radix-ui/react-use-escape-keydown" "1.1.1"
+
+"@radix-ui/react-focus-guards@1.1.3":
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz"
+ integrity sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==
+
+"@radix-ui/react-focus-scope@1.1.7":
+ version "1.1.7"
+ resolved "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz"
+ integrity sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==
+ dependencies:
+ "@radix-ui/react-compose-refs" "1.1.2"
+ "@radix-ui/react-primitive" "2.1.3"
+ "@radix-ui/react-use-callback-ref" "1.1.1"
+
+"@radix-ui/react-id@1.1.1":
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz"
+ integrity sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==
+ dependencies:
+ "@radix-ui/react-use-layout-effect" "1.1.1"
+
+"@radix-ui/react-portal@1.1.9":
+ version "1.1.9"
+ resolved "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz"
+ integrity sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==
+ dependencies:
+ "@radix-ui/react-primitive" "2.1.3"
+ "@radix-ui/react-use-layout-effect" "1.1.1"
+
+"@radix-ui/react-presence@1.1.5":
+ version "1.1.5"
+ resolved "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz"
+ integrity sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==
+ dependencies:
+ "@radix-ui/react-compose-refs" "1.1.2"
+ "@radix-ui/react-use-layout-effect" "1.1.1"
+
+"@radix-ui/react-primitive@2.1.3":
+ version "2.1.3"
+ resolved "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz"
+ integrity sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==
+ dependencies:
+ "@radix-ui/react-slot" "1.2.3"
+
+"@radix-ui/react-slot@^1.2.4":
+ version "1.2.4"
+ resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz"
+ integrity sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==
+ dependencies:
+ "@radix-ui/react-compose-refs" "1.1.2"
+
+"@radix-ui/react-slot@1.2.3":
+ version "1.2.3"
+ resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz"
+ integrity sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==
+ dependencies:
+ "@radix-ui/react-compose-refs" "1.1.2"
+
+"@radix-ui/react-use-callback-ref@1.1.1":
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz"
+ integrity sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==
+
+"@radix-ui/react-use-controllable-state@1.2.2":
+ version "1.2.2"
+ resolved "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz"
+ integrity sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==
+ dependencies:
+ "@radix-ui/react-use-effect-event" "0.0.2"
+ "@radix-ui/react-use-layout-effect" "1.1.1"
+
+"@radix-ui/react-use-effect-event@0.0.2":
+ version "0.0.2"
+ resolved "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz"
+ integrity sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==
+ dependencies:
+ "@radix-ui/react-use-layout-effect" "1.1.1"
+
+"@radix-ui/react-use-escape-keydown@1.1.1":
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz"
+ integrity sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==
+ dependencies:
+ "@radix-ui/react-use-callback-ref" "1.1.1"
+
+"@radix-ui/react-use-layout-effect@1.1.1":
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz"
+ integrity sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==
+
+"@rolldown/binding-win32-x64-msvc@1.0.0-rc.17":
+ version "1.0.0-rc.17"
+ resolved "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.17.tgz"
+ integrity sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==
+
+"@rolldown/pluginutils@1.0.0-rc.17":
+ version "1.0.0-rc.17"
+ resolved "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.17.tgz"
+ integrity sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==
+
+"@rolldown/pluginutils@1.0.0-rc.7":
+ version "1.0.0-rc.7"
+ resolved "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz"
+ integrity sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==
+
+"@tailwindcss/node@4.2.4":
+ version "4.2.4"
+ resolved "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.4.tgz"
+ integrity sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA==
+ dependencies:
+ "@jridgewell/remapping" "^2.3.5"
+ enhanced-resolve "^5.19.0"
+ jiti "^2.6.1"
+ lightningcss "1.32.0"
+ magic-string "^0.30.21"
+ source-map-js "^1.2.1"
+ tailwindcss "4.2.4"
+
+"@tailwindcss/oxide-win32-x64-msvc@4.2.4":
+ version "4.2.4"
+ resolved "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.4.tgz"
+ integrity sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw==
+
+"@tailwindcss/oxide@4.2.4":
+ version "4.2.4"
+ resolved "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.4.tgz"
+ integrity sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q==
+ optionalDependencies:
+ "@tailwindcss/oxide-android-arm64" "4.2.4"
+ "@tailwindcss/oxide-darwin-arm64" "4.2.4"
+ "@tailwindcss/oxide-darwin-x64" "4.2.4"
+ "@tailwindcss/oxide-freebsd-x64" "4.2.4"
+ "@tailwindcss/oxide-linux-arm-gnueabihf" "4.2.4"
+ "@tailwindcss/oxide-linux-arm64-gnu" "4.2.4"
+ "@tailwindcss/oxide-linux-arm64-musl" "4.2.4"
+ "@tailwindcss/oxide-linux-x64-gnu" "4.2.4"
+ "@tailwindcss/oxide-linux-x64-musl" "4.2.4"
+ "@tailwindcss/oxide-wasm32-wasi" "4.2.4"
+ "@tailwindcss/oxide-win32-arm64-msvc" "4.2.4"
+ "@tailwindcss/oxide-win32-x64-msvc" "4.2.4"
+
+"@tailwindcss/vite@^4.2.4":
+ version "4.2.4"
+ resolved "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.4.tgz"
+ integrity sha512-pCvohwOCspk3ZFn6eJzrrX3g4n2JY73H6MmYC87XfGPyTty4YsCjYTMArRZm/zOI8dIt3+EcrLHAFPe5A4bgtw==
+ dependencies:
+ "@tailwindcss/node" "4.2.4"
+ "@tailwindcss/oxide" "4.2.4"
+ tailwindcss "4.2.4"
+
+"@tanstack/query-core@5.100.5":
+ version "5.100.5"
+ resolved "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.100.5.tgz"
+ integrity sha512-t20KrhKkf0HXzqQkPbJ5erhFesup68BAbwFgYmTrS7bxMF7O5MdmL8jUkik4thsG7Hg00fblz30h6yF1d5TxGg==
+
+"@tanstack/react-query@^5.100.5":
+ version "5.100.5"
+ resolved "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.100.5.tgz"
+ integrity sha512-aNwj1mi2v2bQ9IxkyR1grLOUkv3BYWoykHy9KDyLNbjC3tsahbOHJibK+Wjtr1wRhG59/AvJhiJG5OlthaCgJA==
+ dependencies:
+ "@tanstack/query-core" "5.100.5"
+
+"@types/esrecurse@^4.3.1":
+ version "4.3.1"
+ resolved "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz"
+ integrity sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==
+
+"@types/estree@^1.0.6", "@types/estree@^1.0.8":
+ version "1.0.8"
+ resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz"
+ integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==
+
+"@types/json-schema@^7.0.15":
+ version "7.0.15"
+ resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz"
+ integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
+
+"@types/node@^20.19.0 || >=22.12.0", "@types/node@^24.12.2":
+ version "24.12.2"
+ resolved "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz"
+ integrity sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==
+ dependencies:
+ undici-types "~7.16.0"
+
+"@types/react-dom@*", "@types/react-dom@^19.2.3":
+ version "19.2.3"
+ resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz"
+ integrity sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==
+
+"@types/react@*", "@types/react@^17 || ^18 || ^19", "@types/react@^19.2.0", "@types/react@^19.2.14":
+ version "19.2.14"
+ resolved "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz"
+ integrity sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==
+ dependencies:
+ csstype "^3.2.2"
+
+"@typescript-eslint/eslint-plugin@8.59.0":
+ version "8.59.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.0.tgz"
+ integrity sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw==
+ dependencies:
+ "@eslint-community/regexpp" "^4.12.2"
+ "@typescript-eslint/scope-manager" "8.59.0"
+ "@typescript-eslint/type-utils" "8.59.0"
+ "@typescript-eslint/utils" "8.59.0"
+ "@typescript-eslint/visitor-keys" "8.59.0"
+ ignore "^7.0.5"
+ natural-compare "^1.4.0"
+ ts-api-utils "^2.5.0"
+
+"@typescript-eslint/parser@^8.59.0", "@typescript-eslint/parser@8.59.0":
+ version "8.59.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.0.tgz"
+ integrity sha512-TI1XGwKbDpo9tRW8UDIXCOeLk55qe9ZFGs8MTKU6/M08HWTw52DD/IYhfQtOEhEdPhLMT26Ka/x7p70nd3dzDg==
+ dependencies:
+ "@typescript-eslint/scope-manager" "8.59.0"
+ "@typescript-eslint/types" "8.59.0"
+ "@typescript-eslint/typescript-estree" "8.59.0"
+ "@typescript-eslint/visitor-keys" "8.59.0"
+ debug "^4.4.3"
+
+"@typescript-eslint/project-service@8.59.0":
+ version "8.59.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.0.tgz"
+ integrity sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw==
+ dependencies:
+ "@typescript-eslint/tsconfig-utils" "^8.59.0"
+ "@typescript-eslint/types" "^8.59.0"
+ debug "^4.4.3"
+
+"@typescript-eslint/scope-manager@8.59.0":
+ version "8.59.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.0.tgz"
+ integrity sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg==
+ dependencies:
+ "@typescript-eslint/types" "8.59.0"
+ "@typescript-eslint/visitor-keys" "8.59.0"
+
+"@typescript-eslint/tsconfig-utils@^8.59.0", "@typescript-eslint/tsconfig-utils@8.59.0":
+ version "8.59.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.0.tgz"
+ integrity sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg==
+
+"@typescript-eslint/type-utils@8.59.0":
+ version "8.59.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.0.tgz"
+ integrity sha512-3TRiZaQSltGqGeNrJzzr1+8YcEobKH9rHnqIp/1psfKFmhRQDNMGP5hBufanYTGznwShzVLs3Mz+gDN7HkWfXg==
+ dependencies:
+ "@typescript-eslint/types" "8.59.0"
+ "@typescript-eslint/typescript-estree" "8.59.0"
+ "@typescript-eslint/utils" "8.59.0"
+ debug "^4.4.3"
+ ts-api-utils "^2.5.0"
+
+"@typescript-eslint/types@^8.59.0", "@typescript-eslint/types@8.59.0":
+ version "8.59.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.0.tgz"
+ integrity sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==
+
+"@typescript-eslint/typescript-estree@8.59.0":
+ version "8.59.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.0.tgz"
+ integrity sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw==
+ dependencies:
+ "@typescript-eslint/project-service" "8.59.0"
+ "@typescript-eslint/tsconfig-utils" "8.59.0"
+ "@typescript-eslint/types" "8.59.0"
+ "@typescript-eslint/visitor-keys" "8.59.0"
+ debug "^4.4.3"
+ minimatch "^10.2.2"
+ semver "^7.7.3"
+ tinyglobby "^0.2.15"
+ ts-api-utils "^2.5.0"
+
+"@typescript-eslint/utils@8.59.0":
+ version "8.59.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.0.tgz"
+ integrity sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.9.1"
+ "@typescript-eslint/scope-manager" "8.59.0"
+ "@typescript-eslint/types" "8.59.0"
+ "@typescript-eslint/typescript-estree" "8.59.0"
+
+"@typescript-eslint/visitor-keys@8.59.0":
+ version "8.59.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.0.tgz"
+ integrity sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==
+ dependencies:
+ "@typescript-eslint/types" "8.59.0"
+ eslint-visitor-keys "^5.0.0"
+
+"@vitejs/plugin-react@^6.0.1":
+ version "6.0.1"
+ resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz"
+ integrity sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==
+ dependencies:
+ "@rolldown/pluginutils" "1.0.0-rc.7"
+
+acorn-jsx@^5.3.2:
+ version "5.3.2"
+ resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
+ integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
+
+"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.16.0:
+ version "8.16.0"
+ resolved "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz"
+ integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==
+
+ajv@^6.14.0:
+ version "6.15.0"
+ resolved "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz"
+ integrity sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+aria-hidden@^1.2.4:
+ version "1.2.6"
+ resolved "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz"
+ integrity sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==
+ dependencies:
+ tslib "^2.0.0"
+
+balanced-match@^4.0.2:
+ version "4.0.4"
+ resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz"
+ integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==
+
+baseline-browser-mapping@^2.10.12:
+ version "2.10.23"
+ resolved "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.23.tgz"
+ integrity sha512-xwVXGqevyKPsiuQdLj+dZMVjidjJV508TBqexND5HrF89cGdCYCJFB3qhcxRHSeMctdCfbR1jrxBajhDy7o29g==
+
+brace-expansion@^5.0.5:
+ version "5.0.5"
+ resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz"
+ integrity sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==
+ dependencies:
+ balanced-match "^4.0.2"
+
+browserslist@^4.24.0, "browserslist@>= 4.21.0":
+ version "4.28.2"
+ resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz"
+ integrity sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==
+ dependencies:
+ baseline-browser-mapping "^2.10.12"
+ caniuse-lite "^1.0.30001782"
+ electron-to-chromium "^1.5.328"
+ node-releases "^2.0.36"
+ update-browserslist-db "^1.2.3"
+
+caniuse-lite@^1.0.30001782:
+ version "1.0.30001791"
+ resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz"
+ integrity sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==
+
+class-variance-authority@^0.7.1:
+ version "0.7.1"
+ resolved "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz"
+ integrity sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==
+ dependencies:
+ clsx "^2.1.1"
+
+clsx@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz"
+ integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==
+
+convert-source-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz"
+ integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
+
+cross-spawn@^7.0.6:
+ version "7.0.6"
+ resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz"
+ integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+csstype@^3.0.10, csstype@^3.1.3, csstype@^3.2.2:
+ version "3.2.3"
+ resolved "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz"
+ integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==
+
+debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.4.3:
+ version "4.4.3"
+ resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz"
+ integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==
+ dependencies:
+ ms "^2.1.3"
+
+deep-is@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz"
+ integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
+detect-libc@^2.0.3:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz"
+ integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==
+
+detect-node-es@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz"
+ integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==
+
+electron-to-chromium@^1.5.328:
+ version "1.5.344"
+ resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.344.tgz"
+ integrity sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==
+
+enhanced-resolve@^5.19.0:
+ version "5.21.0"
+ resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz"
+ integrity sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==
+ dependencies:
+ graceful-fs "^4.2.4"
+ tapable "^2.3.3"
+
+escalade@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz"
+ integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
+
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+eslint-config-prettier@^10.1.8, "eslint-config-prettier@>= 7.0.0 <10.0.0 || >=10.1.0":
+ version "10.1.8"
+ resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz"
+ integrity sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==
+
+eslint-plugin-prettier@^5.5.5:
+ version "5.5.5"
+ resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz"
+ integrity sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==
+ dependencies:
+ prettier-linter-helpers "^1.0.1"
+ synckit "^0.11.12"
+
+eslint-plugin-react-hooks@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz"
+ integrity sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==
+ dependencies:
+ "@babel/core" "^7.24.4"
+ "@babel/parser" "^7.24.4"
+ hermes-parser "^0.25.1"
+ zod "^3.25.0 || ^4.0.0"
+ zod-validation-error "^3.5.0 || ^4.0.0"
+
+eslint-plugin-react-refresh@^0.5.2:
+ version "0.5.2"
+ resolved "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz"
+ integrity sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==
+
+eslint-scope@^9.1.2:
+ version "9.1.2"
+ resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz"
+ integrity sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==
+ dependencies:
+ "@types/esrecurse" "^4.3.1"
+ "@types/estree" "^1.0.8"
+ esrecurse "^4.3.0"
+ estraverse "^5.2.0"
+
+eslint-visitor-keys@^3.4.3:
+ version "3.4.3"
+ resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
+ integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
+
+eslint-visitor-keys@^5.0.0, eslint-visitor-keys@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz"
+ integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==
+
+eslint@^10.0.0, eslint@^10.2.1, "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^8.57.0 || ^9.0.0 || ^10.0.0", "eslint@^9 || ^10", eslint@>=7.0.0, eslint@>=8.0.0:
+ version "10.2.1"
+ resolved "https://registry.npmjs.org/eslint/-/eslint-10.2.1.tgz"
+ integrity sha512-wiyGaKsDgqXvF40P8mDwiUp/KQjE1FdrIEJsM8PZ3XCiniTMXS3OHWWUe5FI5agoCnr8x4xPrTDZuxsBlNHl+Q==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.8.0"
+ "@eslint-community/regexpp" "^4.12.2"
+ "@eslint/config-array" "^0.23.5"
+ "@eslint/config-helpers" "^0.5.5"
+ "@eslint/core" "^1.2.1"
+ "@eslint/plugin-kit" "^0.7.1"
+ "@humanfs/node" "^0.16.6"
+ "@humanwhocodes/module-importer" "^1.0.1"
+ "@humanwhocodes/retry" "^0.4.2"
+ "@types/estree" "^1.0.6"
+ ajv "^6.14.0"
+ cross-spawn "^7.0.6"
+ debug "^4.3.2"
+ escape-string-regexp "^4.0.0"
+ eslint-scope "^9.1.2"
+ eslint-visitor-keys "^5.0.1"
+ espree "^11.2.0"
+ esquery "^1.7.0"
+ esutils "^2.0.2"
+ fast-deep-equal "^3.1.3"
+ file-entry-cache "^8.0.0"
+ find-up "^5.0.0"
+ glob-parent "^6.0.2"
+ ignore "^5.2.0"
+ imurmurhash "^0.1.4"
+ is-glob "^4.0.0"
+ json-stable-stringify-without-jsonify "^1.0.1"
+ minimatch "^10.2.4"
+ natural-compare "^1.4.0"
+ optionator "^0.9.3"
+
+espree@^11.2.0:
+ version "11.2.0"
+ resolved "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz"
+ integrity sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==
+ dependencies:
+ acorn "^8.16.0"
+ acorn-jsx "^5.3.2"
+ eslint-visitor-keys "^5.0.1"
+
+esquery@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz"
+ integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==
+ dependencies:
+ estraverse "^5.1.0"
+
+esrecurse@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz"
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+ dependencies:
+ estraverse "^5.2.0"
+
+estraverse@^5.1.0, estraverse@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-diff@^1.1.2:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz"
+ integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"
+ integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+
+fdir@^6.5.0:
+ version "6.5.0"
+ resolved "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz"
+ integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==
+
+file-entry-cache@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz"
+ integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==
+ dependencies:
+ flat-cache "^4.0.0"
+
+find-up@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz"
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ dependencies:
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
+
+flat-cache@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz"
+ integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==
+ dependencies:
+ flatted "^3.2.9"
+ keyv "^4.5.4"
+
+flatted@^3.2.9:
+ version "3.4.2"
+ resolved "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz"
+ integrity sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==
+
+framer-motion@^12.38.0:
+ version "12.38.0"
+ resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-12.38.0.tgz"
+ integrity sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g==
+ dependencies:
+ motion-dom "^12.38.0"
+ motion-utils "^12.36.0"
+ tslib "^2.4.0"
+
+gensync@^1.0.0-beta.2:
+ version "1.0.0-beta.2"
+ resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-nonce@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz"
+ integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==
+
+glob-parent@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz"
+ integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+ dependencies:
+ is-glob "^4.0.3"
+
+globals@^17.5.0:
+ version "17.5.0"
+ resolved "https://registry.npmjs.org/globals/-/globals-17.5.0.tgz"
+ integrity sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==
+
+goober@^2.1.16:
+ version "2.1.18"
+ resolved "https://registry.npmjs.org/goober/-/goober-2.1.18.tgz"
+ integrity sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==
+
+graceful-fs@^4.2.4:
+ version "4.2.11"
+ resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
+hermes-estree@0.25.1:
+ version "0.25.1"
+ resolved "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz"
+ integrity sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==
+
+hermes-parser@^0.25.1:
+ version "0.25.1"
+ resolved "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz"
+ integrity sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==
+ dependencies:
+ hermes-estree "0.25.1"
+
+ignore@^5.2.0:
+ version "5.3.2"
+ resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz"
+ integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
+
+ignore@^7.0.5:
+ version "7.0.5"
+ resolved "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz"
+ integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz"
+ integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-glob@^4.0.0, is-glob@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+jiti@*, jiti@^2.6.1, jiti@>=1.21.0:
+ version "2.6.1"
+ resolved "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz"
+ integrity sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==
+
+js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+jsesc@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz"
+ integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==
+
+json-buffer@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz"
+ integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz"
+ integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
+
+json5@^2.2.3:
+ version "2.2.3"
+ resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz"
+ integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+
+keyv@^4.5.4:
+ version "4.5.4"
+ resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz"
+ integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
+ dependencies:
+ json-buffer "3.0.1"
+
+levn@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz"
+ integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+ dependencies:
+ prelude-ls "^1.2.1"
+ type-check "~0.4.0"
+
+lightningcss-win32-x64-msvc@1.32.0:
+ version "1.32.0"
+ resolved "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz"
+ integrity sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==
+
+lightningcss@^1.32.0, lightningcss@1.32.0:
+ version "1.32.0"
+ resolved "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz"
+ integrity sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==
+ dependencies:
+ detect-libc "^2.0.3"
+ optionalDependencies:
+ lightningcss-android-arm64 "1.32.0"
+ lightningcss-darwin-arm64 "1.32.0"
+ lightningcss-darwin-x64 "1.32.0"
+ lightningcss-freebsd-x64 "1.32.0"
+ lightningcss-linux-arm-gnueabihf "1.32.0"
+ lightningcss-linux-arm64-gnu "1.32.0"
+ lightningcss-linux-arm64-musl "1.32.0"
+ lightningcss-linux-x64-gnu "1.32.0"
+ lightningcss-linux-x64-musl "1.32.0"
+ lightningcss-win32-arm64-msvc "1.32.0"
+ lightningcss-win32-x64-msvc "1.32.0"
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+lucide-react@^1.11.0:
+ version "1.11.0"
+ resolved "https://registry.npmjs.org/lucide-react/-/lucide-react-1.11.0.tgz"
+ integrity sha512-UOhjdztXCgdBReRcIhsvz2siIBogfv/lhJEIViCpLt924dO+GDms9T7DNoucI23s6kEPpe988m5N0D2ajnzb2g==
+
+magic-string@^0.30.21:
+ version "0.30.21"
+ resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz"
+ integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==
+ dependencies:
+ "@jridgewell/sourcemap-codec" "^1.5.5"
+
+minimatch@^10.2.2, minimatch@^10.2.4:
+ version "10.2.5"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz"
+ integrity sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==
+ dependencies:
+ brace-expansion "^5.0.5"
+
+motion-dom@^12.38.0:
+ version "12.38.0"
+ resolved "https://registry.npmjs.org/motion-dom/-/motion-dom-12.38.0.tgz"
+ integrity sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA==
+ dependencies:
+ motion-utils "^12.36.0"
+
+motion-utils@^12.36.0:
+ version "12.36.0"
+ resolved "https://registry.npmjs.org/motion-utils/-/motion-utils-12.36.0.tgz"
+ integrity sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==
+
+ms@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+nanoid@^3.3.11:
+ version "3.3.11"
+ resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz"
+ integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
+ integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+
+node-releases@^2.0.36:
+ version "2.0.38"
+ resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz"
+ integrity sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==
+
+optionator@^0.9.3:
+ version "0.9.4"
+ resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz"
+ integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==
+ dependencies:
+ deep-is "^0.1.3"
+ fast-levenshtein "^2.0.6"
+ levn "^0.4.1"
+ prelude-ls "^1.2.1"
+ type-check "^0.4.0"
+ word-wrap "^1.2.5"
+
+p-limit@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz"
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ dependencies:
+ p-limit "^3.0.2"
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+picocolors@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz"
+ integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
+
+"picomatch@^3 || ^4", picomatch@^4.0.4:
+ version "4.0.4"
+ resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz"
+ integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==
+
+postcss@^8.5.10:
+ version "8.5.12"
+ resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.12.tgz"
+ integrity sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==
+ dependencies:
+ nanoid "^3.3.11"
+ picocolors "^1.1.1"
+ source-map-js "^1.2.1"
+
+prelude-ls@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz"
+ integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+
+prettier-linter-helpers@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz"
+ integrity sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==
+ dependencies:
+ fast-diff "^1.1.2"
+
+prettier@^3.8.3, prettier@>=3.0.0:
+ version "3.8.3"
+ resolved "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz"
+ integrity sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==
+
+punycode@^2.1.0:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz"
+ integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
+
+"react-dom@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom@^17 || ^18 || ^19", "react-dom@^18.0.0 || ^19.0.0", react-dom@^19.2.5, react-dom@>=16, react-dom@>=16.8.0:
+ version "19.2.5"
+ resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz"
+ integrity sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==
+ dependencies:
+ scheduler "^0.27.0"
+
+react-hot-toast@^2.6.0:
+ version "2.6.0"
+ resolved "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.6.0.tgz"
+ integrity sha512-bH+2EBMZ4sdyou/DPrfgIouFpcRLCJ+HoCA32UoAYHn6T3Ur5yfcDCeSr5mwldl6pFOsiocmrXMuoCJ1vV8bWg==
+ dependencies:
+ csstype "^3.1.3"
+ goober "^2.1.16"
+
+react-remove-scroll-bar@^2.3.7:
+ version "2.3.8"
+ resolved "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz"
+ integrity sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==
+ dependencies:
+ react-style-singleton "^2.2.2"
+ tslib "^2.0.0"
+
+react-remove-scroll@^2.6.3:
+ version "2.7.2"
+ resolved "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz"
+ integrity sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==
+ dependencies:
+ react-remove-scroll-bar "^2.3.7"
+ react-style-singleton "^2.2.3"
+ tslib "^2.1.0"
+ use-callback-ref "^1.3.3"
+ use-sidecar "^1.1.3"
+
+react-style-singleton@^2.2.2, react-style-singleton@^2.2.3:
+ version "2.2.3"
+ resolved "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz"
+ integrity sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==
+ dependencies:
+ get-nonce "^1.0.0"
+ tslib "^2.0.0"
+
+"react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^17 || ^18 || ^19", "react@^18 || ^19", "react@^18.0.0 || ^19.0.0", react@^19.2.5, react@>=16, react@>=16.8.0:
+ version "19.2.5"
+ resolved "https://registry.npmjs.org/react/-/react-19.2.5.tgz"
+ integrity sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==
+
+reselect@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz"
+ integrity sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==
+
+rolldown@1.0.0-rc.17:
+ version "1.0.0-rc.17"
+ resolved "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.17.tgz"
+ integrity sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==
+ dependencies:
+ "@oxc-project/types" "=0.127.0"
+ "@rolldown/pluginutils" "1.0.0-rc.17"
+ optionalDependencies:
+ "@rolldown/binding-android-arm64" "1.0.0-rc.17"
+ "@rolldown/binding-darwin-arm64" "1.0.0-rc.17"
+ "@rolldown/binding-darwin-x64" "1.0.0-rc.17"
+ "@rolldown/binding-freebsd-x64" "1.0.0-rc.17"
+ "@rolldown/binding-linux-arm-gnueabihf" "1.0.0-rc.17"
+ "@rolldown/binding-linux-arm64-gnu" "1.0.0-rc.17"
+ "@rolldown/binding-linux-arm64-musl" "1.0.0-rc.17"
+ "@rolldown/binding-linux-ppc64-gnu" "1.0.0-rc.17"
+ "@rolldown/binding-linux-s390x-gnu" "1.0.0-rc.17"
+ "@rolldown/binding-linux-x64-gnu" "1.0.0-rc.17"
+ "@rolldown/binding-linux-x64-musl" "1.0.0-rc.17"
+ "@rolldown/binding-openharmony-arm64" "1.0.0-rc.17"
+ "@rolldown/binding-wasm32-wasi" "1.0.0-rc.17"
+ "@rolldown/binding-win32-arm64-msvc" "1.0.0-rc.17"
+ "@rolldown/binding-win32-x64-msvc" "1.0.0-rc.17"
+
+scheduler@^0.27.0:
+ version "0.27.0"
+ resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz"
+ integrity sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==
+
+semver@^6.3.1:
+ version "6.3.1"
+ resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
+semver@^7.7.3:
+ version "7.7.4"
+ resolved "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz"
+ integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+source-map-js@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz"
+ integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
+
+synckit@^0.11.12:
+ version "0.11.12"
+ resolved "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz"
+ integrity sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==
+ dependencies:
+ "@pkgr/core" "^0.2.9"
+
+tailwind-merge@^3.5.0:
+ version "3.5.0"
+ resolved "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.5.0.tgz"
+ integrity sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==
+
+tailwindcss@^4.2.4, tailwindcss@4.2.4:
+ version "4.2.4"
+ resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.4.tgz"
+ integrity sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA==
+
+tapable@^2.3.3:
+ version "2.3.3"
+ resolved "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz"
+ integrity sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==
+
+tinyglobby@^0.2.15, tinyglobby@^0.2.16:
+ version "0.2.16"
+ resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz"
+ integrity sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==
+ dependencies:
+ fdir "^6.5.0"
+ picomatch "^4.0.4"
+
+ts-api-utils@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz"
+ integrity sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==
+
+tslib@^2.0.0, tslib@^2.1.0, tslib@^2.4.0:
+ version "2.8.1"
+ resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz"
+ integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
+
+type-check@^0.4.0, type-check@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz"
+ integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+ dependencies:
+ prelude-ls "^1.2.1"
+
+typescript-eslint@^8.58.2:
+ version "8.59.0"
+ resolved "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.0.tgz"
+ integrity sha512-BU3ONW9X+v90EcCH9ZS6LMackcVtxRLlI3XrYyqZIwVSHIk7Qf7bFw1z0M9Q0IUxhTMZCf8piY9hTYaNEIASrw==
+ dependencies:
+ "@typescript-eslint/eslint-plugin" "8.59.0"
+ "@typescript-eslint/parser" "8.59.0"
+ "@typescript-eslint/typescript-estree" "8.59.0"
+ "@typescript-eslint/utils" "8.59.0"
+
+typescript@>=4.8.4, "typescript@>=4.8.4 <6.1.0", typescript@~6.0.2:
+ version "6.0.3"
+ resolved "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz"
+ integrity sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==
+
+undici-types@~7.16.0:
+ version "7.16.0"
+ resolved "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz"
+ integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==
+
+update-browserslist-db@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz"
+ integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==
+ dependencies:
+ escalade "^3.2.0"
+ picocolors "^1.1.1"
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+use-callback-ref@^1.3.3:
+ version "1.3.3"
+ resolved "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz"
+ integrity sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==
+ dependencies:
+ tslib "^2.0.0"
+
+use-sidecar@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz"
+ integrity sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==
+ dependencies:
+ detect-node-es "^1.1.0"
+ tslib "^2.0.0"
+
+use-sync-external-store@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz"
+ integrity sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==
+
+"vite@^5.2.0 || ^6 || ^7 || ^8", vite@^8.0.0, vite@^8.0.10:
+ version "8.0.10"
+ resolved "https://registry.npmjs.org/vite/-/vite-8.0.10.tgz"
+ integrity sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==
+ dependencies:
+ lightningcss "^1.32.0"
+ picomatch "^4.0.4"
+ postcss "^8.5.10"
+ rolldown "1.0.0-rc.17"
+ tinyglobby "^0.2.16"
+ optionalDependencies:
+ fsevents "~2.3.3"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+word-wrap@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz"
+ integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
+
+yallist@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
+
+"zod-validation-error@^3.5.0 || ^4.0.0":
+ version "4.0.2"
+ resolved "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz"
+ integrity sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==
+
+"zod@^3.25.0 || ^4.0.0":
+ version "4.3.6"
+ resolved "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz"
+ integrity sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==
diff --git a/src/problem2/index.html b/src/problem2/index.html
deleted file mode 100644
index 4058a68bff..0000000000
--- a/src/problem2/index.html
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
- Fancy Form
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/problem2/script.js b/src/problem2/script.js
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/src/problem2/style.css b/src/problem2/style.css
deleted file mode 100644
index 915af91c72..0000000000
--- a/src/problem2/style.css
+++ /dev/null
@@ -1,8 +0,0 @@
-body {
- display: flex;
- flex-direction: row;
- align-items: center;
- justify-content: center;
- min-width: 360px;
- font-family: Arial, Helvetica, sans-serif;
-}
diff --git a/src/problem3/p3.md b/src/problem3/p3.md
new file mode 100644
index 0000000000..e03af7db13
--- /dev/null
+++ b/src/problem3/p3.md
@@ -0,0 +1,255 @@
+
+// Issue 1: Missing `blockchain` property in `WalletBalance`
+// The original interface doesn't declare `blockchain`, yet it's
+// used throughout the component (e.g. getPriority(balance.blockchain)).
+// This causes a TypeScript compile error.
+
+
+// --- Original (bad) ---
+// interface WalletBalance {
+// currency: string;
+// amount: number;
+// }
+
+// --- Fixed: add the missing `blockchain` field ---
+interface WalletBalance {
+ currency: string;
+ amount: number;
+ blockchain: string;
+}
+
+
+// Issue 2: `FormattedWalletBalance` duplicates every field
+// instead of extending `WalletBalance`
+// If we ever add a new field to WalletBalance we'd have to
+// remember to duplicate it here too — a maintenance trap.
+
+
+// --- Original (bad) ---
+// interface FormattedWalletBalance {
+// currency: string;
+// amount: number;
+// formatted: string;
+// }
+
+// --- Fixed: extend WalletBalance so it stays in sync automatically ---
+interface FormattedWalletBalance extends WalletBalance {
+ formatted: string;
+}
+
+
+// Issue 3: Empty Props interface adds nothing
+// `interface Props extends BoxProps {}` is an unnecessary wrapper.
+// Just use BoxProps directly — it's simpler and communicates
+// intent more clearly.
+
+
+// --- Original (bad) ---
+// interface Props extends BoxProps {
+//
+// }
+
+// --- Fixed: use BoxProps directly (see component signature below) ---
+
+
+// Issue 4: `getPriority` is defined INSIDE the component
+// It doesn't read any props or state, so it gets needlessly
+// re-created as a new function object on every single render.
+// Moving it outside (or turning it into a lookup map) removes
+// that overhead and also means we don't need it in any
+// dependency array.
+//
+// Issue 5: `blockchain: any` defeats TypeScript
+// Using `any` throws away all type-safety. A string union (or
+// at minimum `string`) is far better.
+
+
+// --- Original (bad) ---
+// const getPriority = (blockchain: any): number => {
+// switch (blockchain) {
+// case 'Osmosis':
+// return 100
+// case 'Ethereum':
+// return 50
+// case 'Arbitrum':
+// return 30
+// case 'Zilliqa':
+// return 20
+// case 'Neo':
+// return 20
+// default:
+// return -99
+// }
+// }
+
+// --- Fixed: moved outside component, replaced `any` with a
+// Record lookup which is O(1) and fully typed ---
+const BLOCKCHAIN_PRIORITY: Record = {
+ Osmosis: 100,
+ Ethereum: 50,
+ Arbitrum: 30,
+ Zilliqa: 20,
+ Neo: 20,
+};
+
+const getPriority = (blockchain: string): number =>
+ BLOCKCHAIN_PRIORITY[blockchain] ?? -99;
+
+const WalletPage: React.FC = (props: BoxProps) => {
+
+ // Issue 6: `children` is destructured but never used
+ // Extracting it for no reason is confusing, and it silently
+ // prevents children from being forwarded to the rendered .
+
+
+ // --- Original (bad) ---
+ // const { children, ...rest } = props;
+
+ // --- Fixed: just spread rest; don't destructure unused vars ---
+ const { ...rest } = props;
+
+ const balances = useWalletBalances();
+ const prices = usePrices();
+
+
+ // Issue 7 (BUG): `lhsPriority` is a reference error
+ // Line 39 uses `lhsPriority` but the variable on line 38 is
+ // named `balancePriority`. This would crash at runtime with
+ // "ReferenceError: lhsPriority is not defined".
+ //
+ // Issue 8 (BUG): filter logic is inverted
+ // The condition `balance.amount <= 0` keeps wallets that are
+ // EMPTY or NEGATIVE. The clear intent is to show wallets
+ // that actually HAVE a balance (amount > 0).
+ //
+ // Issue 9: sort comparator returns `undefined` when equal
+ // When `leftPriority === rightPriority` neither branch runs,
+ // so the comparator returns `undefined` instead of `0`.
+ // Per the spec this produces implementation-defined order —
+ // a subtle, hard-to-debug inconsistency.
+ //
+ // Issue 10: `prices` is in the dependency array but not used
+ // inside the useMemo callback. Every time prices update the
+ // memo is invalidated and the whole filter+sort runs again
+ // for nothing — a wasted re-computation.
+ //
+ // Issue 11: `getPriority` (when inside component) is also a
+ // missing dependency — its reference changes every render,
+ // making the memo unreliable. Moving it outside (done above)
+ // solves this entirely.
+
+
+ // --- Original (bad) ---
+ // const sortedBalances = useMemo(() => {
+ // return balances.filter((balance: WalletBalance) => {
+ // const balancePriority = getPriority(balance.blockchain);
+ // if (lhsPriority > -99) { // undefined variable
+ // if (balance.amount <= 0) { // inverted logic
+ // return true;
+ // }
+ // }
+ // return false
+ // }).sort((lhs: WalletBalance, rhs: WalletBalance) => {
+ // const leftPriority = getPriority(lhs.blockchain);
+ // const rightPriority = getPriority(rhs.blockchain);
+ // if (leftPriority > rightPriority) {
+ // return -1;
+ // } else if (rightPriority > leftPriority) {
+ // return 1;
+ // }
+ // // missing return 0
+ // });
+ // }, [balances, prices]); // prices is unused, getPriority missing
+
+ // --- Fixed: correct variable name, correct filter logic,
+ // return 0 for equal, only `balances` in deps ---
+ const sortedBalances = useMemo(() => {
+ return balances
+ .filter((balance: WalletBalance) => {
+ const priority = getPriority(balance.blockchain);
+ // Keep only recognized blockchains (priority > -99) that
+ // actually hold a positive balance.
+ return priority > -99 && balance.amount > 0;
+ })
+ .sort((lhs: WalletBalance, rhs: WalletBalance) => {
+ return getPriority(rhs.blockchain) - getPriority(lhs.blockchain);
+ });
+ }, [balances]);
+
+
+ // Issue 12 (BUG): `formattedBalances` is computed but the
+ // `rows` mapping below iterates over `sortedBalances` instead,
+ // so the formatted data is thrown away and `balance.formatted`
+ // is always `undefined` in the JSX.
+ //
+ // Issue 13: `formattedBalances` is not memoized
+ // It's re-derived every render even when `sortedBalances`
+ // hasn't changed. We should either merge it into the existing
+ // useMemo or wrap it in its own.
+
+
+ // --- Original (bad) ---
+ // const formattedBalances = sortedBalances.map((balance: WalletBalance) => {
+ // return {
+ // ...balance,
+ // formatted: balance.amount.toFixed()
+ // }
+ // })
+
+ // --- Fixed: memoize, and we'll actually USE this below ---
+ const formattedBalances: FormattedWalletBalance[] = useMemo(() => {
+ return sortedBalances.map((balance) => ({
+ ...balance,
+ formatted: balance.amount.toFixed(2),
+ }));
+ }, [sortedBalances]);
+
+
+ // Issue 14 (BUG): `rows` maps over `sortedBalances` (WalletBalance[])
+ // but annotates each item as `FormattedWalletBalance`.
+ // This is a type lie — `balance.formatted` doesn't exist on
+ // `WalletBalance`, so `formattedAmount` is always undefined.
+ //
+ // Issue 15: Using array index as React `key`
+ // If the list is re-ordered, React can't tell which item is
+ // which and may incorrectly reuse DOM nodes, causing visual
+ // glitches or stale state. Use a unique stable id like
+ // `currency` instead.
+ //
+ // Issue 16: `classes.row` is never defined
+ // `classes` doesn't exist anywhere in scope. This would crash
+ // at runtime. Either import a stylesheet, use CSS modules, or
+ // use a plain className string.
+
+
+ // --- Original (bad) ---
+ // const rows = sortedBalances.map((balance: FormattedWalletBalance, index: number) => {
+ // const usdValue = prices[balance.currency] * balance.amount;
+ // return (
+ //
+ // )
+ // })
+
+ // --- Fixed: map formattedBalances, use currency as key,
+ // use a real className string ---
+ const rows = formattedBalances.map((balance: FormattedWalletBalance) => {
+ const usdValue = prices[balance.currency] * balance.amount;
+ return (
+
+ );
+ });
+
+ return
{rows}
;
+};