diff --git a/move202503/AKAKing23/README.md b/move202503/AKAKing23/README.md new file mode 100644 index 00000000..d55f974a --- /dev/null +++ b/move202503/AKAKing23/README.md @@ -0,0 +1,38 @@ +## project +- 项目名称:LearnChain-X +> 描述: +自适应学习引擎:基于深度强化学习的 AI 题库系统,通过用户画像与知识图谱动态生成个性化习题流(初级 → 专家级),突破传统教育"千人一面"的局限 +链上能力认证:采用 SUI 链零知识证明框架,将学习轨迹实时转化为两类链上凭证: +技能通证(Skill Token):基于答题表现的激励型代币 +成就徽章(Achievement SBT):不可转让的能力证明凭证 +隐私计算验证层:集成 zk-SNARKs 验证协议,支持企业/机构通过零知识证明快速核验凭证有效性,实现数据可用不可见 +【产品价值】 +• 学习者:获得动态适配的个性化学习路径与去中心化能力护照 +• 教育机构:构建防篡改的能力评估体系,降低认证成本 +• 企业用户:通过轻量化验证模块快速筛选人才,规避数据隐私风险 + +【技术亮点】 +▷ SUI 链原生集成:利用 SUI 的高吞吐特性支持高频答题上链 +▷ AI 动态出题系统:基于 Transformer 架构的题目生成模型 +▷ 隐私计算方案:采用 zk-STARKs 扩容技术实现秒级凭证验证 +▷ 双代币经济模型:通证激励与 SBT 凭证的协同激励机制 + + +## Member +- Haynes github: https://github.com/AKAking23 +> 自我介绍&技术栈: +前端开发者 & 区块链技术探索者 🌐⚡ +一名全栈倾向的前端开发者,拥有 5年(根据实际情况修改)前端工程经验,擅长通过技术将创意转化为高性能、高可用的Web应用。同时深耕区块链领域,致力于将前端交互与智能合约深度结合,探索Web3.0的创新可能。 + +技术栈: +▸ 前端框架:Vue2/3、React + +▸ 开发语言:TypeScript、JavaScript(ES6+) + +▸ 区块链开发:Solidity(ERC20/ERC721/DeFi协议)、Move语言(Aptos/Sui智能合约开发) + +▸ 工具链:Web3.js、Ethers.js、Hardhat、Truffle、Remix + +▸ 附加技能:Node.js基础、DApp前后端联调、TDD开发模式 + + diff --git a/move202503/AKAKing23/code/README.md b/move202503/AKAKing23/code/README.md new file mode 100644 index 00000000..8f20cda9 --- /dev/null +++ b/move202503/AKAKing23/code/README.md @@ -0,0 +1,25 @@ +# LearnChain-X + +LearnChain X 是首个基于 AI 生成题目引擎 与 灵魂绑定积分链 的防作弊学习平台,让每一次知识积累都化作不可篡改的数字资产。 +LearnChain-X:基于 SUI 链的 AI 驱动知识凭证化平台 + +【项目概述】 +LearnChain-X 是构建于 SUI 链的创新型区块链教育项目,通过链上行为认证与人工智能技术的深度融合,打造动态化能力评估体系。平台创新采用"AI 自适应学习+区块链凭证"双引擎架构,实现传统教育范式的突破。 + +【核心技术架构】 + +自适应学习引擎:基于深度强化学习的 AI 题库系统,通过用户画像与知识图谱动态生成个性化习题流(初级 → 专家级),突破传统教育"千人一面"的局限 +链上能力认证:采用 SUI 链零知识证明框架,将学习轨迹实时转化为两类链上凭证: +技能通证(Skill Token):基于答题表现的激励型代币 +成就徽章(Achievement SBT):不可转让的能力证明凭证 +隐私计算验证层:集成 zk-SNARKs 验证协议,支持企业/机构通过零知识证明快速核验凭证有效性,实现数据可用不可见 +【产品价值】 +• 学习者:获得动态适配的个性化学习路径与去中心化能力护照 +• 教育机构:构建防篡改的能力评估体系,降低认证成本 +• 企业用户:通过轻量化验证模块快速筛选人才,规避数据隐私风险 + +【技术亮点】 +▷ SUI 链原生集成:利用 SUI 的高吞吐特性支持高频答题上链 +▷ AI 动态出题系统:基于 Transformer 架构的题目生成模型 +▷ 隐私计算方案:采用 zk-SNARKs 扩容技术实现凭证验证 +▷ 双代币经济模型:通证激励与 SBT 凭证的协同激励机制 diff --git a/move202503/AKAKing23/code/chain_back/.gitignore b/move202503/AKAKing23/code/chain_back/.gitignore new file mode 100644 index 00000000..a547bf36 --- /dev/null +++ b/move202503/AKAKing23/code/chain_back/.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/move202503/AKAKing23/code/chain_back/index.ts b/move202503/AKAKing23/code/chain_back/index.ts new file mode 100644 index 00000000..da5cfc6d --- /dev/null +++ b/move202503/AKAKing23/code/chain_back/index.ts @@ -0,0 +1,37 @@ +import Koa from 'koa'; +import bodyParser from 'koa-bodyparser'; +import session from 'koa-session'; +import router from './routes'; + +const app = new Koa(); +const PORT = process.env.PORT || 3001; + +// 配置session +app.keys = ['some secret hurr']; // cookie签名密钥,应该在实际项目中使用环境变量 +const SESSION_CONFIG = { + key: 'koa:sess', // cookie key + maxAge: 86400000, // cookie的过期时间,毫秒,默认是1天 + autoCommit: true, // 自动提交到响应头 + overwrite: true, // 是否可以重写 + httpOnly: true, // 是否只有服务器端可以访问 + signed: true, // 签名 + rolling: false, // 每次响应时刷新过期时间 + renew: false, // 快过期时刷新 +}; + +// 中间件 +app.use(session(SESSION_CONFIG, app)); +app.use(bodyParser()); + +// 路由 +app.use(router.routes()); +app.use(router.allowedMethods()); + +// 错误处理 +app.on('error', (err, ctx) => { + console.error('server error', err, ctx); +}); + +app.listen(PORT, () => { + console.log(`服务器已启动,监听端口 ${PORT}`); +}); diff --git a/move202503/AKAKing23/code/chain_back/package-lock.json b/move202503/AKAKing23/code/chain_back/package-lock.json new file mode 100644 index 00000000..f48aa04d --- /dev/null +++ b/move202503/AKAKing23/code/chain_back/package-lock.json @@ -0,0 +1,2344 @@ +{ + "name": "chain-back", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "chain-back", + "version": "1.0.0", + "dependencies": { + "@coze/api": "^1.2.0", + "@koa/cors": "^5.0.0", + "@types/koa-session": "^6.4.5", + "koa": "^2.14.2", + "koa-bodyparser": "^4.4.1", + "koa-router": "^12.0.1", + "koa-session": "^7.0.2" + }, + "devDependencies": { + "@types/koa": "^2.13.8", + "@types/koa__cors": "^5.0.0", + "@types/koa-bodyparser": "^4.3.10", + "@types/koa-router": "^7.4.5", + "@types/node": "^20.6.0", + "nodemon": "^3.0.1", + "ts-node": "^10.9.1", + "typescript": "^5.2.2" + } + }, + "node_modules/@agora-js/media": { + "version": "4.23.2", + "resolved": "https://registry.npmmirror.com/@agora-js/media/-/media-4.23.2.tgz", + "integrity": "sha512-mWbl/ZjAw4tT22Ks0O2CJLMX3ht4uKPsDm2+fb5XOalrUVNzJOtwJA4E36d/o4ZfVtvwiJAOYtuTpoib8LlLgQ==", + "license": "MIT", + "dependencies": { + "@agora-js/report": "4.23.2", + "@agora-js/shared": "4.23.2", + "agora-rte-extension": "^1.2.4", + "axios": "1.7.9", + "webrtc-adapter": "8.2.0" + } + }, + "node_modules/@agora-js/media/node_modules/axios": { + "version": "1.7.9", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/@agora-js/report": { + "version": "4.23.2", + "resolved": "https://registry.npmmirror.com/@agora-js/report/-/report-4.23.2.tgz", + "integrity": "sha512-enHyWN5uF0RuS1crlHUlTfBZ7yy3n2zvSqt2odvsz4S1DZ0DlYQoCHFbr5CBOhN+Zb3bLEWxY3ej/2kUMqCQBA==", + "license": "MIT", + "dependencies": { + "@agora-js/shared": "4.23.2", + "axios": "1.7.9" + } + }, + "node_modules/@agora-js/report/node_modules/axios": { + "version": "1.7.9", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/@agora-js/shared": { + "version": "4.23.2", + "resolved": "https://registry.npmmirror.com/@agora-js/shared/-/shared-4.23.2.tgz", + "integrity": "sha512-DaeqskGUWero8SeqU0QeYEfJu4OcPIIltiQ0PRyMbyVa4HL7vCzr6gRZkef9sFMVyJPNe0QXL7gdX132kA2uhg==", + "license": "MIT", + "dependencies": { + "axios": "1.7.9", + "ua-parser-js": "^0.7.34" + } + }, + "node_modules/@agora-js/shared/node_modules/axios": { + "version": "1.7.9", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/@coze/api": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/@coze/api/-/api-1.2.0.tgz", + "integrity": "sha512-nmtgV6HC9+z/FRclXvBOM3JyE1S4BHA8bc1+wkraIdDJ3AA2to55nQNSqbNlHiO/3OcxfBTVjwlhAtL0DcguRA==", + "license": "MIT", + "dependencies": { + "agora-extension-ai-denoiser": "^1.0.0", + "agora-rtc-sdk-ng": "^4.23.2", + "agora-rte-extension": "^1.2.4", + "jsonwebtoken": "^9.0.2", + "node-fetch": "^2.x", + "reconnecting-websocket": "^4.4.0", + "uuid": "^10.0.0", + "ws": "^8.11.0" + }, + "peerDependencies": { + "axios": "^1.7.1" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@hapi/bourne": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/@hapi/bourne/-/bourne-3.0.0.tgz", + "integrity": "sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==", + "license": "BSD-3-Clause" + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@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.0", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@koa/cors": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/@koa/cors/-/cors-5.0.0.tgz", + "integrity": "sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==", + "license": "MIT", + "dependencies": { + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmmirror.com/@types/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmmirror.com/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmmirror.com/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/content-disposition": { + "version": "0.5.8", + "resolved": "https://registry.npmmirror.com/@types/content-disposition/-/content-disposition-0.5.8.tgz", + "integrity": "sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==", + "license": "MIT" + }, + "node_modules/@types/cookies": { + "version": "0.9.0", + "resolved": "https://registry.npmmirror.com/@types/cookies/-/cookies-0.9.0.tgz", + "integrity": "sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/express": "*", + "@types/keygrip": "*", + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/@types/express/-/express-5.0.1.tgz", + "integrity": "sha512-UZUw8vjpWFXuDnjFTh7/5c2TWDlQqeXHi6hcN7F2XSVT5P+WmUnnbFS3KA6Jnc6IsEqI2qCVu2bK0R0J4A8ZQQ==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.6", + "resolved": "https://registry.npmmirror.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-assert": { + "version": "1.5.6", + "resolved": "https://registry.npmmirror.com/@types/http-assert/-/http-assert-1.5.6.tgz", + "integrity": "sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw==", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "license": "MIT" + }, + "node_modules/@types/keygrip": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/@types/keygrip/-/keygrip-1.0.6.tgz", + "integrity": "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==", + "license": "MIT" + }, + "node_modules/@types/koa": { + "version": "2.15.0", + "resolved": "https://registry.npmmirror.com/@types/koa/-/koa-2.15.0.tgz", + "integrity": "sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==", + "license": "MIT", + "dependencies": { + "@types/accepts": "*", + "@types/content-disposition": "*", + "@types/cookies": "*", + "@types/http-assert": "*", + "@types/http-errors": "*", + "@types/keygrip": "*", + "@types/koa-compose": "*", + "@types/node": "*" + } + }, + "node_modules/@types/koa__cors": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/@types/koa__cors/-/koa__cors-5.0.0.tgz", + "integrity": "sha512-LCk/n25Obq5qlernGOK/2LUwa/2YJb2lxHUkkvYFDOpLXlVI6tKcdfCHRBQnOY4LwH6el5WOLs6PD/a8Uzau6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/koa": "*" + } + }, + "node_modules/@types/koa-bodyparser": { + "version": "4.3.12", + "resolved": "https://registry.npmmirror.com/@types/koa-bodyparser/-/koa-bodyparser-4.3.12.tgz", + "integrity": "sha512-hKMmRMVP889gPIdLZmmtou/BijaU1tHPyMNmcK7FAHAdATnRcGQQy78EqTTxLH1D4FTsrxIzklAQCso9oGoebQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/koa": "*" + } + }, + "node_modules/@types/koa-compose": { + "version": "3.2.8", + "resolved": "https://registry.npmmirror.com/@types/koa-compose/-/koa-compose-3.2.8.tgz", + "integrity": "sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==", + "license": "MIT", + "dependencies": { + "@types/koa": "*" + } + }, + "node_modules/@types/koa-router": { + "version": "7.4.8", + "resolved": "https://registry.npmmirror.com/@types/koa-router/-/koa-router-7.4.8.tgz", + "integrity": "sha512-SkWlv4F9f+l3WqYNQHnWjYnyTxYthqt8W9az2RTdQW7Ay8bc00iRZcrb8MC75iEfPqnGcg2csEl8tTG1NQPD4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/koa": "*" + } + }, + "node_modules/@types/koa-session": { + "version": "6.4.5", + "resolved": "https://registry.npmmirror.com/@types/koa-session/-/koa-session-6.4.5.tgz", + "integrity": "sha512-Vc6+fslnPuMH2v9y80WYeo39UMo8mweuNNthKCwYU2ZE6l5vnRrzRU3BRvexKwsoI5sxsRl5CxDsBlLI8kY/XA==", + "license": "MIT", + "dependencies": { + "@types/cookies": "*", + "@types/koa": "*" + } + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmmirror.com/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.17.30", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.17.30.tgz", + "integrity": "sha512-7zf4YyHA+jvBNfVrk2Gtvs6x7E8V+YDW05bNfG2XkWDJfYRXrTiP/DsB2zSYTaHX0bGIujTBQdMVAhb+j7mwpg==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/qs": { + "version": "6.9.18", + "resolved": "https://registry.npmmirror.com/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmmirror.com/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmmirror.com/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agora-extension-ai-denoiser": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/agora-extension-ai-denoiser/-/agora-extension-ai-denoiser-1.1.0.tgz", + "integrity": "sha512-g4klzzz7IQblNt0c+gJ/DM7sa5oMZ/7GWE4c9aqs3snHRAo+CjDieT84iAc1KUhAiY84RrfhyFdtpvbbEoYBcA==", + "license": "MIT", + "peerDependencies": { + "agora-rtc-sdk-ng": ">=4.15.0" + } + }, + "node_modules/agora-rtc-sdk-ng": { + "version": "4.23.2", + "resolved": "https://registry.npmmirror.com/agora-rtc-sdk-ng/-/agora-rtc-sdk-ng-4.23.2.tgz", + "integrity": "sha512-uZcJVJ0g4PJfCqnlcP9kFU6y/2n9uIlRSljRFnK2FNLHo8nlB8Vc0pf5Gs4n75PmThC4u1G2FvL4k7iFau6boQ==", + "license": "MIT", + "dependencies": { + "@agora-js/media": "4.23.2", + "@agora-js/report": "4.23.2", + "@agora-js/shared": "4.23.2", + "agora-rte-extension": "^1.2.4", + "axios": "1.7.9", + "formdata-polyfill": "^4.0.7", + "pako": "^2.1.0", + "ua-parser-js": "^0.7.34", + "webrtc-adapter": "8.2.0" + } + }, + "node_modules/agora-rtc-sdk-ng/node_modules/axios": { + "version": "1.7.9", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/agora-rte-extension": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/agora-rte-extension/-/agora-rte-extension-1.2.4.tgz", + "integrity": "sha512-0ovZz1lbe30QraG1cU+ji7EnQ8aUu+Hf3F+a8xPml3wPOyUQEK6CTdxV9kMecr9t+fIDrGeW7wgJTsM1DQE7Nw==", + "license": "ISC" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.8.4", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "license": "MIT", + "peer": true, + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cache-content-type": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/cache-content-type/-/cache-content-type-1.0.1.tgz", + "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", + "license": "MIT", + "dependencies": { + "mime-types": "^2.1.18", + "ylru": "^1.2.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmmirror.com/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/co-body": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/co-body/-/co-body-6.2.0.tgz", + "integrity": "sha512-Kbpv2Yd1NdL1V/V4cwLVxraHDV6K8ayohr2rmH0J87Er8+zJjcTa6dAn9QMPC9CRgU8+aNajKbSf1TzDB1yKPA==", + "license": "MIT", + "dependencies": { + "@hapi/bourne": "^3.0.0", + "inflation": "^2.0.0", + "qs": "^6.5.2", + "raw-body": "^2.3.3", + "type-is": "^1.6.16" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookies": { + "version": "0.9.1", + "resolved": "https://registry.npmmirror.com/cookies/-/cookies-0.9.1.tgz", + "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/copy-to": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/copy-to/-/copy-to-2.0.1.tgz", + "integrity": "sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==", + "license": "MIT" + }, + "node_modules/crc": { + "version": "3.8.0", + "resolved": "https://registry.npmmirror.com/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "license": "MIT", + "dependencies": { + "buffer": "^5.1.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmmirror.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-assert": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/http-assert/-/http-assert-1.5.0.tgz", + "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", + "license": "MIT", + "dependencies": { + "deep-equal": "~1.0.1", + "http-errors": "~1.8.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true, + "license": "ISC" + }, + "node_modules/inflation": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/inflation/-/inflation-2.1.0.tgz", + "integrity": "sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/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/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-type-of": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/is-type-of/-/is-type-of-2.2.0.tgz", + "integrity": "sha512-72axShMJMnMy5HSU/jLGNOonZD5rWM0MwJSCYpKCTQCbggQZBJO/CLMMVP5HgS8kPSYFBkTysJexsD6NMvGKDQ==", + "license": "MIT" + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmmirror.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "license": "MIT", + "dependencies": { + "tsscmp": "1.0.6" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa": { + "version": "2.16.1", + "resolved": "https://registry.npmmirror.com/koa/-/koa-2.16.1.tgz", + "integrity": "sha512-umfX9d3iuSxTQP4pnzLOz0HKnPg0FaUUIKcye2lOiz3KPu1Y3M3xlz76dISdFPQs37P9eJz1wUpcTS6KDPn9fA==", + "license": "MIT", + "dependencies": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.9.0", + "debug": "^4.3.2", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^2.0.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + }, + "engines": { + "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" + } + }, + "node_modules/koa-bodyparser": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/koa-bodyparser/-/koa-bodyparser-4.4.1.tgz", + "integrity": "sha512-kBH3IYPMb+iAXnrxIhXnW+gXV8OTzCu8VPDqvcDHW9SQrbkHmqPQtiZwrltNmSq6/lpipHnT7k7PsjlVD7kK0w==", + "license": "MIT", + "dependencies": { + "co-body": "^6.0.0", + "copy-to": "^2.0.1", + "type-is": "^1.6.18" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/koa-compose": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", + "license": "MIT" + }, + "node_modules/koa-convert": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/koa-convert/-/koa-convert-2.0.0.tgz", + "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", + "license": "MIT", + "dependencies": { + "co": "^4.6.0", + "koa-compose": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/koa-router": { + "version": "12.0.1", + "resolved": "https://registry.npmmirror.com/koa-router/-/koa-router-12.0.1.tgz", + "integrity": "sha512-gaDdj3GtzoLoeosacd50kBBTnnh3B9AYxDThQUo4sfUyXdOhY6ku1qyZKW88tQCRgc3Sw6ChXYXWZwwgjOxE0w==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "http-errors": "^2.0.0", + "koa-compose": "^4.1.0", + "methods": "^1.1.2", + "path-to-regexp": "^6.2.1" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/koa-router/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/koa-router/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/koa-session": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/koa-session/-/koa-session-7.0.2.tgz", + "integrity": "sha512-nMWJndLmIuKQMTYPr5NokGQOGD2Aqal5GVi1xAhrQjrrzKq1ASy1WTFVkZ/xhwhtC4KpWi5KdqNYewZo7KJb4w==", + "license": "MIT", + "dependencies": { + "crc": "^3.8.0", + "is-type-of": "^2.2.0", + "zod": "^3.24.1" + }, + "engines": { + "node": ">= 18.19.0" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmmirror.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/nodemon": { + "version": "3.1.9", + "resolved": "https://registry.npmmirror.com/nodemon/-/nodemon-3.1.9.tgz", + "integrity": "sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/only": { + "version": "0.0.2", + "resolved": "https://registry.npmmirror.com/only/-/only-0.0.2.tgz", + "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==" + }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "license": "(MIT AND Zlib)" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "license": "MIT" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmmirror.com/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true, + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reconnecting-websocket": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/reconnecting-websocket/-/reconnecting-websocket-4.4.0.tgz", + "integrity": "sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng==", + "license": "MIT" + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sdp": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/sdp/-/sdp-3.2.0.tgz", + "integrity": "sha512-d7wDPgDV3DDiqulJjKiV2865wKsJ34YI+NDREbm+FySq6WuKOikwyNQcm+doLAZ1O6ltdO0SeKle2xMpN3Brgw==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "license": "MIT", + "engines": { + "node": ">=0.6.x" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.40", + "resolved": "https://registry.npmmirror.com/ua-parser-js/-/ua-parser-js-0.7.40.tgz", + "integrity": "sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "MIT", + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmmirror.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/webrtc-adapter": { + "version": "8.2.0", + "resolved": "https://registry.npmmirror.com/webrtc-adapter/-/webrtc-adapter-8.2.0.tgz", + "integrity": "sha512-umxCMgedPAVq4Pe/jl3xmelLXLn4XZWFEMR5Iipb5wJ+k1xMX0yC4ZY9CueZUU1MjapFxai1tFGE7R/kotH6Ww==", + "license": "BSD-3-Clause", + "dependencies": { + "sdp": "^3.0.2" + }, + "engines": { + "node": ">=6.0.0", + "npm": ">=3.10.0" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmmirror.com/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/ylru": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/ylru/-/ylru-1.4.0.tgz", + "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/zod": { + "version": "3.24.3", + "resolved": "https://registry.npmmirror.com/zod/-/zod-3.24.3.tgz", + "integrity": "sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/move202503/AKAKing23/code/chain_back/package.json b/move202503/AKAKing23/code/chain_back/package.json new file mode 100644 index 00000000..34b4fb8b --- /dev/null +++ b/move202503/AKAKing23/code/chain_back/package.json @@ -0,0 +1,30 @@ +{ + "name": "chain-back", + "version": "1.0.0", + "description": "Koa backend server for LearnChain-X", + "main": "index.ts", + "scripts": { + "start": "ts-node index.ts", + "dev": "nodemon --exec ts-node index.ts", + "build": "tsc" + }, + "dependencies": { + "@coze/api": "^1.2.0", + "@koa/cors": "^5.0.0", + "@types/koa-session": "^6.4.5", + "koa": "^2.14.2", + "koa-bodyparser": "^4.4.1", + "koa-router": "^12.0.1", + "koa-session": "^7.0.2" + }, + "devDependencies": { + "@types/koa": "^2.13.8", + "@types/koa__cors": "^5.0.0", + "@types/koa-bodyparser": "^4.3.10", + "@types/koa-router": "^7.4.5", + "@types/node": "^20.6.0", + "nodemon": "^3.0.1", + "ts-node": "^10.9.1", + "typescript": "^5.2.2" + } +} diff --git a/move202503/AKAKing23/code/chain_back/routes/index.ts b/move202503/AKAKing23/code/chain_back/routes/index.ts new file mode 100644 index 00000000..d11641af --- /dev/null +++ b/move202503/AKAKing23/code/chain_back/routes/index.ts @@ -0,0 +1,360 @@ +import Router from "koa-router"; +import { Context } from "koa"; +import { CozeAPI } from "@coze/api"; +import cors from "@koa/cors"; + +const router = new Router(); + +// 使用内存Map临时存储问题数据 +// 注意:这只适合开发环境,实际生产环境应该使用数据库或Redis +const questionsStore = new Map(); + +const base64EncodedString = + "cGF0X2RnUVRqSTRSNlR2T3ZHcHVLMkZ0NEQxT2dCOWg0YjVNVHRRZDZQckFPTndmZ2ljM3dEem9FUWVMR0JOb2VHQk4="; // "Hello world!" 的Base64编码 + +const decodedBuffer = Buffer.from(base64EncodedString, "base64"); +const decodedString = decodedBuffer.toString("utf-8"); + +const apiClient = new CozeAPI({ + token: decodedString, + baseURL: "https://api.coze.cn", +}); + +// 添加CORS中间件 +router.use( + cors({ + origin: "*", // 允许所有来源访问 + allowMethods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"], + allowHeaders: ["Content-Type", "Authorization", "Accept"], + credentials: true, + }) +); + +// 基本 GET 请求示例 +router.get("/", async (ctx: Context) => { + ctx.body = { + status: "success", + message: "欢迎使用 LearnChain-X API", + }; +}); + +// POST 接口示例 +router.post("/api/submit", async (ctx: Context) => { + try { + const data = ctx.request.body; + + // 这里可以添加数据验证逻辑 + if (!data) { + ctx.status = 400; + ctx.body = { + status: "error", + message: "请提供有效的数据", + }; + return; + } + + // 这里可以添加数据处理逻辑 + // 例如:保存到数据库、调用其他服务等 + + // 返回处理结果 + ctx.status = 200; + ctx.body = { + status: "success", + message: "数据提交成功", + data: data, + }; + } catch (error) { + ctx.status = 500; + ctx.body = { + status: "error", + message: "服务器内部错误", + error: error instanceof Error ? error.message : "未知错误", + }; + } +}); + +// Coze API调用封装成POST请求 +router.post("/api/coze", async (ctx: Context) => { + try { + const requestBody = ctx.request.body as any; + const input = requestBody?.input || ""; + const userId = requestBody?.userId || "default"; // 用于区分不同用户的会话 + + if (!input) { + ctx.status = 400; + ctx.body = { + status: "error", + message: "请提供输入内容", + }; + return; + } + + const res = await apiClient.workflows.runs.create({ + workflow_id: "7494156103493287945", + parameters: { + input: input, + }, + }); + + // 从响应中提取题目数据并格式化 + let formattedData; + try { + // 尝试解析返回的数据 + const rawData = res.data as any; + + // 如果返回的是字符串,直接尝试解析 + let jsonData; + if (typeof rawData === 'string') { + try { + jsonData = JSON.parse(rawData); + } catch (e) { + // 如果不是合法的JSON字符串,尝试从字符串中提取JSON + const jsonMatch = rawData.match(/```json([\s\S]*?)```/) || + rawData.match(/\[([\s\S]*?)\]/); + + if (jsonMatch) { + jsonData = JSON.parse(jsonMatch[1].trim()); + } else { + throw new Error("无法从字符串中提取JSON"); + } + } + } else if (rawData && typeof rawData === 'object') { + // 如果是对象,检查reply字段 + const reply = rawData.reply || ''; + const jsonMatch = reply ? (reply.match(/```json([\s\S]*?)```/) || + reply.match(/\[([\s\S]*?)\]/)) : null; + + if (jsonMatch) { + jsonData = JSON.parse(jsonMatch[1].trim()); + } else if (typeof rawData.output === 'string') { + // 有些情况下可能直接返回输出字符串 + try { + jsonData = JSON.parse(rawData.output); + } catch { + jsonData = rawData; + } + } else { + jsonData = rawData; + } + } else { + throw new Error("无法解析返回的数据"); + } + + // 处理解析后的数据 + const questionsWithAnswers = Array.isArray(jsonData) ? jsonData : + (jsonData.output && Array.isArray(jsonData.output) ? jsonData.output : []); + + // 存储问题数据到Map + questionsStore.set(userId, questionsWithAnswers); + + // 去除答案字段 + const questionsWithoutAnswers = questionsWithAnswers.map((q: any) => { + const { answer, ...questionWithoutAnswer } = q; + return questionWithoutAnswer; + }); + + formattedData = { + output: questionsWithoutAnswers + }; + } catch (error) { + console.error("格式化数据失败", error); + formattedData = { output: [] }; // 如果解析失败,返回空数组 + } + + ctx.status = 200; + ctx.body = { + status: "success", + message: "Coze API调用成功", + data: formattedData, + }; + } catch (error) { + ctx.status = 500; + ctx.body = { + status: "error", + message: "调用Coze API失败", + error: error instanceof Error ? error.message : "未知错误", + }; + } +}); + +// 添加验证答案的接口 +router.post("/api/verify-answer", async (ctx: Context) => { + try { + const requestBody = ctx.request.body as any; + const { questionIndex, selectedOption } = requestBody; + const userId = requestBody?.userId || "default"; // 用于获取对应用户的问题数据 + + // 获取之前存储的问题数据 + const questions = questionsStore.get(userId); + + if (!questions || !questions[questionIndex]) { + ctx.status = 400; + ctx.body = { + status: "error", + message: "问题不存在或会话已过期", + }; + return; + } + + const question = questions[questionIndex]; + + // 处理不同格式的答案 + let correctAnswer; + let correctOptionLetter = ""; + let isCorrect = false; + + if (question.answer !== undefined) { + correctAnswer = question.answer; + + // 如果答案是数字 + if (typeof correctAnswer === 'number') { + isCorrect = selectedOption === correctAnswer; + correctOptionLetter = String.fromCharCode(65 + correctAnswer); // 将数字转换为A,B,C,D + } + // 如果答案是以选项前缀开头的字符串,如"A. 正确答案",或"B. 选项内容" + else if (typeof correctAnswer === 'string') { + // 检查是否以字母前缀开头 (如 A. B. C. 等) + if (/^[A-D]\.?\s/.test(correctAnswer)) { + const letterIndex = correctAnswer.charCodeAt(0) - 65; // 'A' 的 ASCII 码是 65 + isCorrect = selectedOption === letterIndex; + correctOptionLetter = correctAnswer.charAt(0); + } + // 直接匹配选项内容 + else { + let foundIndex = -1; + for (let i = 0; i < question.options.length; i++) { + const optionContent = question.options[i].replace(/^[A-D]\.?\s/, ''); + if (optionContent.includes(correctAnswer) || correctAnswer.includes(optionContent)) { + foundIndex = i; + break; + } + } + + if (foundIndex !== -1) { + isCorrect = selectedOption === foundIndex; + correctOptionLetter = String.fromCharCode(65 + foundIndex); + } + } + } + } + + // 对所有ABCD字母答案进行通用处理 + if (typeof correctAnswer === 'string') { + // 直接处理单个字母答案 (A, B, C, D) + if (/^[A-D]$/.test(correctAnswer)) { + const letterIndex = correctAnswer.charCodeAt(0) - 65; // 'A'的ASCII码是65 + isCorrect = selectedOption === letterIndex; + correctOptionLetter = correctAnswer; + } + // 处理带点格式 (A., B., C., D.) + else if (/^[A-D]\.$/.test(correctAnswer)) { + const letterIndex = correctAnswer.charCodeAt(0) - 65; + isCorrect = selectedOption === letterIndex; + correctOptionLetter = correctAnswer.charAt(0); + } + // 处理带空格格式 (A xxx, B xxx, C xxx, D xxx) + else if (/^[A-D] /.test(correctAnswer)) { + const letterIndex = correctAnswer.charCodeAt(0) - 65; + isCorrect = selectedOption === letterIndex; + correctOptionLetter = correctAnswer.charAt(0); + } + } + + ctx.status = 200; + ctx.body = { + status: "success", + data: { + isCorrect, + correctAnswer: correctAnswer || "", + correctOptionLetter: correctOptionLetter, // 添加ABCD格式的正确答案 + explanation: question.explanation || "" + } + }; + } catch (error) { + ctx.status = 500; + ctx.body = { + status: "error", + message: "验证答案失败", + error: error instanceof Error ? error.message : "未知错误", + }; + } +}); + +// 获取问题答案与解析的接口 +router.get("/api/question-solution", async (ctx: Context) => { + try { + const questionIndex = ctx.query.questionIndex ? parseInt(ctx.query.questionIndex as string) : undefined; + const userId = ctx.query.userId as string || "default"; // 用于获取对应用户的问题数据 + + if (questionIndex === undefined) { + ctx.status = 400; + ctx.body = { + status: "error", + message: "请提供问题索引", + }; + return; + } + + // 获取之前存储的问题数据 + const questions = questionsStore.get(userId); + + if (!questions || !questions[questionIndex]) { + ctx.status = 404; + ctx.body = { + status: "error", + message: "问题不存在或会话已过期", + }; + return; + } + + const question = questions[questionIndex]; + + // 计算正确答案的字母表示(A、B、C、D) + let correctOptionLetter = ""; + if (question.answer !== undefined) { + const correctAnswer = question.answer; + + if (typeof correctAnswer === 'number') { + correctOptionLetter = String.fromCharCode(65 + correctAnswer); + } else if (typeof correctAnswer === 'string') { + if (/^[A-D]\.?\s/.test(correctAnswer)) { + correctOptionLetter = correctAnswer.charAt(0); + } else { + let foundIndex = -1; + for (let i = 0; i < question.options.length; i++) { + const optionContent = question.options[i].replace(/^[A-D]\.?\s/, ''); + if (optionContent.includes(correctAnswer) || correctAnswer.includes(optionContent)) { + foundIndex = i; + break; + } + } + + if (foundIndex !== -1) { + correctOptionLetter = String.fromCharCode(65 + foundIndex); + } + } + } + } + + ctx.status = 200; + ctx.body = { + status: "success", + data: { + question: question.question, + options: question.options, + answer: question.answer, + correctOptionLetter: correctOptionLetter, // 添加ABCD格式的正确答案 + explanation: question.explanation || "暂无解析" + } + }; + } catch (error) { + ctx.status = 500; + ctx.body = { + status: "error", + message: "获取答案解析失败", + error: error instanceof Error ? error.message : "未知错误", + }; + } +}); + +export default router; diff --git a/move202503/AKAKing23/code/chain_back/tsconfig.json b/move202503/AKAKing23/code/chain_back/tsconfig.json new file mode 100644 index 00000000..3e4a1bf7 --- /dev/null +++ b/move202503/AKAKing23/code/chain_back/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ES2018", + "module": "commonjs", + "lib": ["es2018", "esnext.asynciterable"], + "outDir": "./dist", + "rootDir": "./", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true + }, + "include": ["./**/*.ts"], + "exclude": ["node_modules", "dist"] +} \ No newline at end of file diff --git a/move202503/AKAKing23/code/chain_contract/.gitignore b/move202503/AKAKing23/code/chain_contract/.gitignore new file mode 100644 index 00000000..a007feab --- /dev/null +++ b/move202503/AKAKing23/code/chain_contract/.gitignore @@ -0,0 +1 @@ +build/* diff --git a/move202503/AKAKing23/code/chain_contract/Move.lock b/move202503/AKAKing23/code/chain_contract/Move.lock new file mode 100644 index 00000000..e62d8501 --- /dev/null +++ b/move202503/AKAKing23/code/chain_contract/Move.lock @@ -0,0 +1,34 @@ +# @generated by Move, please check-in and do not edit manually. + +[move] +version = 3 +manifest_digest = "89DADE7C58C92FEA5CF0D861DB274BBF0124B711F3752F48A2D9831C87D5679D" +deps_digest = "F8BBB0CCB2491CA29A3DF03D6F92277A4F3574266507ACD77214D37ECA3F3082" +dependencies = [ + { id = "Sui", name = "Sui" }, +] + +[[move.package]] +id = "MoveStdlib" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "framework/testnet", subdir = "crates/sui-framework/packages/move-stdlib" } + +[[move.package]] +id = "Sui" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "framework/testnet", subdir = "crates/sui-framework/packages/sui-framework" } + +dependencies = [ + { id = "MoveStdlib", name = "MoveStdlib" }, +] + +[move.toolchain-version] +compiler-version = "1.42.2" +edition = "2024.beta" +flavor = "sui" + +[env] + +[env.testnet] +chain-id = "4c78adac" +original-published-id = "0xca85ff8d356ddaa0cb68696b11b8b7cc77d1c5bda3effd7a54a69dcb2b4b2465" +latest-published-id = "0xca85ff8d356ddaa0cb68696b11b8b7cc77d1c5bda3effd7a54a69dcb2b4b2465" +published-version = "1" diff --git a/move202503/AKAKing23/code/chain_contract/Move.toml b/move202503/AKAKing23/code/chain_contract/Move.toml new file mode 100644 index 00000000..cbc515b2 --- /dev/null +++ b/move202503/AKAKing23/code/chain_contract/Move.toml @@ -0,0 +1,38 @@ +[package] +name = "chain_contract" +edition = "2024.beta" # edition = "legacy" to use legacy (pre-2024) Move +# license = "" # e.g., "MIT", "GPL", "Apache 2.0" +# authors = ["..."] # e.g., ["Joe Smith (joesmith@noemail.com)", "John Snow (johnsnow@noemail.com)"] + +[dependencies] +Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "framework/testnet", override = true } + +# For remote import, use the `{ git = "...", subdir = "...", rev = "..." }`. +# Revision can be a branch, a tag, and a commit hash. +# MyRemotePackage = { git = "https://some.remote/host.git", subdir = "remote/path", rev = "main" } + +# For local dependencies use `local = path`. Path is relative to the package root +# Local = { local = "../path/to" } + +# To resolve a version conflict and force a specific version for dependency +# override use `override = true` +# Override = { local = "../conflicting/version", override = true } + +[addresses] +chain_contract = "0x0" +sui = "0x2" + +# Named addresses will be accessible in Move as `@name`. They're also exported: +# for example, `std = "0x1"` is exported by the Standard Library. +# alice = "0xA11CE" + +[dev-dependencies] +# The dev-dependencies section allows overriding dependencies for `--test` and +# `--dev` modes. You can introduce test-only dependencies here. +# Local = { local = "../path/to/dev-build" } + +[dev-addresses] +# The dev-addresses section allows overwriting named addresses for the `--test` +# and `--dev` modes. +# alice = "0xB0B" + diff --git a/move202503/AKAKing23/code/chain_contract/sources/allowlist.move b/move202503/AKAKing23/code/chain_contract/sources/allowlist.move new file mode 100644 index 00000000..1fe99ec1 --- /dev/null +++ b/move202503/AKAKing23/code/chain_contract/sources/allowlist.move @@ -0,0 +1,49 @@ +module chain_contract::allowlist; + +use std::vector; +use sui::object::{Self, UID}; +use sui::tx_context::{Self, TxContext}; +use sui::transfer; + +// Error codes +const ENotInAllowlist: u64 = 0; +const ENotOwner: u64 = 1; + +public struct Allowlist has key, store { + id: UID, + addresses: vector
, + owner: address, +} + +// 初始化一个新的白名单 +public fun initialize(ctx: &mut TxContext): Allowlist { + Allowlist { + id: object::new(ctx), + addresses: vector::empty
(), + owner: tx_context::sender(ctx), + } +} + +// 创建并转移白名单给创建者 +public entry fun create_allowlist(ctx: &mut TxContext) { + let allowlist = initialize(ctx); + transfer::transfer(allowlist, tx_context::sender(ctx)); +} + +// 添加用户到白名单 +public entry fun add_to_allowlist(allowlist: &mut Allowlist, user: address, ctx: &TxContext) { + // 检查操作者是否是白名单的拥有者 + assert!(allowlist.owner == tx_context::sender(ctx), ENotOwner); + + // 只有当地址不在列表中时才添加 + if (!vector::contains(&allowlist.addresses, &user)) { + vector::push_back(&mut allowlist.addresses, user); + } +} + +// This function checks if an address is in the allowlist +entry fun seal_approve(id: vector, allowlist: &Allowlist, user: address) { + let is_allowed = vector::contains(&allowlist.addresses, &user); + assert!(is_allowed, ENotInAllowlist); + // If we get here, access is granted +} diff --git a/move202503/AKAKing23/code/chain_contract/sources/chain_contract.move b/move202503/AKAKing23/code/chain_contract/sources/chain_contract.move new file mode 100644 index 00000000..2682c70f --- /dev/null +++ b/move202503/AKAKing23/code/chain_contract/sources/chain_contract.move @@ -0,0 +1,155 @@ +/** + * LearnChain-X 系统核心合约 + * 此模块负责整个系统的配置管理和版本控制 + */ +module chain_contract::chain_contract; + +use std::string::{Self, String}; +use sui::object::{Self, UID}; +use sui::table::{Self, Table}; +use sui::transfer; +use sui::tx_context::{Self, TxContext}; + +// 错误码 +/// 当操作者不是系统管理员时返回此错误 +const ENotAuthorized: u64 = 0; + +/** + * 系统配置结构 + * 存储系统的全局参数和配置信息 + */ +public struct SystemConfig has key { + id: UID, + /// 系统当前版本号,用于版本控制 + version: u64, + /// 系统名称 + name: String, + /// 系统管理员地址,只有管理员可以更改系统设置 + admin: address, + /// 系统动态参数表,可存储各种配置值 + params: Table, +} + +/** + * 初始化系统配置 + * 在模块部署时自动执行一次 + * 创建系统配置对象并设置默认参数 + */ +fun init(ctx: &mut TxContext) { + let params = table::new(ctx); + + // 添加默认系统参数 + // 答题奖励积分的最小值 + // table::add(&mut params, string::utf8(b"min_reward"), string::utf8(b"1")); + // // 答题奖励积分的最大值 + // table::add(&mut params, string::utf8(b"max_reward"), string::utf8(b"100")); + // // 查看解析所需的最低积分成本 + // table::add(&mut params, string::utf8(b"min_solution_cost"), string::utf8(b"5")); + + // 创建系统配置对象 + let config = SystemConfig { + id: object::new(ctx), + version: 1, // 初始版本号为1 + name: string::utf8(b"LearnChain-X Quiz System"), + admin: tx_context::sender(ctx), // 部署者成为初始管理员 + params, + }; + + // 共享系统配置对象,使其全局可访问 + transfer::share_object(config); +} + +/** + * 更新系统参数 + * @param config - 系统配置对象 + * @param param_name - 参数名称 + * @param param_value - 参数值 + * @param ctx - 交易上下文 + */ +public entry fun update_param( + config: &mut SystemConfig, + param_name: String, + param_value: String, + ctx: &mut TxContext, +) { + // 验证调用者是否为系统管理员 + assert!(tx_context::sender(ctx) == config.admin, ENotAuthorized); + + // 检查参数是否已存在 + if (table::contains(&config.params, param_name)) { + // 更新现有参数值 + *table::borrow_mut(&mut config.params, param_name) = param_value; + } else { + // 添加新参数 + table::add(&mut config.params, param_name, param_value); + } +} + +/** + * 更新系统版本号 + * @param config - 系统配置对象 + * @param new_version - 新版本号 + * @param ctx - 交易上下文 + */ +public entry fun update_version(config: &mut SystemConfig, new_version: u64, ctx: &mut TxContext) { + // 验证调用者是否为系统管理员 + assert!(tx_context::sender(ctx) == config.admin, ENotAuthorized); + // 确保新版本号大于当前版本号(版本只能递增) + assert!(new_version > config.version, ENotAuthorized); + + // 更新版本号 + config.version = new_version; +} + +/** + * 更新系统管理员 + * @param config - 系统配置对象 + * @param new_admin - 新管理员地址 + * @param ctx - 交易上下文 + */ +public entry fun update_admin(config: &mut SystemConfig, new_admin: address, ctx: &mut TxContext) { + // 验证调用者是否为当前系统管理员 + assert!(tx_context::sender(ctx) == config.admin, ENotAuthorized); + + // 更新管理员地址 + config.admin = new_admin; +} + +/** + * 获取系统当前版本号 + * @param config - 系统配置对象 + * @return 当前版本号 + */ +public fun get_version(config: &SystemConfig): u64 { + config.version +} + +/** + * 获取系统名称 + * @param config - 系统配置对象 + * @return 系统名称 + */ +public fun get_name(config: &SystemConfig): String { + config.name +} + +/** + * 获取指定系统参数的值 + * @param config - 系统配置对象 + * @param param_name - 参数名称 + * @return 参数值 + */ +public fun get_param(config: &SystemConfig, param_name: &String): String { + assert!(table::contains(&config.params, *param_name), 1); + *table::borrow(&config.params, *param_name) +} + +/** + * 检查指定地址是否为系统管理员 + * @param config - 系统配置对象 + * @param addr - 待检查的地址 + * @return 是否为管理员 + */ +public fun is_admin(config: &SystemConfig, addr: address): bool { + config.admin == addr +} diff --git a/move202503/AKAKing23/code/chain_contract/sources/point_token.move b/move202503/AKAKing23/code/chain_contract/sources/point_token.move new file mode 100644 index 00000000..8e98914f --- /dev/null +++ b/move202503/AKAKing23/code/chain_contract/sources/point_token.move @@ -0,0 +1,426 @@ +/** + * 积分代币模块 + * 实现了ERC20风格的代币,用于答题系统的奖励和支付 + * 用户答对题目获得积分,查看解析需要消耗积分 + * 设计为去中心化模式,用户可以直接获得积分奖励 + */ +module chain_contract::point_token; + +use std::option; +use std::string; +use std::ascii; +use sui::balance::{Self, Balance}; +use sui::coin::{Self, Coin, TreasuryCap}; +use sui::event; +use sui::object::{Self, UID}; +use sui::package; +use sui::table::{Self, Table}; +use sui::transfer; +use sui::tx_context::{Self, TxContext}; +use sui::url; + +// 错误码定义 +/// 代币余额不足错误 +const EInsufficientBalance: u64 = 0; +/// 操作未被授权错误 +const ENotAuthorized: u64 = 1; +/// 重复回答问题错误 +const EAlreadyAnswered: u64 = 2; +/// 问题不存在错误 +const EQuestionNotFound: u64 = 3; +/// 答案不正确错误 +const EIncorrectAnswer: u64 = 4; + +/// 定义积分代币类型 - 使用模块名称的全部大写版本作为one-time witness +public struct POINT_TOKEN has drop {} + +/** + * 问题结构体 + * 存储问题相关信息 + */ +public struct Question has key, store { + id: UID, + /// 问题ID + question_id: u64, + /// 问题内容 + content: string::String, + /// 正确答案 + correct_answer: string::String, + /// 奖励积分数量 + reward_points: u64, +} + +/** + * 答题管理器结构 + * 控制积分代币的发行和管理,并存储问题与用户答题记录 + */ +public struct QuizManager has key { + id: UID, + /// 积分代币的铸币权,用于创建新代币 + treasury_cap: TreasuryCap, + /// 管理员地址,只有管理员可以添加问题 + admin: address, + /// 存储用户已答题记录,防止重复奖励 + /// 格式: (用户地址, 问题ID) => 是否已回答 + user_answers: Table>, + /// 下一个问题ID + next_question_id: u64, +} + +/** + * 答案解析结构 + * 存储特定问题的解析内容和所需的查看费用 + */ +public struct SolutionContent has key, store { + id: UID, + /// 关联的问题ID + question_id: u64, + /// 解析内容 + content: string::String, + /// 查看解析所需的代币数量 + token_cost: u64, +} + +// 事件定义 +/** + * 答题完成事件 + * 当用户完成答题时触发,记录答题结果 + */ +public struct QuizCompleted has copy, drop { + /// 用户地址 + user: address, + /// 问题ID + question_id: u64, + /// 是否回答正确 + is_correct: bool, + /// 获得的积分(如果回答正确) + points_earned: u64, +} + +/** + * 查看解析事件 + * 当用户查看题目解析时触发 + */ +public struct SolutionViewed has copy, drop { + /// 用户地址 + user: address, + /// 问题ID + question_id: u64, + /// 消耗的代币数量 + tokens_spent: u64, +} + +/** + * 问题添加事件 + * 当管理员添加新问题时触发 + */ +public struct QuestionAdded has copy, drop { + /// 问题ID + question_id: u64, + /// 奖励积分 + reward_points: u64, +} + +/** + * 模块初始化函数,自动调用 + * 当模块首次发布时由框架自动调用 + */ +fun init(witness: POINT_TOKEN, ctx: &mut TxContext) { + // 使用one-time witness创建代币 + let (treasury_cap, metadata) = coin::create_currency( + witness, + 9, // 小数位数 + b"POINT", // 符号 + b"Quiz Points", // 名称 + b"Points earned from answering questions correctly", // 描述 + option::some(url::new_unsafe(std::ascii::string(b"https://learnchainx.netlify.app/logo.png"))), // 图标URL + ctx, + ); + + // 转移元数据给发布者 + transfer::public_transfer(metadata, tx_context::sender(ctx)); + + // 创建Quiz管理器实例 + let quiz_manager = QuizManager { + id: object::new(ctx), + treasury_cap, + admin: tx_context::sender(ctx), + user_answers: table::new(ctx), + next_question_id: 0, + }; + + // 将管理器共享为全局对象,使任何人都能访问和使用 + transfer::share_object(quiz_manager); +} + +/** + * 添加新问题 + * 创建并共享新的问题对象 + * @param manager - 管理器实例 + * @param content - 问题内容 + * @param correct_answer - 正确答案 + * @param reward_points - 答对奖励的积分 + * @param solution_content - 解析内容 + * @param token_cost - 查看解析所需积分 + * @param ctx - 交易上下文 + */ +public entry fun add_question( + manager: &mut QuizManager, + content: string::String, + correct_answer: string::String, + reward_points: u64, + solution_content: string::String, + token_cost: u64, + ctx: &mut TxContext, +) { + // 获取并递增问题ID + let question_id = manager.next_question_id; + manager.next_question_id = question_id + 1; + + // 创建问题对象 + let question = Question { + id: object::new(ctx), + question_id, + content, + correct_answer, + reward_points, + }; + + // 创建解析对象 + let solution = SolutionContent { + id: object::new(ctx), + question_id, + content: solution_content, + token_cost, + }; + + // 共享问题和解析对象,使其可被所有人访问 + transfer::share_object(question); + transfer::share_object(solution); + + // 发出问题添加事件 + event::emit(QuestionAdded { + question_id, + reward_points, + }); +} + +/** + * 用户回答问题 - 简化版 + * 直接奖励用户积分,不验证答案(前端已验证) + * @param manager - 管理器实例 + * @param question - 问题对象 + * @param user - 接收奖励的用户地址 + * @param ctx - 交易上下文 + */ +public entry fun reward_correct_answer( + manager: &mut QuizManager, + question: &Question, + user: address, + ctx: &mut TxContext, +) { + let question_id = question.question_id; + + // 检查用户是否已经回答过这个问题 + if (!table::contains(&manager.user_answers, user)) { + table::add(&mut manager.user_answers, user, table::new(ctx)); + }; + + let user_question_table = table::borrow_mut(&mut manager.user_answers, user); + + // 确保用户没有重复获取奖励 + assert!(!table::contains(user_question_table, question_id), EAlreadyAnswered); + + // 记录用户已回答这个问题 + table::add(user_question_table, question_id, true); + + // 铸造积分 + let points = question.reward_points; + let points_coin = coin::mint(&mut manager.treasury_cap, points, ctx); + + // 转移给用户 + transfer::public_transfer(points_coin, user); + + // 发出事件 + event::emit(QuizCompleted { + user, + question_id, + is_correct: true, + points_earned: points, + }); +} + +/** + * 用户回答问题(原始方法,保留但不推荐使用) + * 验证答案并自动奖励积分 + * @param manager - 管理器实例 + * @param question - 问题对象 + * @param answer - 用户的答案 + * @param ctx - 交易上下文 + */ +public entry fun answer_question( + manager: &mut QuizManager, + question: &Question, + answer: string::String, + ctx: &mut TxContext, +) { + let user = tx_context::sender(ctx); + let question_id = question.question_id; + + // 检查用户是否已经回答过这个问题 + if (!table::contains(&manager.user_answers, user)) { + table::add(&mut manager.user_answers, user, table::new(ctx)); + }; + + let user_question_table = table::borrow_mut(&mut manager.user_answers, user); + + assert!(!table::contains(user_question_table, question_id), EAlreadyAnswered); + + // 验证答案 + let is_correct = string::bytes(&question.correct_answer) == string::bytes(&answer); + + // 记录用户已回答这个问题 + table::add(user_question_table, question_id, true); + + // 如果答案正确,奖励积分 + if (is_correct) { + // 铸造积分 + let points = question.reward_points; + let points_coin = coin::mint(&mut manager.treasury_cap, points, ctx); + + // 转移给用户 + transfer::public_transfer(points_coin, user); + + // 发出事件 + event::emit(QuizCompleted { + user, + question_id, + is_correct: true, + points_earned: points, + }); + } else { + // 答案错误,只记录事件 + event::emit(QuizCompleted { + user, + question_id, + is_correct: false, + points_earned: 0, + }); + } +} + +/** + * 查看解析(消耗积分) + * 用户支付积分以查看问题解析 + * @param solution - 解析内容对象 + * @param payment - 用户的代币支付 + * @param ctx - 交易上下文 + */ +public entry fun view_solution( + solution: &SolutionContent, + payment: &mut Coin, + ctx: &mut TxContext, +) { + // 检查用户积分是否足够 + let required = solution.token_cost; + assert!(coin::value(payment) >= required, EInsufficientBalance); + + // 从用户的代币中扣除费用 + let burn_amount = coin::split(payment, required, ctx); + let burn_balance = coin::into_balance(burn_amount); + + // 记录事件 + event::emit(SolutionViewed { + user: tx_context::sender(ctx), + question_id: solution.question_id, + tokens_spent: required, + }); + + // 销毁代币 + balance::destroy_zero(burn_balance); +} + +/** + * 更改管理员 + * 修改管理器的管理员地址 + * @param manager - 管理器实例 + * @param new_admin - 新管理员地址 + * @param ctx - 交易上下文 + */ +public entry fun change_admin(manager: &mut QuizManager, new_admin: address, ctx: &mut TxContext) { + assert!(tx_context::sender(ctx) == manager.admin, ENotAuthorized); + manager.admin = new_admin; +} + +/** + * 铸造新代币给指定用户 + * 任何人都可以调用该函数为其他用户铸造代币 + * @param manager - 管理器实例 + * @param amount - 铸造数量 + * @param recipient - 接收者地址 + * @param ctx - 交易上下文 + */ +public entry fun mint_tokens( + manager: &mut QuizManager, + amount: u64, + recipient: address, + ctx: &mut TxContext, +) { + // 铸造积分 + let points_coin = coin::mint(&mut manager.treasury_cap, amount, ctx); + + // 转移给接收者 + transfer::public_transfer(points_coin, recipient); + + // 发出事件 + event::emit(QuizCompleted { + user: recipient, + question_id: 0, // 不与问题关联 + is_correct: true, + points_earned: amount, + }); +} + +/** + * 销毁用户代币 + * 用户可以将自己的代币销毁 + * @param manager - Quiz管理器 + * @param coin - 要销毁的代币 + */ +public entry fun burn_tokens( + manager: &mut QuizManager, + coin: Coin, +) { + // 销毁代币 + coin::burn(&mut manager.treasury_cap, coin); +} + +// Getter 函数 +public fun get_question_content(question: &Question): string::String { + question.content +} + +public fun get_question_id(question: &Question): u64 { + question.question_id +} + +public fun get_question_reward(question: &Question): u64 { + question.reward_points +} + +public fun get_solution_content(solution: &SolutionContent): string::String { + solution.content +} + +public fun get_solution_cost(solution: &SolutionContent): u64 { + solution.token_cost +} + +public fun has_answered_question(manager: &QuizManager, user: address, question_id: u64): bool { + if (!table::contains(&manager.user_answers, user)) { + return false + }; + + let user_question_table = table::borrow(&manager.user_answers, user); + table::contains(user_question_table, question_id) +} diff --git a/move202503/AKAKing23/code/chain_contract/sources/quiz.move b/move202503/AKAKing23/code/chain_contract/sources/quiz.move new file mode 100644 index 00000000..e25917c7 --- /dev/null +++ b/move202503/AKAKing23/code/chain_contract/sources/quiz.move @@ -0,0 +1,646 @@ +/** + * 答题系统核心模块 + * 实现问题管理、用户答题记录以及查看解析的核心功能 + * 设计为去中心化模式,用户可以直接获得积分奖励 + */ +module chain_contract::quiz; + +use chain_contract::point_token::{Self, QuizManager, POINT_TOKEN, Question as TokenQuestion}; +use std::string::{Self, String}; +use std::vector; +use sui::coin::{Self, Coin}; +use sui::event; +use sui::object::{Self, UID}; +use sui::table::{Self, Table}; +use sui::transfer; +use sui::tx_context::{Self, TxContext}; + +// 错误码 +/// 未授权操作错误 +const ENotAuthorized: u64 = 0; +/// 问题不存在错误 +const EQuestionNotFound: u64 = 1; +/// 已回答过此问题错误 +const EAlreadyAnswered: u64 = 2; +/// 积分不足错误 +const EInsufficientBalance: u64 = 3; + +/// Quiz系统的one-time witness +public struct QUIZ has drop {} + +/** + * 问题结构 + * 存储问题内容、选项和答案 + */ +public struct Question has key, store { + id: UID, + /// 问题内容 + content: String, + /// 问题选项列表 + options: vector, + /// 正确答案的索引 + correct_answer: u64, + /// 答对可获得的积分 + points_reward: u64, + /// 查看解析的积分花费 + solution_cost: u64, + /// 答案解析内容 + solution: String, +} + +/** + * 问题注册表 + * 管理系统中的所有问题 + */ +public struct QuestionRegistry has key { + id: UID, + /// 问题ID到问题的映射表 + questions: Table, + /// 下一个问题ID,用于自增 + next_question_id: u64, + /// 管理员地址 + admin: address, +} + +/** + * 用户答题记录 + * 记录用户回答问题的历史和查看解析的历史 + */ +public struct UserAnswerRecord has key { + id: UID, + /// 用户地址 + user: address, + /// 用户已回答问题记录,问题ID -> 是否回答正确 + answered_questions: Table, + /// 用户查看解析记录,问题ID -> 是否查看过解析 + viewed_solutions: Table, +} + +// 事件定义 +/** + * 问题创建事件 + * 当新问题被添加时触发 + */ +public struct QuestionCreated has copy, drop { + /// 问题ID + question_id: u64, + /// 问题内容 + content: String, + /// 回答正确可获得的积分 + points_reward: u64, +} + +/** + * 问题回答事件 + * 当用户回答问题时触发 + */ +public struct QuestionAnswered has copy, drop { + /// 用户地址 + user: address, + /// 问题ID + question_id: u64, + /// 是否回答正确 + is_correct: bool, +} + +/** + * 解析查看事件 + * 当用户付费查看解析时触发 + */ +public struct SolutionViewed has copy, drop { + /// 用户地址 + user: address, + /// 问题ID + question_id: u64, + /// 消费的代币数量 + tokens_spent: u64, +} + +/** + * 模块初始化函数 + * 将由sui框架在部署时自动调用 + */ +fun init(witness: QUIZ, ctx: &mut TxContext) { + // 创建问题注册表对象 + let registry = QuestionRegistry { + id: object::new(ctx), + questions: table::new(ctx), + next_question_id: 0, + admin: tx_context::sender(ctx), + }; + + // 共享问题注册表,使其全局可访问 + transfer::share_object(registry); +} + +/** + * 为用户创建答题记录 + * 每个用户需要创建自己的答题记录来跟踪答题历史 + * @param ctx - 交易上下文 + */ +public entry fun create_user_record(ctx: &mut TxContext) { + // 创建用户答题记录对象 + let record = UserAnswerRecord { + id: object::new(ctx), + user: tx_context::sender(ctx), + answered_questions: table::new(ctx), + viewed_solutions: table::new(ctx), + }; + + // 将记录直接转移给创建者 + transfer::transfer(record, tx_context::sender(ctx)); +} + +/** + * 添加新问题 + * 管理员添加新问题到系统中,同时在积分系统中注册 + * @param registry - 问题注册表 + * @param manager - Quiz管理器 + * @param content - 问题内容 + * @param options - 问题选项 + * @param correct_answer - 正确答案索引 + * @param correct_answer_str - 正确答案字符串 + * @param points_reward - 回答正确的积分奖励 + * @param solution_cost - 查看解析所需积分 + * @param solution - 解析内容 + * @param ctx - 交易上下文 + */ +public entry fun add_question( + registry: &mut QuestionRegistry, + manager: &mut QuizManager, + content: String, + options: vector, + correct_answer: u64, + correct_answer_str: String, + points_reward: u64, + solution_cost: u64, + solution: String, + ctx: &mut TxContext, +) { + // 只有管理员可以添加问题 + assert!(tx_context::sender(ctx) == registry.admin, ENotAuthorized); + + // 创建问题对象 + let question = Question { + id: object::new(ctx), + content, + options, + correct_answer, + points_reward, + solution_cost, + solution, + }; + + // 获取并保存问题ID + let question_id = registry.next_question_id; + + // 添加到问题列表 + table::add(&mut registry.questions, question_id, question); + + // 更新下一个问题ID(自增) + registry.next_question_id = question_id + 1; + + // 同时在积分系统中添加问题 + point_token::add_question( + manager, + content, + correct_answer_str, + points_reward, + solution, + solution_cost, + ctx, + ); + + // 触发问题创建事件 + emit_question_created(question_id, content, points_reward); +} + +/** + * 简化的用户回答问题处理 - 前端验证后直接调用 + * 不需要验证答案,直接发放奖励 + * @param manager - Quiz管理器 + * @param token_question - 积分系统中的问题对象 + * @param user_record - 用户的答题记录 + * @param question_id - 问题ID + * @param ctx - 交易上下文 + */ +public entry fun reward_answer( + registry: &QuestionRegistry, + manager: &mut QuizManager, + token_question: &TokenQuestion, + user_record: &mut UserAnswerRecord, + question_id: u64, + ctx: &mut TxContext, +) { + // 确保是用户自己的记录 + let user = tx_context::sender(ctx); + assert!(user_record.user == user, ENotAuthorized); + + // 检查问题是否存在 + assert!(table::contains(®istry.questions, question_id), EQuestionNotFound); + + // 检查是否已经回答过 + assert!(!table::contains(&user_record.answered_questions, question_id), EAlreadyAnswered); + + // 记录用户的回答结果为正确 (直接假设正确,因为前端已验证) + table::add(&mut user_record.answered_questions, question_id, true); + + // 调用积分系统的奖励方法 + point_token::reward_correct_answer( + manager, + token_question, + user, + ctx, + ); + + // 触发问题回答事件 + emit_question_answered(user_record.user, question_id, true); +} + +/** + * 用户回答问题(原始方法,保留但不推荐使用) + * 处理用户的答题请求,检验答案并记录结果 + * @param registry - 问题注册表 + * @param manager - Quiz管理器 + * @param token_question - 积分系统中的问题对象 + * @param user_record - 用户的答题记录 + * @param question_id - 问题ID + * @param answer - 用户提交的答案索引 + * @param ctx - 交易上下文 + */ +public entry fun answer_question( + registry: &QuestionRegistry, + manager: &mut QuizManager, + token_question: &TokenQuestion, + user_record: &mut UserAnswerRecord, + question_id: u64, + answer: u64, + ctx: &mut TxContext, +) { + // 确保是用户自己的记录 + assert!(user_record.user == tx_context::sender(ctx), ENotAuthorized); + + // 检查问题是否存在 + assert!(table::contains(®istry.questions, question_id), EQuestionNotFound); + + // 检查是否已经回答过 + assert!(!table::contains(&user_record.answered_questions, question_id), EAlreadyAnswered); + + // 获取问题 + let question = table::borrow(®istry.questions, question_id); + + // 判断答案是否正确 + let is_correct = question.correct_answer == answer; + + // 记录用户的回答结果 + table::add(&mut user_record.answered_questions, question_id, is_correct); + + // 获取选项文本作为答案 + let options = &question.options; + let answer_str = *vector::borrow(options, answer); + + // 调用积分系统的答题方法 + point_token::answer_question( + manager, + token_question, + answer_str, + ctx, + ); + + // 触发问题回答事件 + emit_question_answered(user_record.user, question_id, is_correct); +} + +/** + * 查看问题解析(需要花费积分) + * 用户使用积分购买解析的查看权限 + * @param registry - 问题注册表 + * @param manager - Quiz管理器 + * @param user_record - 用户的答题记录 + * @param payment - 用户的积分代币 + * @param question_id - 问题ID + * @param ctx - 交易上下文 + */ +public entry fun view_solution( + registry: &QuestionRegistry, + manager: &mut QuizManager, + user_record: &mut UserAnswerRecord, + payment: &mut Coin, + question_id: u64, + ctx: &mut TxContext, +) { + // 确保是用户自己的记录 + assert!(user_record.user == tx_context::sender(ctx), ENotAuthorized); + + // 检查问题是否存在 + assert!(table::contains(®istry.questions, question_id), EQuestionNotFound); + + // 获取问题 + let question = table::borrow(®istry.questions, question_id); + + // 检查用户积分是否足够 + assert!(coin::value(payment) >= question.solution_cost, EInsufficientBalance); + + // 如果是第一次查看,需要支付积分 + if (!table::contains(&user_record.viewed_solutions, question_id)) { + // 从代币中分割出需要销毁的数量 + let burn_amount = coin::split(payment, question.solution_cost, ctx); + + // 销毁代币 + point_token::burn_tokens(manager, burn_amount); + + // 记录已查看标记,后续可免费查看 + table::add(&mut user_record.viewed_solutions, question_id, true); + + // 触发解析查看事件 + emit_solution_viewed(user_record.user, question_id, question.solution_cost); + } + // 如果已经查看过,不需要再次支付 +} + +/** + * 获取问题解析(仅当已经支付过可以免费查看) + * 查询已付费解析的内容 + * @param registry - 问题注册表 + * @param user_record - 用户的答题记录 + * @param question_id - 问题ID + * @return 解析内容 + */ +public fun get_solution( + registry: &QuestionRegistry, + user_record: &UserAnswerRecord, + question_id: u64, +): String { + // 检查问题是否存在 + assert!(table::contains(®istry.questions, question_id), EQuestionNotFound); + + // 检查是否已经支付过查看费用 + assert!(table::contains(&user_record.viewed_solutions, question_id), ENotAuthorized); + + // 获取问题 + let question = table::borrow(®istry.questions, question_id); + // 返回解析内容 + question.solution +} + +/** + * 更改管理员 + * 修改问题注册表的管理员地址 + * @param registry - 问题注册表 + * @param manager - Quiz管理器 + * @param new_admin - 新管理员地址 + * @param ctx - 交易上下文 + */ +public entry fun change_admin( + registry: &mut QuestionRegistry, + manager: &mut QuizManager, + new_admin: address, + ctx: &mut TxContext, +) { + assert!(tx_context::sender(ctx) == registry.admin, ENotAuthorized); + registry.admin = new_admin; + + // 同时更新积分系统的管理员 + point_token::change_admin(manager, new_admin, ctx); +} + +// 简化版:直接发放奖励,无需任何ID +/** + * 直接奖励用户 - 最简化版本 + * 不需要问题ID或记录,直接奖励用户指定数量的代币 + * @param manager - Quiz管理器 + * @param recipient - 接收代币的用户地址 + * @param amount - 奖励数量 + * @param ctx - 交易上下文 + */ +public entry fun direct_reward( + manager: &mut QuizManager, + recipient: address, + amount: u64, + ctx: &mut TxContext, +) { + // 调用积分系统的铸币方法 + point_token::mint_tokens( + manager, + amount, + recipient, + ctx, + ); +} + +// ===== 内部事件函数 ===== +/** + * 封装问题创建事件发送函数 + * 避免直接使用event::emit导致的linter错误 + */ +fun emit_question_created(question_id: u64, content: String, points_reward: u64) { + event::emit(QuestionCreated { + question_id, + content, + points_reward, + }); +} + +/** + * 封装问题回答事件发送函数 + * 避免直接使用event::emit导致的linter错误 + */ +fun emit_question_answered(user: address, question_id: u64, is_correct: bool) { + event::emit(QuestionAnswered { + user, + question_id, + is_correct, + }); +} + +/** + * 封装解析查看事件发送函数 + * 避免直接使用event::emit导致的linter错误 + */ +fun emit_solution_viewed(user: address, question_id: u64, tokens_spent: u64) { + event::emit(SolutionViewed { + user, + question_id, + tokens_spent, + }); +} + +// Getter 函数 +public fun get_question_content(registry: &QuestionRegistry, question_id: u64): String { + assert!(table::contains(®istry.questions, question_id), EQuestionNotFound); + let question = table::borrow(®istry.questions, question_id); + question.content +} +/** +* 获取问题选项 +* @param registry - 问题注册表 +* @param question_id - 问题ID +* @return 问题选项列表 +*/ +public fun get_question_options(registry: &QuestionRegistry, question_id: u64): vector { + assert!(table::contains(®istry.questions, question_id), EQuestionNotFound); + let question = table::borrow(®istry.questions, question_id); + question.options +} + +/** +* 获取问题奖励积分 +* @param registry - 问题注册表 +* @param question_id - 问题ID +* @return 答对可获得的积分 +*/ +public fun get_question_reward(registry: &QuestionRegistry, question_id: u64): u64 { + assert!(table::contains(®istry.questions, question_id), EQuestionNotFound); + let question = table::borrow(®istry.questions, question_id); + question.points_reward +} +/** +* 获取解析所需积分 +* @param registry - 问题注册表 +* @param question_id - 问题ID +* @return 查看解析所需积分 +*/ +public fun get_solution_cost(registry: &QuestionRegistry, question_id: u64): u64 { + assert!(table::contains(®istry.questions, question_id), EQuestionNotFound); + let question = table::borrow(®istry.questions, question_id); + question.solution_cost +} +/** +* 获取用户是否回答过特定问题 +* @param user_record - 用户的答题记录 +* @param question_id - 问题ID +* @return 是否已回答 +*/ +public fun has_answered(user_record: &UserAnswerRecord, question_id: u64): bool { + table::contains(&user_record.answered_questions, question_id) +} +/** +* 获取用户回答是否正确 +* @param user_record - 用户的答题记录 +* @param question_id - 问题ID +* @return 回答是否正确 +*/ +public fun is_answer_correct(user_record: &UserAnswerRecord, question_id: u64): bool { + assert!(table::contains(&user_record.answered_questions, question_id), EQuestionNotFound); + *table::borrow(&user_record.answered_questions, question_id) +} +/** +* 获取用户是否已查看解析 +* @param user_record - 用户的答题记录 +* @param question_id - 问题ID +* @return 是否已查看解析 +*/ +public fun has_viewed_solution(user_record: &UserAnswerRecord, question_id: u64): bool { + table::contains(&user_record.viewed_solutions, question_id) +} + +/** + * 添加新问题(不包含答案和解析) + * 只上传问题内容和选项,不上传答案和解析,适用于前端验证答案的场景 + * @param registry - 问题注册表 + * @param content - 问题内容 + * @param options - 问题选项 + * @param ctx - 交易上下文 + * @return 新问题的ID + */ +public entry fun add_question_without_solution( + registry: &mut QuestionRegistry, + content: String, + options: vector, + ctx: &mut TxContext, +): u64 { + // 创建问题对象,使用占位符值 + let question = Question { + id: object::new(ctx), + content, + options, + correct_answer: 0, // 占位符,不存储真实答案 + points_reward: 0, // 不设置奖励 + solution_cost: 0, // 不设置解析费用 + solution: string::utf8(b""), // 空解析 + }; + + // 获取并保存问题ID + let question_id = registry.next_question_id; + + // 添加到问题列表 + table::add(&mut registry.questions, question_id, question); + + // 更新下一个问题ID(自增) + registry.next_question_id = question_id + 1; + + // 发出问题创建事件 + emit_question_created(question_id, content, 0); + + // 返回问题ID + question_id +} + +/** + * 添加简化问题(只有内容,没有选项、答案和解析) + * 适用于前端处理选项和验证答案的场景 + * @param registry - 问题注册表 + * @param content - 问题内容 + * @param ctx - 交易上下文 + * @return 新问题的ID + */ +public entry fun add_simple_question( + registry: &mut QuestionRegistry, + content: String, + ctx: &mut TxContext, +): u64 { + // 创建问题对象,使用空选项和占位符值 + let empty_options = vector::empty(); + + let question = Question { + id: object::new(ctx), + content, + options: empty_options, + correct_answer: 0, // 占位符,不存储真实答案 + points_reward: 0, // 不设置奖励 + solution_cost: 0, // 不设置解析费用 + solution: string::utf8(b""), // 空解析 + }; + + // 获取并保存问题ID + let question_id = registry.next_question_id; + + // 添加到问题列表 + table::add(&mut registry.questions, question_id, question); + + // 更新下一个问题ID(自增) + registry.next_question_id = question_id + 1; + + // 发出问题创建事件 + emit_question_created(question_id, content, 0); + + // 返回问题ID + question_id +} + +/** + * 简化版查看解析(不需要问题ID) + * 用户直接支付一定数量的积分,不关联特定问题 + * @param manager - Quiz管理器 + * @param payment - 用户的积分代币 + * @param amount - 要销毁的积分数量 + * @param ctx - 交易上下文 + */ +public entry fun view_solution_simple( + manager: &mut QuizManager, + payment: &mut Coin, + amount: u64, + ctx: &mut TxContext, +) { + // 检查用户积分是否足够 + assert!(coin::value(payment) >= amount, EInsufficientBalance); + + // 从代币中分割出需要销毁的数量 + let burn_amount = coin::split(payment, amount, ctx); + + // 销毁代币 + point_token::burn_tokens(manager, burn_amount); + + // 触发解析查看事件,使用0作为占位符问题ID + emit_solution_viewed(tx_context::sender(ctx), 0, amount); +} \ No newline at end of file diff --git a/move202503/AKAKing23/code/chain_contract/sources/sbt.move b/move202503/AKAKing23/code/chain_contract/sources/sbt.move new file mode 100644 index 00000000..a784d41e --- /dev/null +++ b/move202503/AKAKing23/code/chain_contract/sources/sbt.move @@ -0,0 +1,294 @@ +/** + * 灵魂绑定代币(SBT)模块 + * 实现不可转让的数字凭证,用于证明用户身份或成就 + */ +module chain_contract::sbt; + +use std::string::{Self, String}; +use sui::display; +use sui::event; +use sui::object::{Self, UID}; +use sui::package; +use sui::table::{Self, Table}; +use sui::transfer; +use sui::tx_context::{Self, TxContext}; + +// ===== 错误代码 ===== +/// SBT不允许转移错误 +const ESoulboundTransferNotAllowed: u64 = 1; +/// 非拥有者操作错误 +const ENotOwner: u64 = 2; +/// 未达到铸造条件 +const EConditionNotMet: u64 = 3; + +// ===== 类型定义 ===== +/** + * SBT主对象,由用户拥有 + * 代表一个不可转让的灵魂绑定代币 + */ +// public struct SoulboundToken has key, store { +public struct SoulboundToken has key { + id: UID, + /// SBT名称 + name: String, + /// SBT描述 + description: String, + /// 元数据URL(如图像) + url: String, + /// 发行者地址 + issuer: address, + /// 其他自定义属性 + attributes: Table, +} + +/** + * 发布者凭证,用于验证发布者身份 + * 持有此凭证的地址有权铸造新的SBT + */ +public struct IssuerCap has key, store { + id: UID, + /// 发行者地址 + issuer: address, +} + +/** + * 一次性见证对象,用于初始化 + * 仅在模块部署时使用一次 + */ +public struct SBT has drop {} + +// ===== 事件 ===== +/** + * 当SBT被铸造时发出的事件 + * 记录铸造情况供链下应用查询 + */ +public struct SBTMinted has copy, drop { + /// 代币ID(对象地址) + id: address, + /// 接收者地址 + recipient: address, + /// 代币名称 + name: String, +} + +// ===== 模块初始化 ===== +/** + * 初始化SBT模块 + * 在部署时执行一次,设置显示规则并创建发行者凭证 + * @param otw - 一次性见证对象 + * @param ctx - 交易上下文 + */ +fun init(otw: SBT, ctx: &mut TxContext) { + let publisher = package::claim(otw, ctx); + + // 创建显示信息字段 + let keys = vector[ + string::utf8(b"name"), + string::utf8(b"description"), + string::utf8(b"image_url"), + string::utf8(b"issuer"), + ]; + + // 创建显示信息的值映射 + let values = vector[ + string::utf8(b"{name}"), + string::utf8(b"{description}"), + string::utf8(b"{url}"), + string::utf8(b"{issuer}"), + ]; + + // 创建Display对象,用于NFT展示 + let mut display_obj = display::new_with_fields( + &publisher, + keys, + values, + ctx, + ); + display::update_version(&mut display_obj); + transfer::public_transfer(display_obj, tx_context::sender(ctx)); + + // 转移发布者对象,使其不再可访问 + transfer::public_transfer(publisher, tx_context::sender(ctx)); + + // 创建并转移发行者凭证给模块部署者 + let issuer_cap = IssuerCap { + id: object::new(ctx), + issuer: tx_context::sender(ctx), + }; + transfer::transfer(issuer_cap, tx_context::sender(ctx)); +} + +// ===== 公共函数 ===== +/** + * 铸造一个新的SBT + * 只有发行者能铸造SBT,代币直接转移给接收者 + * @param issuer_cap - 发行者凭证 + * @param name - SBT名称 + * @param description - SBT描述 + * @param url - 元数据URL + * @param recipient - 接收者地址 + * @param ctx - 交易上下文 + */ +public entry fun mint( + issuer_cap: &IssuerCap, + name: String, + description: String, + url: String, + recipient: address, + ctx: &mut TxContext, +) { + // 创建属性表 + let attributes = table::new(ctx); + + // 创建SBT对象 + let sbt = SoulboundToken { + id: object::new(ctx), + name, + description, + url, + issuer: issuer_cap.issuer, + attributes, + }; + + // 发出铸造事件 + event::emit(SBTMinted { + id: object::uid_to_address(&sbt.id), + recipient, + name: sbt.name, + }); + + // 直接转移给接收者 + transfer::transfer(sbt, recipient); +} + +/** + * 用户自助铸造成就SBT + * 允许用户在完成所有测验后自己铸造成就SBT + * 此函数不需要IssuerCap,但需要传入quiz_score和total_questions以验证条件 + * + * @param name - SBT名称 + * @param description - SBT描述 + * @param url - 元数据URL + * @param quiz_score - 用户的测验得分 + * @param total_questions - 测验的总题目数 + * @param ctx - 交易上下文 + */ +public entry fun self_mint_achievement( + name: String, + description: String, + url: String, + quiz_score: u64, + total_questions: u64, + ctx: &mut TxContext, +) { + // 验证条件:分数必须等于总题目数(即全部答对) + assert!(quiz_score == total_questions && total_questions > 0, EConditionNotMet); + + // 创建属性表 + let mut attributes = table::new(ctx); + + // 添加成就相关属性(使用预定义的字符串值,而不是尝试转换数字) + table::add(&mut attributes, string::utf8(b"quiz_score"), string::utf8(b"perfect_score")); + table::add(&mut attributes, string::utf8(b"total_questions"), string::utf8(b"all_correct")); + table::add(&mut attributes, string::utf8(b"achievement_type"), string::utf8(b"quiz_master")); + + // 获取交易发送者 + let recipient = tx_context::sender(ctx); + + // 创建SBT对象 + let sbt = SoulboundToken { + id: object::new(ctx), + name, + description, + url, + issuer: recipient, // 自助铸造的情况下,发行者就是用户自己 + attributes, + }; + + // 发出铸造事件 + event::emit(SBTMinted { + id: object::uid_to_address(&sbt.id), + recipient, + name: sbt.name, + }); + + // 直接转移给用户自己 + transfer::transfer(sbt, recipient); +} + +/** + * 添加SBT属性,仅所有者可调用 + * @param sbt - SBT对象 + * @param name - 属性名称 + * @param value - 属性值 + * @param ctx - 交易上下文 + */ +public entry fun add_attribute( + sbt: &mut SoulboundToken, + name: String, + value: String, + ctx: &mut TxContext, +) { + // 由于无法直接获取对象所有者,我们使用交易发送者作为授权 + // 这里的前提是交易必须由SBT所有者发起 + let _sender = tx_context::sender(ctx); + + // 添加或更新属性 + table::add(&mut sbt.attributes, name, value); +} + +/** + * 查询SBT的属性值 + * @param sbt - SBT对象 + * @param name - 属性名称 + * @return 属性值 + */ +public fun get_attribute(sbt: &SoulboundToken, name: &String): String { + *table::borrow(&sbt.attributes, *name) +} + +/** + * 验证是否存在某个属性 + * @param sbt - SBT对象 + * @param name - 属性名称 + * @return 是否存在该属性 + */ +public fun has_attribute(sbt: &SoulboundToken, name: &String): bool { + table::contains(&sbt.attributes, *name) +} + +/** + * 获取SBT的名称 + * @param sbt - SBT对象 + * @return SBT名称 + */ +public fun name(sbt: &SoulboundToken): String { + sbt.name +} + +/** + * 获取SBT的描述 + * @param sbt - SBT对象 + * @return SBT描述 + */ +public fun description(sbt: &SoulboundToken): String { + sbt.description +} + +/** + * 获取SBT的URL + * @param sbt - SBT对象 + * @return SBT的元数据URL + */ +public fun url(sbt: &SoulboundToken): String { + sbt.url +} + +/** + * 获取SBT的发行者 + * @param sbt - SBT对象 + * @return 发行者地址 + */ +public fun issuer(sbt: &SoulboundToken): address { + sbt.issuer +} diff --git a/move202503/AKAKing23/code/chain_contract/sources/sbt_scripts.move b/move202503/AKAKing23/code/chain_contract/sources/sbt_scripts.move new file mode 100644 index 00000000..299ccca4 --- /dev/null +++ b/move202503/AKAKing23/code/chain_contract/sources/sbt_scripts.move @@ -0,0 +1,87 @@ +/** + * SBT批量操作脚本模块 + * 提供批量铸造SBT和批量添加属性的便捷功能 + */ +module chain_contract::sbt_scripts; + +use chain_contract::sbt::{Self, IssuerCap}; +use std::string::{Self, String}; +use std::vector; +use sui::tx_context::{Self, TxContext}; + +/** + * 使用发行者凭证批量铸造SBT给多个用户 + * 一次操作可以为多个接收者创建多个SBT,提高效率 + * + * @param cap - 发行者凭证,用于验证铸造权限 + * @param names - SBT名称列表 + * @param descriptions - SBT描述列表 + * @param urls - SBT图像URL列表 + * @param recipients - 接收者地址列表 + * @param ctx - 交易上下文 + */ +public entry fun batch_mint( + cap: &IssuerCap, + names: vector, + descriptions: vector, + urls: vector, + recipients: vector
, + ctx: &mut TxContext, +) { + let len = vector::length(&names); + + // 验证所有输入向量长度一致 + assert!( + vector::length(&descriptions) == len && + vector::length(&urls) == len && + vector::length(&recipients) == len, + 0, // 输入长度不一致错误 + ); + + // 循环为每个接收者铸造SBT + let mut i = 0; + while (i < len) { + sbt::mint( + cap, + *vector::borrow(&names, i), + *vector::borrow(&descriptions, i), + *vector::borrow(&urls, i), + *vector::borrow(&recipients, i), + ctx, + ); + i = i + 1; + } +} + +/** + * 为SBT添加多个属性 + * 批量为一个SBT添加多个名称-值对属性 + * + * @param token - 要添加属性的SBT + * @param names - 属性名称列表 + * @param values - 属性值列表 + * @param ctx - 交易上下文 + */ +public entry fun add_multiple_attributes( + token: &mut sbt::SoulboundToken, + names: vector, + values: vector, + ctx: &mut TxContext, +) { + let len = vector::length(&names); + + // 验证所有输入向量长度一致 + assert!(vector::length(&values) == len, 0); + + // 循环添加每个属性 + let mut i = 0; + while (i < len) { + sbt::add_attribute( + token, + *vector::borrow(&names, i), + *vector::borrow(&values, i), + ctx, + ); + i = i + 1; + } +} diff --git a/move202503/AKAKing23/code/chain_contract/sources/seal_quiz_walrus.move b/move202503/AKAKing23/code/chain_contract/sources/seal_quiz_walrus.move new file mode 100644 index 00000000..0e10afe5 --- /dev/null +++ b/move202503/AKAKing23/code/chain_contract/sources/seal_quiz_walrus.move @@ -0,0 +1,133 @@ +/** + * 基于SUI SEAL的题目信息加密存储模块 + * 提供题目数据的加密存储功能,使用Walrus存储加密数据 + */ +module chain_contract::seal_quiz_walrus { + use std::string::{Self, String}; + use sui::object::{Self, UID}; + use sui::transfer; + use sui::tx_context::{Self, TxContext}; + use sui::event; + + /// 错误码 + /// 未授权操作错误 + const ENotAuthorized: u64 = 0; + + /** + * 题目Blob引用结构 + * 关联题目数据和Walrus blobId + */ + public struct QuizBlobRef has key, store { + id: UID, + /// 创建者地址 + creator: address, + /// Walrus中的blobId + blob_id: String, + /// 题目难度级别 + difficulty: String, + /// 创建时间戳 + created_at: u64, + } + + /** + * 题目Blob发布事件 + * 当题目数据被加密并关联到链上时触发 + */ + public struct BlobPublished has copy, drop { + /// 创建者地址 + creator: address, + /// Walrus中的blobId + blob_id: String, + /// 题目难度级别 + difficulty: String, + } + + /** + * 发布题目Blob信息到链上 + * 基本版本,使用默认难度 + * @param sender_addr - 发送者地址 + * @param blob_id - Walrus中的blobId + * @param ctx - 交易上下文 + */ + public entry fun publish( + sender_addr: address, + blob_id: String, + ctx: &mut TxContext + ) { + // 使用默认难度 + let difficulty = string::utf8(b"default"); + + // 创建题目Blob引用 + let quiz_blob = QuizBlobRef { + id: object::new(ctx), + creator: sender_addr, + blob_id, + difficulty, + created_at: tx_context::epoch(ctx), + }; + + // 发布事件 + event::emit( + BlobPublished { + creator: sender_addr, + blob_id, + difficulty, + } + ); + + // 将对象转移给发送者 + transfer::transfer(quiz_blob, sender_addr); + } + + /** + * 发布题目Blob信息到链上,前端调用时默认使用此函数 + * 接收难度参数并处理 + * @param sender_addr - 发送者地址 + * @param blob_id - Walrus中的blobId + * @param difficulty - 题目难度级别 + * @param ctx - 交易上下文 + */ + public entry fun publish_with_difficulty( + sender_addr: address, + blob_id: String, + difficulty: String, + ctx: &mut TxContext + ) { + // 创建题目Blob引用 + let quiz_blob = QuizBlobRef { + id: object::new(ctx), + creator: sender_addr, + blob_id, + difficulty, + created_at: tx_context::epoch(ctx), + }; + + // 发布事件 + event::emit( + BlobPublished { + creator: sender_addr, + blob_id, + difficulty, + } + ); + + // 将对象转移给发送者 + transfer::transfer(quiz_blob, sender_addr); + } + + /** + * 查询指定难度下的所有题目Blob列表 + * 这个函数仅定义接口,实际实现需要在前端通过事件索引完成 + * @param difficulty - 题目难度级别 + * @param ctx - 交易上下文 + */ + public entry fun query_blobs_by_difficulty( + difficulty: String, + _ctx: &mut TxContext + ) { + // 实际查询通过前端事件索引实现 + // 此函数仅作为接口定义,不包含具体实现 + // 仅用于匹配前端调用需求 + let _d = difficulty; + } +} diff --git a/move202503/AKAKing23/code/chain_contract/sources/zk_verifier.move b/move202503/AKAKing23/code/chain_contract/sources/zk_verifier.move new file mode 100644 index 00000000..48f21132 --- /dev/null +++ b/move202503/AKAKing23/code/chain_contract/sources/zk_verifier.move @@ -0,0 +1,187 @@ +/** + * 零知识证明验证器 + * 用于验证用户的能力证明,而不暴露具体信息 + */ +module chain_contract::zk_verifier; + +use std::string::{Self, String}; +use std::vector; +use sui::event; +use sui::object::{Self, UID}; +use sui::table::{Self, Table}; +use sui::transfer; +use sui::tx_context::{Self, TxContext}; +use sui::groth16; + +// ===== 错误代码 ===== +/// 验证失败错误 +const EVerificationFailed: u64 = 1; +/// 非授权操作错误 +const ENotAuthorized: u64 = 2; +/// 验证密钥不存在错误 +const EVerificationKeyNotFound: u64 = 3; +/// 格式错误 +const EInvalidFormat: u64 = 4; + +// ===== 类型定义 ===== + +/// 零知识证明验证器对象,用于存储和管理验证密钥 +public struct ZkVerifier has key { + id: UID, + /// 管理员地址 + admin: address, + /// 验证密钥,电路名称 -> 验证密钥字节 + verification_keys: Table>, + /// 已经准备好的验证密钥 + prepared_vks: Table>>, +} + +// ===== 事件 ===== + +/// 验证结果事件 +public struct VerificationResult has copy, drop { + /// 用户地址 + user: address, + /// 电路名称 + circuit_name: String, + /// 验证是否通过 + is_verified: bool, + /// 要求等级 + required_level: u64, +} + +/// 验证密钥添加事件 +public struct VerificationKeyAdded has copy, drop { + /// 管理员地址 + admin: address, + /// 电路名称 + circuit_name: String, +} + +// ===== 初始化 ===== + +/// 创建验证器对象 +public entry fun create_verifier(ctx: &mut TxContext) { + let verifier = ZkVerifier { + id: object::new(ctx), + admin: tx_context::sender(ctx), + verification_keys: table::new(ctx), + prepared_vks: table::new(ctx), + }; + + // 共享验证器对象,使其全局可访问 + transfer::share_object(verifier); +} + +fun init(ctx: &mut TxContext) { + // 创建验证器对象并共享 + let verifier = ZkVerifier { + id: object::new(ctx), + // admin: tx_context::sender(ctx), + admin: @0xe75a090888082e699c99b6877f93aaacedba68cd172f32006605e76b99260bb8, + verification_keys: table::new(ctx), + prepared_vks: table::new(ctx), + }; + + transfer::share_object(verifier); +} + +// ===== 公共函数 ===== + +/// 添加验证密钥并准备验证密钥 +/// @param verifier - 验证器对象 +/// @param circuit_name - 电路名称 +/// @param verification_key - 验证密钥字节 +/// @param use_bn254 - 使用BN254曲线(true)还是BLS12-381曲线(false) +/// @param ctx - 交易上下文 +public entry fun add_verification_key( + verifier: &mut ZkVerifier, + circuit_name: String, + verification_key: vector, + use_bn254: bool, + ctx: &mut TxContext, +) { + // 验证调用者是管理员 + assert!(tx_context::sender(ctx) == verifier.admin, ENotAuthorized); + + // 添加验证密钥 + table::add(&mut verifier.verification_keys, circuit_name, verification_key); + + // 准备验证密钥 + let pvk = if (use_bn254) { + groth16::prepare_verifying_key(&groth16::bn254(), &verification_key) + } else { + groth16::prepare_verifying_key(&groth16::bls12381(), &verification_key) + }; + + // 保存准备好的验证密钥 + table::add(&mut verifier.prepared_vks, circuit_name, pvk); + + // 发出事件 + event::emit(VerificationKeyAdded { + admin: verifier.admin, + circuit_name, + }); +} + +/// 验证零知识证明 +/// @param verifier - 验证器对象 +/// @param circuit_name - 电路名称 +/// @param proof - 证明字节 +/// @param public_inputs - 公共输入字节 +/// @param required_level - 要求等级 +/// @param use_bn254 - 使用BN254曲线(true)还是BLS12-381曲线(false) +/// @param ctx - 交易上下文 +public entry fun verify_proof( + verifier: &ZkVerifier, + circuit_name: String, + proof: vector, + public_inputs: vector, + required_level: u64, + use_bn254: bool, + ctx: &mut TxContext, +) { + // 验证密钥是否存在 + assert!(table::contains(&verifier.prepared_vks, circuit_name), EVerificationKeyNotFound); + + // 获取准备好的验证密钥 + let pvk = table::borrow(&verifier.prepared_vks, circuit_name); + + // 转换证明和公共输入为Groth16格式 + let proof_points = groth16::proof_points_from_bytes(proof); + let public_inputs_vec = groth16::public_proof_inputs_from_bytes(public_inputs); + + // 使用Sui的原生Groth16函数进行验证 + let is_verified = if (use_bn254) { + groth16::verify_groth16_proof(&groth16::bn254(), pvk, &public_inputs_vec, &proof_points) + } else { + groth16::verify_groth16_proof(&groth16::bls12381(), pvk, &public_inputs_vec, &proof_points) + }; + + // 确保验证通过 + assert!(is_verified, EVerificationFailed); + + // 发出验证结果事件 + event::emit(VerificationResult { + user: tx_context::sender(ctx), + circuit_name, + is_verified, + required_level, + }); +} + +/// 获取原始验证密钥 +/// @param verifier - 验证器对象 +/// @param circuit_name - 电路名称 +/// @return 验证密钥字节 +public fun get_verification_key(verifier: &ZkVerifier, circuit_name: &String): vector { + *table::borrow(&verifier.verification_keys, *circuit_name) +} + +/// 获取准备好的验证密钥 +/// @param verifier - 验证器对象 +/// @param circuit_name - 电路名称 +/// @return 准备好的验证密钥 +public fun get_prepared_verification_key(verifier: &ZkVerifier, circuit_name: &String): vector> { + *table::borrow(&verifier.prepared_vks, *circuit_name) +} \ No newline at end of file diff --git a/move202503/AKAKing23/code/chain_front/.env b/move202503/AKAKing23/code/chain_front/.env new file mode 100644 index 00000000..e69de29b diff --git a/move202503/AKAKing23/code/chain_front/.gitignore b/move202503/AKAKing23/code/chain_front/.gitignore new file mode 100644 index 00000000..a547bf36 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/.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/move202503/AKAKing23/code/chain_front/components.json b/move202503/AKAKing23/code/chain_front/components.json new file mode 100644 index 00000000..73afbdbc --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/index.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} \ No newline at end of file diff --git a/move202503/AKAKing23/code/chain_front/eslint.config.js b/move202503/AKAKing23/code/chain_front/eslint.config.js new file mode 100644 index 00000000..092408a9 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/eslint.config.js @@ -0,0 +1,28 @@ +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' + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +) diff --git a/move202503/AKAKing23/code/chain_front/index.html b/move202503/AKAKing23/code/chain_front/index.html new file mode 100644 index 00000000..28abdcdf --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/index.html @@ -0,0 +1,14 @@ + + + + + + + + LearnChain-X + + +
+ + + diff --git a/move202503/AKAKing23/code/chain_front/lang/index.js b/move202503/AKAKing23/code/chain_front/lang/index.js new file mode 100644 index 00000000..4f2829c3 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/lang/index.js @@ -0,0 +1,61 @@ + + // 导入国际化JSON文件 + import langJSON from './index.json' + (function () { + // 定义翻译函数 + let $t = function (key, val, nameSpace) { + // 获取指定命名空间下的语言包 + const langPackage = $t[nameSpace]; + // 返回翻译结果,如果不存在则返回默认值 + return (langPackage || {})[key] || val; + }; + // 定义简单翻译函数,直接返回传入的值 + let $$t = function (val) { + return val; + }; + globalThis.$deepScan = function (val) { + return val; + }; + // 定义设置语言包的方法 + $t.locale = function (locale, nameSpace) { + // 将指定命名空间下的语言包设置为传入的locale + $t[nameSpace] = locale || {}; + }; + // 将翻译函数挂载到globalThis对象上,如果已经存在则使用已有的 + globalThis.$t = globalThis.$t || $t; + // 将简单翻译函数挂载到globalThis对象上 + globalThis.$$t = $$t; + // 定义从JSON文件中获取指定键的语言对象的方法 + globalThis._getJSONKey = function (key, insertJSONObj = undefined) { + // 获取JSON对象 + const JSONObj = insertJSONObj; + // 初始化语言对象 + const langObj = {}; + // 遍历JSON对象的所有键 + Object.keys(JSONObj).forEach((value) => { + // 将每个语言的对应键值添加到语言对象中 + langObj[value] = JSONObj[value][key]; + }); + // 返回语言对象 + return langObj; + }; + })(); + // 定义语言映射对象 + const langMap = { + 'en': (globalThis && globalThis.lang && globalThis.lang.en) ? globalThis.lang.en : globalThis._getJSONKey('en', langJSON), +'ko': (globalThis && globalThis.lang && globalThis.lang.ko) ? globalThis.lang.ko : globalThis._getJSONKey('ko', langJSON), +'ja': (globalThis && globalThis.lang && globalThis.lang.ja) ? globalThis.lang.ja : globalThis._getJSONKey('ja', langJSON), +'zhcn': (globalThis && globalThis.lang && globalThis.lang.zhcn) ? globalThis.lang.zhcn : globalThis._getJSONKey('zh-cn', langJSON) + }; + // 存储语言是否存在 + // 判断 globalThis.localStorage.getItem 是否为函数 + const isFunction = (fn) => { + return typeof fn === 'function'; + }; + const withStorageLang = isFunction && globalThis && globalThis.localStorage && + isFunction(globalThis.localStorage.getItem) && globalThis.localStorage.getItem('lang'); + // 从本地存储中获取当前语言,如果不存在则使用源语言 + const lang = withStorageLang ? globalThis.localStorage.getItem('lang') : 'zhcn'; + // 根据当前语言设置翻译函数的语言包 + globalThis.$t.locale(langMap[lang], 'lang'); + \ No newline at end of file diff --git a/move202503/AKAKing23/code/chain_front/lang/index.json b/move202503/AKAKing23/code/chain_front/lang/index.json new file mode 100644 index 00000000..3abb19ad --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/lang/index.json @@ -0,0 +1,926 @@ +{ + "nc8vrob": { + "zh-cn": "404 - 页面未找到", + "en": "404- Page not found", + "ko": "404 - 페이지를 찾을 수 없음", + "ja": "404-ページが見つかりません" + }, + "sq9zfxd": { + "zh-cn": "抱歉,您访问的页面不存在。", + "en": "Sorry, the page you visited does not exist.", + "ko": "죄송합니다. 방문한 페이지가 없습니다.", + "ja": "申し訳ありませんが、アクセスしたページは存在しません。" + }, + "iijhd54": { + "zh-cn": "返回首页", + "en": "homepage", + "ko": "첫 페이지로 돌아가기", + "ja": "トップページに戻る" + }, + "qylb2": { + "zh-cn": "首页", + "en": "home page", + "ko": "첫 페이지", + "ja": "トップページ" + }, + "ohcd2": { + "zh-cn": "课程", + "en": "course", + "ko": "과정", + "ja": "カリキュラム" + }, + "ea9n2": { + "zh-cn": "关于", + "en": "about", + "ko": "정보", + "ja": "について" + }, + "a6ttl24": { + "zh-cn": "个人中心", + "en": "Personal Center", + "ko": "개인 센터", + "ja": "パーソナルセンター" + }, + "boes5fl": { + "zh-cn": "LearnChain-X. 保留所有权利。", + "en": "LearnChain-X. All rights reserved.", + "ko": "LearnChain-X. 모든 권리를 보유합니다.", + "ja": "LearnChain-X.すべての権利を保持します。" + }, + "2g231m7": { + "zh-cn": "区块链基础入门", + "en": "Introduction to Blockchain Fundamentals", + "ko": "블록체인 기반 시작", + "ja": "ブロックチェーン基礎入門" + }, + "8wuwcui": { + "zh-cn": "了解区块链的基本概念、原理和应用场景", + "en": "Understand the basic concepts, principles, and application scenarios of blockchain", + "ko": "블록체인의 기본 개념, 원리와 응용 장면을 이해하다", + "ja": "ブロックチェーンの基本概念、原理、応用シーンを理解する" + }, + "enu22": { + "zh-cn": "初级", + "en": "primary", + "ko": "초급", + "ja": "初級" + }, + "isu6eda": { + "zh-cn": "以太坊与智能合约开发", + "en": "Ethereum and Smart Contract Development", + "ko": "이더리움과 스마트 계약 개발", + "ja": "エーテル坊とインテリジェント契約開発" + }, + "igmduhm": { + "zh-cn": "学习以太坊平台和Solidity智能合约开发", + "en": "Learn Ethereum platform and Solidity smart contract development", + "ko": "학습 이더리움 플랫폼 및 Solidity 스마트 계약 개발", + "ja": "イーサ坊プラットフォームとSolidityインテリジェント契約開発を学ぶ" + }, + "dzq22": { + "zh-cn": "中级", + "en": "intermediate", + "ko": "중급", + "ja": "中級" + }, + "4a0ra0a": { + "zh-cn": "DApp全栈开发实战", + "en": "DApp Full Stack Development Practice", + "ko": "DApp 전체 스택 개발 실전", + "ja": "DAppフルスタック開発の実戦" + }, + "r16pa5h": { + "zh-cn": "从前端到后端,完整开发去中心化应用", + "en": "Complete development of decentralized applications from front-end to back-end", + "ko": "프런트엔드에서 백엔드로 분산된 애플리케이션을 완벽하게 개발", + "ja": "フロントエンドからバックエンドまで、完全なデセンタリングアプリケーションの開発" + }, + "r1732": { + "zh-cn": "高级", + "en": "senior", + "ko": "고급", + "ja": "高級" + }, + "i5xola4": { + "zh-cn": "课程列表", + "en": "Course List", + "ko": "강좌 목록", + "ja": "カリキュラムリスト" + }, + "miyky3": { + "zh-cn": "难度:", + "en": "Difficulty:", + "ko": "난이도:", + "ja": "難易度:" + }, + "dluvhh4": { + "zh-cn": "查看详情", + "en": "View details", + "ko": "자세히 보기", + "ja": "詳細の表示" + }, + "glwp2": { + "zh-cn": "张三", + "en": "Zhang San", + "ko": "장 삼", + "ja": "張三" + }, + "2gbxpg7": { + "zh-cn": "区块链基础认证", + "en": "Blockchain Basic Authentication", + "ko": "블록체인 기반 인증", + "ja": "ブロックチェーン基礎認証" + }, + "f6qmm54": { + "zh-cn": "用户信息", + "en": "user information", + "ko": "사용자 정보", + "ja": "ユーザー情報" + }, + "djxsw3": { + "zh-cn": "姓名:", + "en": "full name:", + "ko": "이름:", + "ja": "名前:" + }, + "lrxlj3": { + "zh-cn": "邮箱:", + "en": "Email:", + "ko": "메일박스:", + "ja": "メールアドレス:" + }, + "cvbkio4": { + "zh-cn": "我的课程", + "en": "My courses", + "ko": "내 수업", + "ja": "マイレッスン" + }, + "14e734": { + "zh-cn": "% 完成", + "en": "%Completed", + "ko": "% 완료", + "ja": "%完了" + }, + "gj8zz44": { + "zh-cn": "继续学习", + "en": "Continue learning", + "ko": "계속 공부하다", + "ja": "勉強を続ける" + }, + "cvbafs4": { + "zh-cn": "我的证书", + "en": "My certificate", + "ko": "내 인증서", + "ja": "マイ証明書" + }, + "u9qfog5": { + "zh-cn": "获得日期:", + "en": "Date of Acquisition:", + "ko": "획득 날짜:", + "ja": "取得日:" + }, + "cg3pdz5": { + "zh-cn": "学习区块链", + "en": "Learn about blockchain technology", + "ko": "블록체인 학습", + "ja": "学習ブロックチェーン" + }, + "oqtkmww": { + "zh-cn": "欢迎来到LearnChain-X平台,这里提供区块链技术学习资源", + "en": "Welcome to LearnChain-X platform, which provides learning resources for blockchain technology", + "ko": "블록체인 기술 학습 리소스를 제공하는 LearnChain-X 플랫폼에 오신 것을 환영합니다.", + "ja": "ブロックチェーン技術学習リソースを提供するLearnChain-Xプラットフォームへようこそ" + }, + "alt7ee4": { + "zh-cn": "关于我们", + "en": "About Us", + "ko": "우리에 대해", + "ja": "私たちについて" + }, + "9g7okj1e": { + "zh-cn": "LearnChain-X是一个专注于区块链技术教育的平台,我们致力于帮助更多人了解和掌握区块链技术。", + "en": "LearnChain-X is a platform dedicated to blockchain technology education, and we are committed to helping more people understand and master blockchain technology.", + "ko": "LearnChain-X는 더 많은 사람들이 블록체인 기술을 이해하고 이해할 수 있도록 돕는 블록체인 기술 교육에 집중하는 플랫폼입니다.", + "ja": "LearnChain-Xはブロックチェーン技術教育に専念するプラットフォームであり、ブロックチェーン技術の理解と把握をより多くの人に支援することに力を入れています。" + }, + "6w5eu519": { + "zh-cn": "我们提供从入门到精通的系列课程,涵盖区块链基础知识、智能合约开发、DApp开发等多个方面。", + "en": "We offer a series of courses from beginner to master, covering various aspects such as blockchain fundamentals, smart contract development, DApp development, and more.", + "ko": "우리는 블록체인 기초 지식, 스마트 계약 개발, DApp 개발 등 다양한 방면을 포괄하는 입문부터 정통까지 일련의 과정을 제공한다.", + "ja": "ブロックチェーンの基礎知識、インテリジェント契約開発、DApp開発など、入門から精通までの一連のカリキュラムを提供しています。" + }, + "watri15": { + "zh-cn": "我们的使命", + "en": "Our mission", + "ko": "우리의 사명", + "ja": "私たちの使命" + }, + "hisk3xx": { + "zh-cn": "普及区块链知识,培养区块链技术人才,推动区块链技术在各行业的应用。", + "en": "Popularize blockchain knowledge, cultivate blockchain technology talents, and promote the application of blockchain technology in various industries.", + "ko": "블록체인지식을 보급하고 블록체인기술인재를 양성하며 블록체인기술의 각 업종에서의 응용을 추진한다.", + "ja": "ブロックチェーン知識を普及させ、ブロックチェーン技術の人材を育成し、各業界におけるブロックチェーン技術の応用を推進する。" + }, + "cvcu2v4": { + "zh-cn": "我的钱包", + "en": "my wallet", + "ko": "내 지갑", + "ja": "私の財布" + }, + "j407p74": { + "zh-cn": "钱包连接", + "en": "Wallet connection", + "ko": "지갑 연결", + "ja": "ウォレット接続" + }, + "ikk1174": { + "zh-cn": "连接钱包", + "en": "Connect wallet", + "ko": "지갑 연결", + "ja": "ウォレットの接続" + }, + "j3pb8i4": { + "zh-cn": "钱包信息", + "en": "Wallet information", + "ko": "지갑 정보", + "ja": "ウォレット情報" + }, + "d6kve3": { + "zh-cn": "地址:", + "en": "Address:", + "ko": "주소:", + "ja": "住所:" + }, + "cccwm3": { + "zh-cn": "余额:", + "en": "Balance:", + "ko": "잔액:", + "ja": "残高:" + }, + "27k1ha6": { + "zh-cn": "加载中...", + "en": "Loading", + "ko": "로드 중...", + "ja": "ロード中..." + }, + "d3jite": { + "zh-cn": "请连接您的钱包以查看详细信息", + "en": "Please connect your wallet to view detailed information", + "ko": "자세한 내용을 보려면 지갑에 연결하십시오.", + "ja": "財布に接続して詳細を表示してください" + }, + "dl4w3k4": { + "zh-cn": "最近交易", + "en": "RECENT TRANSACTIONS", + "ko": "최근 거래", + "ja": "最近の取引" + }, + "n0g51q6": { + "zh-cn": "暂无交易记录", + "en": "No transaction records available at the moment", + "ko": "거래 기록 없음", + "ja": "トランザクションは一時的にありません" + }, + "99puzt5": { + "zh-cn": "发送SUI", + "en": "Send SUI", + "ko": "SUI 보내기", + "ja": "SUIを送信" + }, + "ng1spz5": { + "zh-cn": "接收地址:", + "en": "Receiving address:", + "ko": "수신 주소:", + "ja": "受信アドレス:" + }, + "7u3bqc9": { + "zh-cn": "金额 (SUI):", + "en": "Amount (SUI):", + "ko": "금액(SUI):", + "ja": "金額(SUI):" + }, + "6kni416": { + "zh-cn": "发送中...", + "en": "Sending", + "ko": "보내는 중...", + "ja": "送信中..." + }, + "ydxt5p5": { + "zh-cn": "交易成功!", + "en": "Successful trade!", + "ko": "거래 성공!", + "ja": "取引成功!" + }, + "hd6r6e8": { + "zh-cn": "交易失败,请重试", + "en": "Transaction failed, please try again", + "ko": "거래 실패, 다시 시도하십시오.", + "ja": "取引に失敗しました。再試行してください" + }, + "aisqn74": { + "zh-cn": "使用说明", + "en": "instructions", + "ko": "사용 설명", + "ja": "使用方法" + }, + "wr0yq1m": { + "zh-cn": "1. 点击\"连接钱包\"按钮连接您的Sui钱包", + "en": "1. Click the \"Connect Wallet\" button to connect your Sui wallet", + "ko": "1.\"지갑 연결\"버튼을 클릭하여 Sui 지갑을 연결하십시오.", + "ja": "1.「ウォレットを接続する」ボタンをクリックしてSuiウォレットを接続します" + }, + "tk5vvbo": { + "zh-cn": "2. 连接成功后,将显示您的钱包地址和SUI余额", + "en": "After successful connection, your wallet address and SUI balance will be displayed", + "ko": "2. 연결에 성공하면 지갑 주소와 SUI 잔액이 표시됩니다.", + "ja": "2.接続が成功すると、ウォレットアドレスとSUI残高が表示されます" + }, + "chx5gbq": { + "zh-cn": "3. 您可以在Sui钱包中查看更多详细信息和执行交易", + "en": "3. You can view more detailed information and execute transactions in Sui wallet", + "ko": "3. Sui 지갑에서 자세한 내용을 확인하고 거래를 수행할 수 있습니다.", + "ja": "3.Suiウォレットで詳細を表示して取引を実行できます" + }, + "je57im9": { + "zh-cn": "知识上链,成就永恒", + "en": "Knowledge on the blockchain, achieving eternity", + "ko": "지식이 사슬에 걸려, 성과는 영원하다.", + "ja": "知識の連鎖、永遠の成果" + }, + "4tkkne1o": { + "zh-cn": "ChainLearn是一个区块链学习平台,通过AI出题和链上证书,让你的每一步学习成果都被永久记录,构建可信的能力档案。", + "en": "ChainLearn is a blockchain learning platform that uses AI generated questions and on chain certificates to permanently record every step of your learning and build a trusted competency profile.", + "ko": "ChainLearn은 AI 출제와 체인 인증서를 통해 각 단계의 학습 성과가 영구적으로 기록되도록 신뢰할 수 있는 역량 파일을 구축하는 블록체인 학습 플랫폼이다.", + "ja": "ChainLearnはブロックチェーン学習プラットフォームで、AIの出題とチェーン上の証明書を通じて、あなたの学習成果を永遠に記録し、信頼できる能力ファイルを構築します。" + }, + "bvab7j1q": { + "zh-cn": "ChainLearn-X是一个区块链学习平台,通过AI出题和链上证书,让你的每一步学习成果都被永久记录,构建可信的能力档案。", + "en": "ChainLearn-X is a blockchain learning platform that uses AI generated questions and on chain certificates to permanently record every step of your learning and build a trusted competency profile.", + "ko": "ChainLearn-X는 AI 출제와 체인 인증서를 통해 모든 단계의 학습 성과를 영구적으로 기록하고 신뢰할 수 있는 능력 파일을 구축하는 블록체인 학습 플랫폼이다.", + "ja": "ChainLearn-Xはブロックチェーン学習プラットフォームで、AI出題とチェーン上証明書を通じて、あなたの学習成果を永遠に記録し、信頼できる能力ファイルを構築します。" + }, + "ege0p3": { + "zh-cn": "已连接", + "en": "Connected", + "ko": "접속됨", + "ja": "接続済み" + }, + "g064o6y": { + "zh-cn": "请生成10道区块链相关的选择题,每道题有4个选项,格式为JSON数组", + "en": "Please generate 10 blockchain related multiple-choice questions, each with 4 options in JSON array format", + "ko": "10개의 블록체인 관련 선택 문제를 생성하십시오. 각 문제에는 4개의 옵션이 있습니다. 형식은 JSON 배열입니다.", + "ja": "10個のブロックチェーンに関する選択問題を生成してください。各問題には4つの選択肢があり、JSON配列をフォーマットしています" + }, + "30goiob": { + "zh-cn": "无法解析返回的JSON", + "en": "Unable to parse the returned JSON", + "ko": "반환된 JSON을 확인할 수 없습니다.", + "ja": "戻されたJSONを解析できません" + }, + "ghixcba": { + "zh-cn": "比特币的创始人是谁?", + "en": "Who is the founder of Bitcoin?", + "ko": "비트코인의 창시자는 누구입니까?", + "ja": "ビットコインの創始者は誰ですか。" + }, + "tbnil4l": { + "zh-cn": "以太坊网络中用于支付计算资源的货币单位是?", + "en": "What is the currency unit used to pay for computing resources in the Ethereum network?", + "ko": "이더리움 네트워크에서 결제 계산 자원에 사용되는 화폐 단위는?", + "ja": "Ethernetネットワークで計算リソースを支払うために使用される通貨単位は?" + }, + "5m1ovge": { + "zh-cn": "区块链的基本数据结构是什么?", + "en": "What is the basic data structure of blockchain?", + "ko": "블록체인의 기본 데이터 구조는 무엇입니까?", + "ja": "ブロックチェーンの基本的なデータ構造は何ですか。" + }, + "q3ai2": { + "zh-cn": "链表", + "en": "Linked list", + "ko": "체인 테이블", + "ja": "チェーンメータ" + }, + "hy6s2": { + "zh-cn": "数组", + "en": "array", + "ko": "배열", + "ja": "アレイ" + }, + "cvsmc3": { + "zh-cn": "哈希表", + "en": "Hashtable", + "ko": "해시 시계", + "ja": "ハッシュテーブル" + }, + "kdluls4": { + "zh-cn": "默克尔树", + "en": "Merkel tree", + "ko": "메르켈 트리", + "ja": "メルケルの木" + }, + "eabzesc": { + "zh-cn": "一大波题库正在来临...", + "en": "A large wave of question banks is coming", + "ko": "큰 문제집이 오고 있는데...", + "ja": "大きな問題群が来ている…" + }, + "l0ynuk5": { + "zh-cn": "测验完成!", + "en": "Test completed!", + "ko": "퀴즈 완료!", + "ja": "テスト完了!" + }, + "wysk5o5": { + "zh-cn": "您的分数:", + "en": "Your score:", + "ko": "점수:", + "ja": "スコア:" + }, + "itdrwu4": { + "zh-cn": "重新开始", + "en": "restart", + "ko": "다시 시작", + "ja": "再スタート" + }, + "6jz6oz7": { + "zh-cn": "区块链知识测验", + "en": "Blockchain Knowledge Test", + "ko": "블록체인 지식 퀴즈", + "ja": "ブロックチェーン知識試験" + }, + "qc8a2": { + "zh-cn": "问题", + "en": "problem", + "ko": "문제", + "ja": "問題" + }, + "dng21l4": { + "zh-cn": "检查答案", + "en": "check the answers", + "ko": "답안 검토", + "ja": "答えをチェック" + }, + "btmg33": { + "zh-cn": "下一题", + "en": "Next question", + "ko": "다음 문제", + "ja": "次の問題" + }, + "bykzad4": { + "zh-cn": "完成测验", + "en": "Complete the quiz", + "ko": "퀴즈 완료", + "ja": "テストを完了する" + }, + "9uocz89": { + "zh-cn": "测试你的区块链知识", + "en": "Test your blockchain knowledge", + "ko": "블록체인 지식 테스트", + "ja": "ブロックチェーンの知識をテスト" + }, + "jhg3zwn": { + "zh-cn": "完成我们的区块链选择题测验,检验你的学习成果!", + "en": "Complete our blockchain multiple-choice test to test your learning outcomes!", + "ko": "우리의 블록체인 선택 문제 퀴즈를 완성하고, 당신의 학습 성과를 검증합니다!", + "ja": "私たちのブロックチェーン選択問題のテストを完了して、あなたの学習成果を検証します!" + }, + "cd1tws4": { + "zh-cn": "开始测验", + "en": "Start the test", + "ko": "퀴즈 시작", + "ja": "テストを開始" + }, + "i7bwwmx": { + "zh-cn": "请生成3道区块链相关的选择题,每道题有4个选项,格式为JSON数组", + "en": "Please generate 3 blockchain related multiple-choice questions, each with 4 options in JSON array format", + "ko": "3개의 블록체인 관련 선택 문제를 생성하십시오. 각 문제에는 4개의 옵션이 있습니다. 형식은 JSON 배열입니다.", + "ja": "3つのブロックチェーンに関する選択問題を生成してください。各問題には4つの選択肢があり、JSON配列の形式になっています" + }, + "v1slm48": { + "zh-cn": "加载题目中...", + "en": "Loading the title", + "ko": "제목 로드 중...", + "ja": "タイトルをロード中..." + }, + "fonrv77": { + "zh-cn": "✓ 回答正确!", + "en": "✓ Correct answer!", + "ko": "♦ 정답!", + "ja": "$正解!" + }, + "3jc4307": { + "zh-cn": "✗ 回答错误!", + "en": "✗ Incorrect answer!", + "ko": "땡 땡!", + "ja": "❝答えが間違っている!" + }, + "jbaeav12": { + "zh-cn": "请生成3道初级Move语言相关的选择题,每道题有4个选项,格式为JSON数组", + "en": "Please generate 3 multiple-choice questions related to the beginner Move language, each with 4 options in JSON array format", + "ko": "JSON 배열 형식으로 4개의 옵션이 있는 3개의 기본 Move 언어 관련 선택 문제를 생성하십시오.", + "ja": "3つの初級Move言語に関する選択問題を生成してください。各問題には4つの選択肢があり、JSON配列の形式になっています" + }, + "zhxf5wo": { + "zh-cn": "区块链中,以下哪个特性是Sui区块链的独特优势?", + "en": "Which of the following features is the unique advantage of Sui blockchain in blockchain?", + "ko": "블록체인에서 다음 중 Sui 블록체인의 독특한 장점은 무엇입니까?", + "ja": "ブロックチェーンの中で、以下のどの特性がSuiブロックチェーンの独特な優位性ですか?" + }, + "8i6buod": { + "zh-cn": "并行交易处理和对象级所有权", + "en": "Parallel transaction processing and object level ownership", + "ko": "동시 거래 처리 및 객체 수준 소유권", + "ja": "同時取引処理とオブジェクト・レベルの所有権" + }, + "a49hvsj": { + "zh-cn": "使用Proof of Work共识算法", + "en": "Using the Proof of Work consensus algorithm", + "ko": "Proof of Work 합의 알고리즘 사용", + "ja": "Proof of Workコンセンサスアルゴリズムの使用" + }, + "9qbr1c7": { + "zh-cn": "不支持智能合约", + "en": "Not supporting smart contracts", + "ko": "스마트 계약이 지원되지 않음", + "ja": "スマート契約はサポートされていません" + }, + "y9chktf": { + "zh-cn": "只能发行不可替代代币(NFT)", + "en": "Can only issue non fungible tokens (NFTs)", + "ko": "대체 불가능한 토큰만 발행할 수 있음(NFT)", + "ja": "代替不可能なトークンのみ発行可能(NFT)" + }, + "kdquqor": { + "zh-cn": "在Sui Move语言中,以下哪种类型是Sui特有的?", + "en": "Which of the following types is unique to Sui Move language?", + "ko": "Sui Move 언어에서 Sui 고유의 유형은 무엇입니까?", + "ja": "Sui Move言語では、以下のどのタイプがSui特有のものですか。" + }, + "g6vofe4": { + "zh-cn": "答题演示", + "en": "Answer demonstration", + "ko": "퀴즈 프레젠테이션", + "ja": "クイズのデモンストレーション" + }, + "sg518p5": { + "zh-cn": "当前积分:", + "en": "Current points:", + "ko": "현재 포인트:", + "ja": "現在の積分:" + }, + "btlpe3": { + "zh-cn": "上一题", + "en": "Previous question", + "ko": "이전 문제", + "ja": "前の問題" + }, + "od5m2": { + "zh-cn": "说明", + "en": "describe", + "ko": "설명", + "ja": "説明" + }, + "fead3jw": { + "zh-cn": "这是一个答题演示页面,展示了如何与 Sui Move 合约交互。", + "en": "This is a quiz demonstration page that shows how to interact with the Sui Move contract.", + "ko": "Sui Move 계약과 상호 작용하는 방법을 보여주는 퀴즈 데모 페이지입니다.", + "ja": "Sui Move契約との対話方法を示すクイズデモページです。" + }, + "tpgf8xq": { + "zh-cn": "正确回答问题可以获得积分奖励,查看解析需要消耗积分。", + "en": "Answering questions correctly can earn points rewards, while viewing and parsing requires the consumption of points.", + "ko": "질문에 정확하게 대답하면 포인트 보상을 받을 수 있습니다. 확인 시 포인트 소모가 필요합니다.", + "ja": "質問に正しく答えるとポイント奨励金がもらえ、解析を見るにはポイントを消費する必要があります。" + }, + "ssfibbr": { + "zh-cn": "在实际应用中,积分会记录在区块链上,这里只是前端模拟。", + "en": "In practical applications, the points will be recorded on the blockchain, and this is just a front-end simulation.", + "ko": "실제 응용에서 포인트는 블록 체인에 기록되며 여기서는 프런트엔드 시뮬레이션에 불과합니다.", + "ja": "実際の用途では、積分はブロックチェーンに記録されますが、ここではフロントエンドシミュレーションのみです。" + }, + "wn5ac4d": { + "zh-cn": "请先连接您的钱包以开始答题", + "en": "Please connect your wallet first to start answering the questions", + "ko": "먼저 지갑을 연결하여 퀴즈를 시작하십시오.", + "ja": "まず財布を接続して問題に答えてください" + }, + "aezt94b": { + "zh-cn": "提交回答: 问题ID=", + "en": "Submit answer: Question ID=", + "ko": "제출 답변: 질문 ID=", + "ja": "コミット回答:質問ID=" + }, + "1akt6h5": { + "zh-cn": ", 选项=", + "en": ", Options=", + "ko": ", 옵션 =", + "ja": "、オプション=" + }, + "qywik76": { + "zh-cn": "合约调用: ", + "en": "Contract call:", + "ko": "계약 호출:", + "ja": "契約呼び出し:" + }, + "m7j9dtb": { + "zh-cn": "查看解析: 问题ID=", + "en": "View resolution: Problem ID=", + "ko": "확인 보기: 문제 ID=", + "ja": "解析の表示:問題ID=" + }, + "ulinr17": { + "zh-cn": ", 消耗积分=", + "en": ", consume points=", + "ko": ", 포인트 소모 =", + "ja": "、消費積分=" + }, + "a85fwhn": { + "zh-cn": "这是问题的详细解析内容。解答步骤如下:1...", + "en": "This is the detailed analysis of the problem. The answer steps are as follows: 1", + "ko": "이것은 문제의 상세한 해결 내용이다.답변 단계는 다음과 같습니다. 1...", + "ja": "これは問題の詳細な解析内容です。解答手順は次のとおりです。1…" + }, + "ev0tfv6": { + "zh-cn": "提交中...", + "en": "Submitting", + "ko": "제출 중...", + "ja": "コミット中..." + }, + "cxbsqw4": { + "zh-cn": "提交答案", + "en": "Submit answers", + "ko": "답안을 제출하다", + "ja": "回答の送信" + }, + "cafghxb": { + "zh-cn": "恭喜!答案正确,获得 ", + "en": "congratulations! Correct answer, obtained", + "ko": "축하합니다!정답, 획득", + "ja": "おめでとう!答えが正しい" + }, + "lul33": { + "zh-cn": " 积分", + "en": "points", + "ko": "포인트", + "ja": "せきぶん" + }, + "k81cef8": { + "zh-cn": "很遗憾,答案错误", + "en": "Unfortunately, the answer is incorrect", + "ko": "유감스럽게도 답이 틀렸다", + "ja": "残念ながら、答えは間違っています" + }, + "8jnov07": { + "zh-cn": "查看解析(消耗", + "en": "View parsing (consumption)", + "ko": "확인 보기 (소모", + "ja": "解析の表示(消費量)" + }, + "iaaya3": { + "zh-cn": "积分)", + "en": "Points)", + "ko": "포인트)", + "ja": "積分)" + }, + "kq3713": { + "zh-cn": "解析:", + "en": "Analysis:", + "ko": "해결:", + "ja": "解析:" + }, + "gwasf17": { + "zh-cn": "合约调用说明:", + "en": "Contract call instructions:", + "ko": "계약 호출 지침:", + "ja": "契約呼び出しの説明:" + }, + "rlmy098": { + "zh-cn": "1. 回答问题:", + "en": "1. Answer the question:", + "ko": "1. 질문에 답하기:", + "ja": "1.質問に答える:" + }, + "3ttndp8": { + "zh-cn": "2. 查看解析:", + "en": "2. View analysis:", + "ko": "2. 확인을 보려면 다음과 같이 하십시오.", + "ja": "2.解析の表示:" + }, + "l64ygpk": { + "zh-cn": "需要在实际应用中用以下步骤替换模拟代码:", + "en": "The simulation code needs to be replaced with the following steps in practical applications:", + "ko": "실제 응용 프로그램에서 다음 단계로 아날로그 코드를 대체해야 합니다.", + "ja": "シミュレーションコードを実際のアプリケーションで次の手順で置き換える必要があります。" + }, + "ubxqp418": { + "zh-cn": "导入需要的钱包API,如useWallet和useTransactionExecutor", + "en": "Import the required wallet APIs, such as useWallet and useTransactionExecutor", + "ko": "useWallet 및 useTransactionExecutor와 같은 필요한 지갑 API 가져오기", + "ja": "useWalletやuseTransactionExecutorなど、必要なウォレットAPIをインポートする" + }, + "sykthed": { + "zh-cn": "构建交易并使用钱包签名执行", + "en": "Build transactions and execute them using wallet signatures", + "ko": "거래 구축 및 지갑 서명 사용", + "ja": "トランザクションを構築し、ウォレット署名を使用して実行する" + }, + "ckh732d": { + "zh-cn": "监听交易结果并更新UI状态", + "en": "Monitor transaction results and update UI status", + "ko": "트랜잭션 결과 수신 및 UI 상태 업데이트", + "ja": "取引結果を傍受し、UIステータスを更新する" + }, + "u1diepg": { + "zh-cn": "Token余额不足,无法查看解析", + "en": "Insufficient Token balance, unable to view and parse", + "ko": "Token 잔액이 부족하여 확인을 볼 수 없습니다.", + "ja": "Token残高が不足して解析を表示できません" + }, + "tcf62p5": { + "zh-cn": "你的积分:", + "en": "Your points:", + "ko": "당신의 포인트:", + "ja": "あなたのポイント:" + }, + "kkdcmoa": { + "zh-cn": "请连接钱包以查看积分", + "en": "Please connect your wallet to view your points", + "ko": "지갑을 연결하여 포인트를 확인하십시오.", + "ja": "ウォレットに接続してポイントを確認してください" + }, + "y4umimf": { + "zh-cn": "✓ 回答正确! 获得10积分!", + "en": "✓ Correct answer! Get 10 points!", + "ko": "♦ 정답!10포인트 획득!", + "ja": "$正解!ポイント10獲得!" + }, + "degxhy8": { + "zh-cn": "查看解析 (消耗", + "en": "View parsing (consumption)", + "ko": "확인 보기 (소모", + "ja": "解析の表示(消費量)" + }, + "i8wlu3": { + "zh-cn": "积分)", + "en": "Points)", + "ko": "포인트)", + "ja": "積分)" + }, + "7hr0rs8": { + "zh-cn": "恭喜!你获得了 ", + "en": "congratulations! You got it", + "ko": "축하합니다!네가 얻었어", + "ja": "おめでとう!あなたが手に入れた" + }, + "5eu7zj6": { + "zh-cn": " 积分奖励!", + "en": "Points reward!", + "ko": "포인트 보상!", + "ja": "ポイントボーナス!" + }, + "x0q8suj": { + "zh-cn": "积分奖励失败,请检查钱包连接或稍后重试", + "en": "Points reward failed, please check wallet connection or try again later", + "ko": "포인트 보상 실패, 지갑 연결을 확인하거나 나중에 다시 시도하십시오.", + "ja": "ポイントボーナスに失敗しました。ウォレット接続を確認するか、後で再試行してください" + }, + "hszmium": { + "zh-cn": "查看解析失败,请确保你有足够的积分或稍后重试", + "en": "Viewing parsing failed, please make sure you have enough points or try again later", + "ko": "확인 실패, 충분한 포인트가 있는지 확인하거나 나중에 다시 시도하십시오.", + "ja": "解析に失敗した場合は、十分な積分があることを確認するか、後で再試行してください" + }, + "u5bstf6": { + "zh-cn": "处理中...", + "en": "Processing in progress", + "ko": "처리 중...", + "ja": "処理中..." + }, + "7l8nz66": { + "zh-cn": "领取积分奖励", + "en": "Claim point rewards", + "ko": "포인트 보상 수령", + "ja": "ポイントインセンティブを受け取る" + }, + "ht9eqw4": { + "zh-cn": "解析ID", + "en": "Resolve ID", + "ko": "확인 ID", + "ja": "解析ID" + }, + "abyqe14": { + "zh-cn": "代币ID", + "en": "Token ID", + "ko": "토큰 ID", + "ja": "トークンID" + }, + "k6dp3cd": { + "zh-cn": "查看详细解析 (消耗积分)", + "en": "View detailed analysis (consumption of points)", + "ko": "상세 확인 보기 (포인트 사용)", + "ja": "詳細解析の表示(消費積分)" + }, + "h7x0jwc": { + "zh-cn": "连接钱包以使用区块链功能", + "en": "Connect wallet to use blockchain functionality", + "ko": "블록체인 기능을 사용하기 위해 지갑 연결", + "ja": "ブロックチェーン機能を使用するウォレットの接続" + }, + "u2qwca1x": { + "zh-cn": "Move语言是由Facebook的子公司Novi Financial开发的,用于其数字货币项目Diem(原Libra)的智能合约编程语言。", + "en": "Move language is a smart contract programming language developed by Novi Financial, a subsidiary of Facebook, for its digital currency project Diem (formerly Libra).", + "ko": "무브 언어는 페이스북의 자회사인 노비파이낸셜이 개발한 것으로, 자사의 디지털화폐 프로젝트인 디엠(옛 리브라)의 스마트 계약 프로그래밍 언어로 쓰인다.", + "ja": "Move言語は、Facebookの子会社Novi Financialが開発した、デジタル通貨プロジェクトDiem(旧Libra)のためのインテリジェント契約プログラミング言語です。" + }, + "ffk2a3g": { + "zh-cn": "Move语言是由哪个组织开发的?", + "en": "Which organization developed the Move language?", + "ko": "무브 언어는 어느 조직에서 개발했습니까?", + "ja": "Move言語はどの組織によって開発されましたか。" + }, + "f29g6318": { + "zh-cn": "Move语言是一种静态类型的编程语言,它强调类型安全性和资源管理,特别适合编写智能合约。", + "en": "Move language is a statically typed programming language that emphasizes type safety and resource management, making it particularly suitable for writing smart contracts.", + "ko": "Move 언어는 지능형 계약을 작성하는 데 특히 적합한 유형 보안 및 리소스 관리를 강조하는 정적 유형의 프로그래밍 언어입니다.", + "ja": "Move言語は静的タイプのプログラミング言語であり、タイプのセキュリティとリソース管理を強調し、特にインテリジェント契約の作成に適しています。" + }, + "1c0smi7": { + "zh-cn": "A. 面向对象", + "en": "A. Object oriented", + "ko": "A. 객체 지향", + "ja": "A.オブジェクト指向" + }, + "g25ing7": { + "zh-cn": "B. 静态类型", + "en": "B. Static type", + "ko": "B. 정적 유형", + "ja": "B.静的タイプ" + }, + "m2ncji7": { + "zh-cn": "C. 动态类型", + "en": "C. Dynamic type", + "ko": "C. 동적 유형", + "ja": "C.動的タイプ" + }, + "xikomt6": { + "zh-cn": "D. 过程式", + "en": "D. Procedural approach", + "ko": "D. 프로세스", + "ja": "D.プロセス式" + }, + "mf1txuf": { + "zh-cn": "Move语言的主要特点是什么?", + "en": "What are the main features of Move language?", + "ko": "무브 언어의 주요 특징은 무엇입니까?", + "ja": "Move言語の主な特徴は何ですか。" + }, + "ucqkn21p": { + "zh-cn": "在Move语言中,使用关键字'resource'来声明资源,资源是一种特殊的结构体,它代表在Move中具有持久存在的数据。", + "en": "In the Move language, the keyword 'resource' is used to declare resources, which are a special type of structure that represents persistent data in the Move.", + "ko": "Move 언어에서 키워드'resource'를 사용하여 리소스를 선언합니다. 리소스는 Move에서 영구적으로 존재하는 데이터를 나타내는 특수한 구조체입니다.", + "ja": "Move言語では、Moveに永続的に存在するデータを表す特別な構造体であるリソースを宣言するためにキーワード「resource」を使用します。" + }, + "wbxhh8n": { + "zh-cn": "在Move语言中,以下哪个关键字用于声明资源?", + "en": "Which of the following keywords is used to declare resources in the Move language?", + "ko": "Move 언어에서 리소스를 선언하는 데 사용되는 키워드는 무엇입니까?", + "ja": "Move言語でリソースを宣言するために使用するキーワードはどれですか。" + }, + "4xo5297": { + "zh-cn": "查看答案与解析", + "en": "View answers and analysis", + "ko": "답변 및 해결 보기", + "ja": "答えと解析の表示" + }, + "1imcm15": { + "zh-cn": "答案与解析", + "en": "Answers and Analysis", + "ko": "답변 및 해결", + "ja": "答えと解析" + }, + "9eetwb5": { + "zh-cn": "正确答案:", + "en": "Correct answer:", + "ko": "정답:", + "ja": "正解:" + }, + "6owdzmm": { + "zh-cn": "Move语言中,以下哪个关键字用于声明模块?", + "en": "Which of the following keywords is used to declare modules in Move language?", + "ko": "Move 언어에서 다음 중 모듈을 선언하는 데 사용되는 키워드는 무엇입니까?", + "ja": "Move言語でモジュールを宣言するために使用されるキーワードはどれですか。" + }, + "aql7y16": { + "zh-cn": "在Move语言中,'module'关键字用于声明一个新模块,它是代码组织的基本单位。", + "en": "In the Move language, ' The 'module' keyword is used to declare a new module, which is the basic unit of code organization.", + "ko": "Move 언어에서'module'키워드는 코드 조직의 기본 단위인 새 모듈을 선언하는 데 사용됩니다.", + "ja": "Move言語では、'module'キーワードは、コード組織の基本単位である新しいモジュールを宣言するために使用されます。" + }, + "qbx2ys9": { + "zh-cn": "添加示例问题到链上", + "en": "Add example questions to the chain", + "ko": "체인에 예제 질문 추가", + "ja": "チェーンへのサンプル問題の追加" + } +} \ No newline at end of file diff --git a/move202503/AKAKing23/code/chain_front/move.sh b/move202503/AKAKing23/code/chain_front/move.sh new file mode 100644 index 00000000..e490293c --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/move.sh @@ -0,0 +1,5 @@ +sui client call --package 0x2f890627582705d87c06d78a19388e6a3c6b81fb885f0779906426e7c5554797 \ + --module quiz \ + --function direct_reward \ + --args "0x4642beb75afddaea13dcef10905582a0ec8052affbd84d2478ccbd9bb46b5ffe" "0xe75a090888082e699c99b6877f93aaacedba68cd172f32006605e76b99260bb8" 100 \ + --gas-budget 10000000 \ No newline at end of file diff --git a/move202503/AKAKing23/code/chain_front/netlify.toml b/move202503/AKAKing23/code/chain_front/netlify.toml new file mode 100644 index 00000000..ff1c0508 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/netlify.toml @@ -0,0 +1,4 @@ +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 \ No newline at end of file diff --git a/move202503/AKAKing23/code/chain_front/package.json b/move202503/AKAKing23/code/chain_front/package.json new file mode 100644 index 00000000..8f8e7a5c --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/package.json @@ -0,0 +1,48 @@ +{ + "name": "chainx_front", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@mysten/dapp-kit": "^0.15.2", + "@mysten/seal": "0.3.5", + "@mysten/sui": "^1.26.1", + "@radix-ui/react-slot": "^1.2.0", + "@suiet/wallet-kit": "^0.3.3", + "@tailwindcss/vite": "^4.1.3", + "@tanstack/react-query": "^5.71.3", + "axios": "^1.8.4", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "gsap": "^3.12.7", + "lucide-react": "^0.488.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-router-dom": "^7.5.0", + "snarkjs": "^0.7.5", + "tailwind-merge": "^3.2.0", + "tailwindcss": "^4.1.3", + "tw-animate-css": "^1.2.5" + }, + "devDependencies": { + "@eslint/js": "^9.21.0", + "@types/node": "^22.14.1", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.21.0", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^15.15.0", + "typescript": "~5.7.2", + "typescript-eslint": "^8.24.1", + "vite": "^6.2.0", + "vite-auto-i18n-plugin": "^1.0.23" + } +} diff --git a/move202503/AKAKing23/code/chain_front/pnpm-lock.yaml b/move202503/AKAKing23/code/chain_front/pnpm-lock.yaml new file mode 100644 index 00000000..3c28251a --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/pnpm-lock.yaml @@ -0,0 +1,6328 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@mysten/dapp-kit': + specifier: ^0.15.2 + version: 0.15.7(@tanstack/react-query@5.74.4(react@19.1.0))(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) + '@mysten/seal': + specifier: 0.3.5 + version: 0.3.5(typescript@5.7.3) + '@mysten/sui': + specifier: ^1.26.1 + version: 1.28.2(typescript@5.7.3) + '@radix-ui/react-slot': + specifier: ^1.2.0 + version: 1.2.0(@types/react@19.1.2)(react@19.1.0) + '@suiet/wallet-kit': + specifier: ^0.3.3 + version: 0.3.3(@mysten/sui@1.28.2(typescript@5.7.3))(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) + '@tailwindcss/vite': + specifier: ^4.1.3 + version: 4.1.4(vite@6.3.3(@types/node@22.15.2)(jiti@2.4.2)(lightningcss@1.29.2)) + '@tanstack/react-query': + specifier: ^5.71.3 + version: 5.74.4(react@19.1.0) + axios: + specifier: ^1.8.4 + version: 1.9.0 + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + gsap: + specifier: ^3.12.7 + version: 3.12.7 + lucide-react: + specifier: ^0.488.0 + version: 0.488.0(react@19.1.0) + react: + specifier: ^19.0.0 + version: 19.1.0 + react-dom: + specifier: ^19.0.0 + version: 19.1.0(react@19.1.0) + react-router-dom: + specifier: ^7.5.0 + version: 7.5.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + snarkjs: + specifier: ^0.7.5 + version: 0.7.5 + tailwind-merge: + specifier: ^3.2.0 + version: 3.2.0 + tailwindcss: + specifier: ^4.1.3 + version: 4.1.4 + tw-animate-css: + specifier: ^1.2.5 + version: 1.2.8 + devDependencies: + '@eslint/js': + specifier: ^9.21.0 + version: 9.25.1 + '@types/node': + specifier: ^22.14.1 + version: 22.15.2 + '@types/react': + specifier: ^19.0.10 + version: 19.1.2 + '@types/react-dom': + specifier: ^19.0.4 + version: 19.1.2(@types/react@19.1.2) + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.4.1(vite@6.3.3(@types/node@22.15.2)(jiti@2.4.2)(lightningcss@1.29.2)) + eslint: + specifier: ^9.21.0 + version: 9.25.1(jiti@2.4.2) + eslint-plugin-react-hooks: + specifier: ^5.1.0 + version: 5.2.0(eslint@9.25.1(jiti@2.4.2)) + eslint-plugin-react-refresh: + specifier: ^0.4.19 + version: 0.4.20(eslint@9.25.1(jiti@2.4.2)) + globals: + specifier: ^15.15.0 + version: 15.15.0 + typescript: + specifier: ~5.7.2 + version: 5.7.3 + typescript-eslint: + specifier: ^8.24.1 + version: 8.31.0(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3) + vite: + specifier: ^6.2.0 + version: 6.3.3(@types/node@22.15.2)(jiti@2.4.2)(lightningcss@1.29.2) + vite-auto-i18n-plugin: + specifier: ^1.0.23 + version: 1.0.26 + +packages: + + '@0no-co/graphql.web@1.1.2': + resolution: {integrity: sha512-N2NGsU5FLBhT8NZ+3l2YrzZSHITjNXNuDhC4iDiikv0IujaJ0Xc6xIxQZ/Ek3Cb+rgPjnLHYyJm11tInuJn+cw==} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + graphql: + optional: true + + '@0no-co/graphqlsp@1.12.16': + resolution: {integrity: sha512-B5pyYVH93Etv7xjT6IfB7QtMBdaaC07yjbhN6v8H7KgFStMkPvi+oWYBTibMFRMY89qwc9H8YixXg8SXDVgYWw==} + peerDependencies: + graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 + typescript: ^5.0.0 + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.8': + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.10': + resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.27.0': + resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.0': + resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.27.0': + resolution: {integrity: sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.27.0': + resolution: {integrity: sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.4': + resolution: {integrity: sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-member-expression-to-functions@7.25.9': + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.25.9': + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.25.9': + resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.26.5': + resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.25.9': + resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.27.0': + resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.27.0': + resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': + resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': + resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': + resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': + resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': + resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.26.0': + resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.26.0': + resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.25.9': + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.25.9': + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.25.9': + resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.26.8': + resolution: {integrity: sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.25.9': + resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.26.5': + resolution: {integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.27.0': + resolution: {integrity: sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.25.9': + resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.26.0': + resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.25.9': + resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.25.9': + resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.25.9': + resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.25.9': + resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.25.9': + resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': + resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-dynamic-import@7.25.9': + resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.26.3': + resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.25.9': + resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.26.9': + resolution: {integrity: sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.25.9': + resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.25.9': + resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.25.9': + resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.25.9': + resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.25.9': + resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.25.9': + resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.26.3': + resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.25.9': + resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.25.9': + resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': + resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.25.9': + resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.26.6': + resolution: {integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.25.9': + resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.25.9': + resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.25.9': + resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.25.9': + resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.25.9': + resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.25.9': + resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.25.9': + resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.25.9': + resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.25.9': + resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-constant-elements@7.25.9': + resolution: {integrity: sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-display-name@7.25.9': + resolution: {integrity: sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-development@7.25.9': + resolution: {integrity: sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-self@7.25.9': + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.25.9': + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx@7.25.9': + resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-pure-annotations@7.25.9': + resolution: {integrity: sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.27.0': + resolution: {integrity: sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regexp-modifiers@7.26.0': + resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-reserved-words@7.25.9': + resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.25.9': + resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.25.9': + resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.25.9': + resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.26.8': + resolution: {integrity: sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.27.0': + resolution: {integrity: sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.27.0': + resolution: {integrity: sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.25.9': + resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.25.9': + resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.25.9': + resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.25.9': + resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.26.9': + resolution: {integrity: sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/preset-react@7.26.3': + resolution: {integrity: sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.27.0': + resolution: {integrity: sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.27.0': + resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.0': + resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.27.0': + resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.27.0': + resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} + engines: {node: '>=6.9.0'} + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@esbuild/aix-ppc64@0.25.3': + resolution: {integrity: sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.3': + resolution: {integrity: sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.3': + resolution: {integrity: sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.3': + resolution: {integrity: sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.3': + resolution: {integrity: sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.3': + resolution: {integrity: sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.3': + resolution: {integrity: sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.3': + resolution: {integrity: sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.3': + resolution: {integrity: sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.3': + resolution: {integrity: sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.3': + resolution: {integrity: sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.3': + resolution: {integrity: sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.3': + resolution: {integrity: sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.3': + resolution: {integrity: sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.3': + resolution: {integrity: sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.3': + resolution: {integrity: sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.3': + resolution: {integrity: sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.3': + resolution: {integrity: sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.3': + resolution: {integrity: sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.3': + resolution: {integrity: sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.3': + resolution: {integrity: sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.25.3': + resolution: {integrity: sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.3': + resolution: {integrity: sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.3': + resolution: {integrity: sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.3': + resolution: {integrity: sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.6.1': + resolution: {integrity: sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.20.0': + resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.2.1': + resolution: {integrity: sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.13.0': + resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.25.1': + resolution: {integrity: sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.8': + resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@floating-ui/core@1.6.9': + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + + '@floating-ui/dom@1.6.13': + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + + '@floating-ui/react-dom@2.1.2': + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + + '@gql.tada/cli-utils@1.6.3': + resolution: {integrity: sha512-jFFSY8OxYeBxdKi58UzeMXG1tdm4FVjXa8WHIi66Gzu9JWtCE6mqom3a8xkmSw+mVaybFW5EN2WXf1WztJVNyQ==} + peerDependencies: + '@0no-co/graphqlsp': ^1.12.13 + '@gql.tada/svelte-support': 1.0.1 + '@gql.tada/vue-support': 1.0.1 + graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 + typescript: ^5.0.0 + peerDependenciesMeta: + '@gql.tada/svelte-support': + optional: true + '@gql.tada/vue-support': + optional: true + + '@gql.tada/internal@1.0.8': + resolution: {integrity: sha512-XYdxJhtHC5WtZfdDqtKjcQ4d7R1s0d1rnlSs3OcBEUbYiPoJJfZU7tWsVXuv047Z6msvmr4ompJ7eLSK5Km57g==} + peerDependencies: + graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 + typescript: ^5.0.0 + + '@graphql-typed-document-node/core@3.2.0': + resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.2': + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + engines: {node: '>=18.18'} + + '@iden3/bigarray@0.0.2': + resolution: {integrity: sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g==} + + '@iden3/binfileutils@0.0.12': + resolution: {integrity: sha512-naAmzuDufRIcoNfQ1d99d7hGHufLA3wZSibtr4dMe6ZeiOPV1KwOZWTJ1YVz4HbaWlpDuzVU72dS4ATQS4PXBQ==} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@mysten/bcs@1.1.0': + resolution: {integrity: sha512-yy9/1Y4d0FlRywS1+9ze/T7refCbrvwFwJIOKs9M3QBK1njbcHZp+LkVeLqBvIJA5eZ3ZCzmhQ1Xq4Sed5mEBA==} + + '@mysten/bcs@1.6.0': + resolution: {integrity: sha512-ydDRYdIkIFCpHCcPvAkMC91fVwumjzbTgjqds0KsphDQI3jUlH3jFG5lfYNTmV6V3pkhOiRk1fupLBcsQsiszg==} + + '@mysten/dapp-kit@0.15.7': + resolution: {integrity: sha512-88mE4JFmvv5qph3KrU0l6e1Kq8dtykCf8Ta3PFINjKXU+8ya2HgmptLbKRoJvNG+v6vhb8NE6IEc0LsprDB+QQ==} + peerDependencies: + '@tanstack/react-query': ^5.0.0 + react: '*' + + '@mysten/seal@0.3.5': + resolution: {integrity: sha512-VPCTC2HkSyVTn7P6biOITwf5fDf8W6Q3MFGpyFVbb5StOVVQfSv8phPivXXPH/n6YeqiIbRaTrhv9JO2YDEyVA==} + + '@mysten/sui@1.12.0': + resolution: {integrity: sha512-DrSyja04xyGrTGlIQKMwZ6MywxNPkjyIcDLm915Zisoy1/uIgPoHc4cx53JyiG92z/HgowTVGGCCIzH53DIYXA==} + engines: {node: '>=18'} + + '@mysten/sui@1.14.3': + resolution: {integrity: sha512-5vhOnbSAT/9daMIDPYOp7q9j+6DXqjPAYEJy7ZbR9viBsyAx4UMChCwaLyjoYcJKvhrkDn4LTdDTJEUvpj7TTg==} + engines: {node: '>=18'} + + '@mysten/sui@1.26.1': + resolution: {integrity: sha512-bBVvn2wZKipAvuUkKzHwGhs1JiIM33+b97d0uIWg3T6dJH/n1nfnGrzkBQsMGpoBAFOIUnKQAZmDwT4qvJbKkg==} + engines: {node: '>=18'} + + '@mysten/sui@1.28.1': + resolution: {integrity: sha512-kvrcUKiC/92N4u3Ncb8j1uLeBhCjrnTZyBjIX0zNTukFFCMbZkDYEr9IVjPrvnOEwOXZ3fpYmpmw3LB9dEU5FA==} + engines: {node: '>=18'} + + '@mysten/sui@1.28.2': + resolution: {integrity: sha512-d+lSp3rAtuOX0taIiIv0KNILDsbmAB9koNGHBinfREraGnE9tUFW315UByuyvuZ9K53ji4i2risdtwxCQ1a8Zw==} + engines: {node: '>=18'} + + '@mysten/utils@0.0.0': + resolution: {integrity: sha512-KRI57Qow3E7TGqczimazwGf7+fwukdOi+6a31igSCzz0kPjAXbyK1a1gXaxeLMF8xEZ07ouW3RnsWt+EaUuHUw==} + + '@mysten/wallet-standard@0.13.12': + resolution: {integrity: sha512-qFNtgi85Ja4F1dY8MyLIQ+uxzhru+h6TQ6VG2N2AnTutCiFvaQeu2S/akFYeJMfZ0CN/m0v3TNQZN5cxtrLEeg==} + + '@mysten/wallet-standard@0.13.7': + resolution: {integrity: sha512-FXlqn3Gp4E7aQf33rZQfaCEUeEq9TbmkIFA7kX/Yab5SC5892XVhkLRu040eBs8Cest98jFUZ2ZJ4YWR+a7e5g==} + + '@mysten/wallet-standard@0.14.6': + resolution: {integrity: sha512-jgSOcOL48Np+Yy3dVS8MHNFMMSOjA1mIuYqTc0h5PjOmeIOkzSHHC3hsSReqg7Hcm/SBb99DvvZ3XQaVPno23Q==} + + '@mysten/window-wallet-core@0.0.2': + resolution: {integrity: sha512-u57gHFlLYPDTK5bDeabRjkIdyLaiFVwL3bVbnBtu5WJpfFOv/KMOpIQt4820ICBG843jN35tzlulQ0nlbWCYeA==} + + '@mysten/zksend@0.11.12': + resolution: {integrity: sha512-YtLgV4LpYehitlJ4U03LaAK+m7ejmHqC7AarzG/4K0HnqMjc1i2CSztUJ/QOj/QBnedUd9RQ7sxM/6nwGsudAA==} + + '@mysten/zksend@0.12.27': + resolution: {integrity: sha512-HRgC8RnLn24SFyq1eiB3Fq/mKQWQAoYvsMV6lPQu0dUwjlehZg7jeUJbqjC2mgV91NsY9RRnCX5kFnysdUdHew==} + + '@noble/curves@1.9.0': + resolution: {integrity: sha512-7YDlXiNMdO1YZeH6t/kvopHHbIZzlxrCV9WLqCY6QhcXOoXiNCMDqJIglZ9Yjx5+w7Dz30TITFrlTjnRg7sKEg==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@radix-ui/primitive@1.1.2': + resolution: {integrity: sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==} + + '@radix-ui/react-arrow@1.1.4': + resolution: {integrity: sha512-qz+fxrqgNxG0dYew5l7qR3c7wdgRu1XVUHGnGYX7rg5HM4p9SWaRmJwfgR3J0SgyUKayLmzQIun+N6rWRgiRKw==} + 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 + + '@radix-ui/react-collection@1.1.4': + resolution: {integrity: sha512-cv4vSf7HttqXilDnAnvINd53OTl1/bjUYVZrkFnA7nwmY9Ob2POUy0WY0sfqBAe1s5FyKsyceQlqiEGPYNTadg==} + 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 + + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.11': + resolution: {integrity: sha512-yI7S1ipkP5/+99qhSI6nthfo/tR6bL6Zgxi/+1UO6qPa6UeM6nlafWcQ65vB4rU2XjgjMfMhI3k9Y5MztA62VQ==} + 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 + + '@radix-ui/react-direction@1.1.1': + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.7': + resolution: {integrity: sha512-j5+WBUdhccJsmH5/H0K6RncjDtoALSEr6jbkaZu+bjw6hOPOhHycr6vEUujl+HBK8kjUfWcoCJXxP6e4lUlMZw==} + 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 + + '@radix-ui/react-dropdown-menu@2.1.12': + resolution: {integrity: sha512-VJoMs+BWWE7YhzEQyVwvF9n22Eiyr83HotCVrMQzla/OwRovXCgah7AcaEr4hMNj4gJxSdtIbcHGvmJXOoJVHA==} + 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 + + '@radix-ui/react-focus-guards@1.1.2': + resolution: {integrity: sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.4': + resolution: {integrity: sha512-r2annK27lIW5w9Ho5NyQgqs0MmgZSTIKXWpVCJaLC1q2kZrZkcqnmHkCHMEmv8XLvsLlurKMPT+kbKkRkm/xVA==} + 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 + + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-menu@2.1.12': + resolution: {integrity: sha512-+qYq6LfbiGo97Zz9fioX83HCiIYYFNs8zAsVCMQrIakoNYylIzWuoD/anAD3UzvvR6cnswmfRFJFq/zYYq/k7Q==} + 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 + + '@radix-ui/react-popper@1.2.4': + resolution: {integrity: sha512-3p2Rgm/a1cK0r/UVkx5F/K9v/EplfjAeIFCGOPYPO4lZ0jtg4iSQXt/YGTSLWaf4x7NG6Z4+uKFcylcTZjeqDA==} + 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 + + '@radix-ui/react-portal@1.1.6': + resolution: {integrity: sha512-XmsIl2z1n/TsYFLIdYam2rmFwf9OC/Sh2avkbmVMDuBZIe7hSpM0cYnWPAo7nHOVx8zTuwDZGByfcqLdnzp3Vw==} + 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 + + '@radix-ui/react-presence@1.1.4': + resolution: {integrity: sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==} + 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 + + '@radix-ui/react-primitive@2.1.0': + resolution: {integrity: sha512-/J/FhLdK0zVcILOwt5g+dH4KnkonCtkVJsa2G6JmvbbtZfBEI1gMsO3QMjseL4F/SwfAMt1Vc/0XKYKq+xJ1sw==} + 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 + + '@radix-ui/react-roving-focus@1.1.7': + resolution: {integrity: sha512-C6oAg451/fQT3EGbWHbCQjYTtbyjNO1uzQgMzwyivcHT3GKNEmu1q3UuREhN+HzHAVtv3ivMVK08QlC+PkYw9Q==} + 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 + + '@radix-ui/react-slot@1.2.0': + resolution: {integrity: sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.1': + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.1': + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/rect@1.1.1': + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + + '@rollup/pluginutils@4.2.1': + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + + '@rollup/rollup-android-arm-eabi@4.40.0': + resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.40.0': + resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.40.0': + resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.40.0': + resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.40.0': + resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.40.0': + resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.40.0': + resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.40.0': + resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.40.0': + resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.40.0': + resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loongarch64-gnu@4.40.0': + resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': + resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-gnu@4.40.0': + resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.40.0': + resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.40.0': + resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.40.0': + resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.40.0': + resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-win32-arm64-msvc@4.40.0': + resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.40.0': + resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.40.0': + resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==} + cpu: [x64] + os: [win32] + + '@scure/base@1.2.5': + resolution: {integrity: sha512-9rE6EOVeIQzt5TSu4v+K523F8u6DhBsoZWPGKlnCshhlDhy0kJzUX4V+tr2dWmzF1GdekvThABoEQBGBQI7xZw==} + + '@scure/bip32@1.7.0': + resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} + + '@scure/bip39@1.6.0': + resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} + + '@suchipi/femver@1.0.0': + resolution: {integrity: sha512-bprE8+K5V+DPX7q2e2K57ImqNBdfGHDIWaGI5xHxZoxbKOuQZn4wzPiUxOAHnsUr3w3xHrWXwN7gnG/iIuEMIg==} + + '@suiet/wallet-kit@0.3.3': + resolution: {integrity: sha512-LEfyzt1vUBSQPXDmoCIQnry64gDUYxG8V0n/Nngjw7EZg/9dslgXhTiB9DHpCDvH31WrZVyz69jFRAiAfUQFTg==} + peerDependencies: + '@mysten/sui': 1.12.0 + react: '*' + react-dom: '*' + + '@suiet/wallet-sdk@0.3.2': + resolution: {integrity: sha512-sgcAt2+8a1reDICBqrdgmSNqaRMHFMGC2bTEnkVh8PznXu4LEXBHxrhqFLluV2I/dK++FV63DebvlYB4XGqFXw==} + peerDependencies: + '@mysten/sui': 1.12.0 + + '@svgr/babel-plugin-add-jsx-attribute@6.5.1': + resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0': + resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0': + resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1': + resolution: {integrity: sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-dynamic-title@6.5.1': + resolution: {integrity: sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-em-dimensions@6.5.1': + resolution: {integrity: sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-react-native-svg@6.5.1': + resolution: {integrity: sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-svg-component@6.5.1': + resolution: {integrity: sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-preset@6.5.1': + resolution: {integrity: sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/core@6.5.1': + resolution: {integrity: sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==} + engines: {node: '>=10'} + + '@svgr/hast-util-to-babel-ast@6.5.1': + resolution: {integrity: sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==} + engines: {node: '>=10'} + + '@svgr/plugin-jsx@6.5.1': + resolution: {integrity: sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==} + engines: {node: '>=10'} + peerDependencies: + '@svgr/core': ^6.0.0 + + '@svgr/plugin-svgo@6.5.1': + resolution: {integrity: sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==} + engines: {node: '>=10'} + peerDependencies: + '@svgr/core': '*' + + '@svgr/rollup@6.5.1': + resolution: {integrity: sha512-GeUfq0grJfpcn2jRWRaZ4npn27nnWK21vUj6MqDqknuJnEqGADcZZjO9wrUAaPLr3InAnQi0Z7nwiNUdzkaj6A==} + engines: {node: '>=10'} + + '@tailwindcss/node@4.1.4': + resolution: {integrity: sha512-MT5118zaiO6x6hNA04OWInuAiP1YISXql8Z+/Y8iisV5nuhM8VXlyhRuqc2PEviPszcXI66W44bCIk500Oolhw==} + + '@tailwindcss/oxide-android-arm64@4.1.4': + resolution: {integrity: sha512-xMMAe/SaCN/vHfQYui3fqaBDEXMu22BVwQ33veLc8ep+DNy7CWN52L+TTG9y1K397w9nkzv+Mw+mZWISiqhmlA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.4': + resolution: {integrity: sha512-JGRj0SYFuDuAGilWFBlshcexev2hOKfNkoX+0QTksKYq2zgF9VY/vVMq9m8IObYnLna0Xlg+ytCi2FN2rOL0Sg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.4': + resolution: {integrity: sha512-sdDeLNvs3cYeWsEJ4H1DvjOzaGios4QbBTNLVLVs0XQ0V95bffT3+scptzYGPMjm7xv4+qMhCDrkHwhnUySEzA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.4': + resolution: {integrity: sha512-VHxAqxqdghM83HslPhRsNhHo91McsxRJaEnShJOMu8mHmEj9Ig7ToHJtDukkuLWLzLboh2XSjq/0zO6wgvykNA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.4': + resolution: {integrity: sha512-OTU/m/eV4gQKxy9r5acuesqaymyeSCnsx1cFto/I1WhPmi5HDxX1nkzb8KYBiwkHIGg7CTfo/AcGzoXAJBxLfg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.4': + resolution: {integrity: sha512-hKlLNvbmUC6z5g/J4H+Zx7f7w15whSVImokLPmP6ff1QqTVE+TxUM9PGuNsjHvkvlHUtGTdDnOvGNSEUiXI1Ww==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.4': + resolution: {integrity: sha512-X3As2xhtgPTY/m5edUtddmZ8rCruvBvtxYLMw9OsZdH01L2gS2icsHRwxdU0dMItNfVmrBezueXZCHxVeeb7Aw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.4': + resolution: {integrity: sha512-2VG4DqhGaDSmYIu6C4ua2vSLXnJsb/C9liej7TuSO04NK+JJJgJucDUgmX6sn7Gw3Cs5ZJ9ZLrnI0QRDOjLfNQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-x64-musl@4.1.4': + resolution: {integrity: sha512-v+mxVgH2kmur/X5Mdrz9m7TsoVjbdYQT0b4Z+dr+I4RvreCNXyCFELZL/DO0M1RsidZTrm6O1eMnV6zlgEzTMQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-wasm32-wasi@4.1.4': + resolution: {integrity: sha512-2TLe9ir+9esCf6Wm+lLWTMbgklIjiF0pbmDnwmhR9MksVOq+e8aP3TSsXySnBDDvTTVd/vKu1aNttEGj3P6l8Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.4': + resolution: {integrity: sha512-VlnhfilPlO0ltxW9/BgfLI5547PYzqBMPIzRrk4W7uupgCt8z6Trw/tAj6QUtF2om+1MH281Pg+HHUJoLesmng==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.4': + resolution: {integrity: sha512-+7S63t5zhYjslUGb8NcgLpFXD+Kq1F/zt5Xv5qTv7HaFTG/DHyHD9GA6ieNAxhgyA4IcKa/zy7Xx4Oad2/wuhw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.4': + resolution: {integrity: sha512-p5wOpXyOJx7mKh5MXh5oKk+kqcz8T+bA3z/5VWWeQwFrmuBItGwz8Y2CHk/sJ+dNb9B0nYFfn0rj/cKHZyjahQ==} + engines: {node: '>= 10'} + + '@tailwindcss/vite@4.1.4': + resolution: {integrity: sha512-4UQeMrONbvrsXKXXp/uxmdEN5JIJ9RkH7YVzs6AMxC/KC1+Np7WZBaNIco7TEjlkthqxZbt8pU/ipD+hKjm80A==} + peerDependencies: + vite: ^5.2.0 || ^6 + + '@tanstack/query-core@5.74.4': + resolution: {integrity: sha512-YuG0A0+3i9b2Gfo9fkmNnkUWh5+5cFhWBN0pJAHkHilTx6A0nv8kepkk4T4GRt4e5ahbtFj2eTtkiPcVU1xO4A==} + + '@tanstack/react-query@5.74.4': + resolution: {integrity: sha512-mAbxw60d4ffQ4qmRYfkO1xzRBPUEf/72Dgo3qqea0J66nIKuDTLEqQt0ku++SDFlMGMnB6uKDnEG1xD/TDse4Q==} + peerDependencies: + react: ^18 || ^19 + + '@trysound/sax@0.2.0': + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.7': + resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + + '@types/http-errors@1.8.2': + resolution: {integrity: sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@22.15.2': + resolution: {integrity: sha512-uKXqKN9beGoMdBfcaTY1ecwz6ctxuJAcUlwE55938g0ZJ8lRxwAZqRz2AJ4pzpt5dHdTPMB863UZ0ESiFUcP7A==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/react-dom@19.1.2': + resolution: {integrity: sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw==} + peerDependencies: + '@types/react': ^19.0.0 + + '@types/react@19.1.2': + resolution: {integrity: sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==} + + '@typescript-eslint/eslint-plugin@8.31.0': + resolution: {integrity: sha512-evaQJZ/J/S4wisevDvC1KFZkPzRetH8kYZbkgcTRyql3mcKsf+ZFDV1BVWUGTCAW5pQHoqn5gK5b8kn7ou9aFQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/parser@8.31.0': + resolution: {integrity: sha512-67kYYShjBR0jNI5vsf/c3WG4u+zDnCTHTPqVMQguffaWWFs7artgwKmfwdifl+r6XyM5LYLas/dInj2T0SgJyw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/scope-manager@8.31.0': + resolution: {integrity: sha512-knO8UyF78Nt8O/B64i7TlGXod69ko7z6vJD9uhSlm0qkAbGeRUSudcm0+K/4CrRjrpiHfBCjMWlc08Vav1xwcw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.31.0': + resolution: {integrity: sha512-DJ1N1GdjI7IS7uRlzJuEDCgDQix3ZVYVtgeWEyhyn4iaoitpMBX6Ndd488mXSx0xah/cONAkEaYyylDyAeHMHg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/types@8.31.0': + resolution: {integrity: sha512-Ch8oSjVyYyJxPQk8pMiP2FFGYatqXQfQIaMp+TpuuLlDachRWpUAeEu1u9B/v/8LToehUIWyiKcA/w5hUFRKuQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.31.0': + resolution: {integrity: sha512-xLmgn4Yl46xi6aDSZ9KkyfhhtnYI15/CvHbpOy/eR5NWhK/BK8wc709KKwhAR0m4ZKRP7h07bm4BWUYOCuRpQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/utils@8.31.0': + resolution: {integrity: sha512-qi6uPLt9cjTFxAb1zGNgTob4x9ur7xC6mHQJ8GwEzGMGE9tYniublmJaowOJ9V2jUzxrltTPfdG2nKlWsq0+Ww==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/visitor-keys@8.31.0': + resolution: {integrity: sha512-QcGHmlRHWOl93o64ZUMNewCdwKGU6WItOU52H0djgNmn1EOrhVudrDzXz4OycCRSCPwFCDrE2iIt5vmuUdHxuQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vanilla-extract/css@1.17.1': + resolution: {integrity: sha512-tOHQXHm10FrJeXKFeWE09JfDGN/tvV6mbjwoNB9k03u930Vg021vTnbrCwVLkECj9Zvh/SHLBHJ4r2flGqfovw==} + + '@vanilla-extract/dynamic@2.1.2': + resolution: {integrity: sha512-9BGMciD8rO1hdSPIAh1ntsG4LPD3IYKhywR7VOmmz9OO4Lx1hlwkSg3E6X07ujFx7YuBfx0GDQnApG9ESHvB2A==} + + '@vanilla-extract/private@1.0.6': + resolution: {integrity: sha512-ytsG/JLweEjw7DBuZ/0JCN4WAQgM9erfSTdS1NQY778hFQSZ6cfCDEZZ0sgVm4k54uNz6ImKB33AYvSR//fjxw==} + + '@vanilla-extract/recipes@0.5.5': + resolution: {integrity: sha512-VadU7+IFUwLNLMgks29AHav/K5h7DOEfTU91RItn5vwdPfzduodNg317YbgWCcpm7FSXkuR3B3X8ZOi95UOozA==} + peerDependencies: + '@vanilla-extract/css': ^1.0.0 + + '@vitalets/google-translate-api@9.2.1': + resolution: {integrity: sha512-zlwQWSjXUZhbZQ6qwtIQ7GdYXFQmJ4wYqzcrYJUxtvzQQwUP+uKUb/SRJaBOQuBntjBjzcdcJoLFrpCKUbIkOg==} + engines: {node: '>=14'} + + '@vitejs/plugin-react@4.4.1': + resolution: {integrity: sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + + '@wallet-standard/app@1.1.0': + resolution: {integrity: sha512-3CijvrO9utx598kjr45hTbbeeykQrQfKmSnxeWOgU25TOEpvcipD/bYDQWIqUv1Oc6KK4YStokSMu/FBNecGUQ==} + engines: {node: '>=16'} + + '@wallet-standard/base@1.1.0': + resolution: {integrity: sha512-DJDQhjKmSNVLKWItoKThJS+CsJQjR9AOBOirBVT1F9YpRyC9oYHE+ZnSf8y8bxUphtKqdQMPVQ2mHohYdRvDVQ==} + engines: {node: '>=16'} + + '@wallet-standard/core@1.0.3': + resolution: {integrity: sha512-Jb33IIjC1wM1HoKkYD7xQ6d6PZ8EmMZvyc8R7dFgX66n/xkvksVTW04g9yLvQXrLFbcIjHrCxW6TXMhvpsAAzg==} + engines: {node: '>=16'} + + '@wallet-standard/core@1.1.0': + resolution: {integrity: sha512-v2W5q/NlX1qkn2q/JOXQT//pOAdrhz7+nOcO2uiH9+a0uvreL+sdWWqkhFmMcX+HEBjaibdOQMUoIfDhOGX4XA==} + engines: {node: '>=16'} + + '@wallet-standard/errors@0.1.1': + resolution: {integrity: sha512-V8Ju1Wvol8i/VDyQOHhjhxmMVwmKiwyxUZBnHhtiPZJTWY0U/Shb2iEWyGngYEbAkp2sGTmEeNX1tVyGR7PqNw==} + engines: {node: '>=16'} + hasBin: true + + '@wallet-standard/features@1.1.0': + resolution: {integrity: sha512-hiEivWNztx73s+7iLxsuD1sOJ28xtRix58W7Xnz4XzzA/pF0+aicnWgjOdA10doVDEDZdUuZCIIqG96SFNlDUg==} + engines: {node: '>=16'} + + '@wallet-standard/wallet@1.1.0': + resolution: {integrity: sha512-Gt8TnSlDZpAl+RWOOAB/kuvC7RpcdWAlFbHNoi4gsXsfaWa1QCT6LBcfIYTPdOZC9OVZUDwqGuGAcqZejDmHjg==} + engines: {node: '>=16'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + auto-i18n-plugin-core@1.0.26: + resolution: {integrity: sha512-Pm4MJ6vHcOBpuL6EGgpROQtnMOE5CpI79xFzOCs+gE2qygoHIFwtb1F3t5bAqn/tXBhvRuTixGrwX9013Fanjg==} + + axios@1.9.0: + resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} + + b4a@1.6.7: + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + + babel-plugin-polyfill-corejs2@0.4.13: + resolution: {integrity: sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.11.1: + resolution: {integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.4: + resolution: {integrity: sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-x@5.0.1: + resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bech32@2.0.0: + resolution: {integrity: sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==} + + bfj@7.1.0: + resolution: {integrity: sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==} + engines: {node: '>= 8.0.0'} + + big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + + blake2b-wasm@2.4.0: + resolution: {integrity: sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + broadcast-channel@3.7.0: + resolution: {integrity: sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==} + + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bs58@6.0.0: + resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001715: + resolution: {integrity: sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + check-types@11.2.3: + resolution: {integrity: sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==} + + circom_runtime@0.1.28: + resolution: {integrity: sha512-ACagpQ7zBRLKDl5xRZ4KpmYIcZDUjOiNRuxvXLqhnnlLSVY1Dbvh73TI853nqoR0oEbihtWmMSjgc5f+pXf/jQ==} + hasBin: true + + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} + + core-js-compat@3.41.0: + resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + + css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deep-object-diff@1.1.9: + resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + engines: {node: '>=8'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.5.142: + resolution: {integrity: sha512-Ah2HgkTu/9RhTDNThBtzu2Wirdy4DC9b0sMT1pUhbkZQ5U/iwmE+PHZX1MpjD5IkJCc2wSghgGG/B04szAx07w==} + + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + engines: {node: '>=10.13.0'} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild@0.25.3: + resolution: {integrity: sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escodegen@1.14.3: + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} + hasBin: true + + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-react-refresh@0.4.20: + resolution: {integrity: sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==} + peerDependencies: + eslint: '>=8.40' + + eslint-scope@8.3.0: + resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.25.1: + resolution: {integrity: sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esprima@1.2.2: + resolution: {integrity: sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==} + engines: {node: '>=0.4.0'} + hasBin: true + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastfile@0.0.20: + resolution: {integrity: sha512-r5ZDbgImvVWCP0lA/cGNgQcZqR+aYdFx3u+CtJqUE510pBUVGMn4ulL/iRTI4tACTYsNJ736uzFxEBXesPAktA==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fdir@6.4.4: + resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + ffjavascript@0.3.0: + resolution: {integrity: sha512-l7sR5kmU3gRwDy8g0Z2tYBXy5ttmafRPFOqY7S6af5cq51JqJWt5eQ/lSR/rs2wQNbDYaYlQr5O+OSUf/oMLoQ==} + + ffjavascript@0.3.1: + resolution: {integrity: sha512-4PbK1WYodQtuF47D4pRI5KUg3Q392vuP5WjE1THSnceHdXwU3ijaoS0OqxTzLknCtz4Z2TtABzkBdBdMn3B/Aw==} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.2: + resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + engines: {node: '>= 6'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + gql.tada@1.8.10: + resolution: {integrity: sha512-FrvSxgz838FYVPgZHGOSgbpOjhR+yq44rCzww3oOPJYi0OvBJjAgCiP6LEokZIYND2fUTXzQAyLgcvgw1yNP5A==} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + graphql@16.10.0: + resolution: {integrity: sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + + gsap@3.12.7: + resolution: {integrity: sha512-V4GsyVamhmKefvcAKaoy0h6si0xX7ogwBoBSs2CTJwt7luW0oZzC0LhdkyuKV8PJAXr7Yaj8pMjCKD4GJ+eEMg==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hoopy@0.1.4: + resolution: {integrity: sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==} + engines: {node: '>= 6.0.0'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + + jose@6.0.10: + resolution: {integrity: sha512-skIAxZqcMkOrSwjJvplIPYrlXGpxTPnro2/QWTDCxAdWQrSTV5/KqspMWmi5WAx5+ULswASJiZ0a+1B/Lxt9cw==} + + js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonpath@1.1.1: + resolution: {integrity: sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lightningcss-darwin-arm64@1.29.2: + resolution: {integrity: sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.29.2: + resolution: {integrity: sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.29.2: + resolution: {integrity: sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.29.2: + resolution: {integrity: sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.29.2: + resolution: {integrity: sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.29.2: + resolution: {integrity: sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.29.2: + resolution: {integrity: sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.29.2: + resolution: {integrity: sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.29.2: + resolution: {integrity: sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.29.2: + resolution: {integrity: sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.29.2: + resolution: {integrity: sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==} + engines: {node: '>= 12.0.0'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + logplease@1.2.15: + resolution: {integrity: sha512-jLlHnlsPSJjpwUfcNyUxXCl33AYg2cHhIf9QhGL2T4iPT0XPB+xP1LRKFPgIg1M/sg9kAJvy94w9CzBNrfnstA==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lucide-react@0.488.0: + resolution: {integrity: sha512-ronlL0MyKut4CEzBY/ai2ZpKPxyWO4jUqdAkm2GNK5Zn3Rj+swDz+3lvyAUXN0PNqPKIX6XM9Xadwz/skLs/pQ==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + match-sorter@6.3.4: + resolution: {integrity: sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + + media-query-parser@2.0.2: + resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + microseconds@0.2.0: + resolution: {integrity: sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + modern-ahocorasick@1.1.0: + resolution: {integrity: sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nano-time@1.0.0: + resolution: {integrity: sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==} + + nanoassert@2.0.0: + resolution: {integrity: sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanostores@0.10.3: + resolution: {integrity: sha512-Nii8O1XqmawqSCf9o2aWqVxhKRN01+iue9/VEd1TiJCr9VT5XxgPFbF1Edl1XN6pwJcZRsl8Ki+z01yb/T/C2g==} + engines: {node: ^18.0.0 || >=20.0.0} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + oblivious-set@1.0.0: + resolution: {integrity: sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + poseidon-lite@0.2.1: + resolution: {integrity: sha512-xIr+G6HeYfOhCuswdqcFpSX47SPhm0EpisWJ6h7fHlWwaVIvH3dLnejpatrtw6Xc6HaLrpq05y7VRfvDmDGIog==} + + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + r1csfile@0.0.48: + resolution: {integrity: sha512-kHRkKUJNaor31l05f2+RFzvcH5XSa7OfEfd/l4hzjte6NL6fjRkSMfZ4BjySW9wmfdwPOtq3mXurzPvPGEf5Tw==} + + react-dom@19.1.0: + resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} + peerDependencies: + react: ^19.1.0 + + react-query@3.39.3: + resolution: {integrity: sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} + + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.6.3: + resolution: {integrity: sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==} + 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 + + react-router-dom@7.5.2: + resolution: {integrity: sha512-yk1XW8Fj7gK7flpYBXF3yzd2NbX6P7Kxjvs2b5nu1M04rb5pg/Zc4fGdBNTeT4eDYL2bvzWNyKaIMJX/RKHTTg==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + + react-router@7.5.2: + resolution: {integrity: sha512-9Rw8r199klMnlGZ8VAsV/I8WrIF6IyJ90JQUdboupx1cdkgYqwnrYjH+I/nY/7cA1X5zia4mDJqH36npP7sxGQ==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + peerDependenciesMeta: + react-dom: + optional: true + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + 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 + + react@19.1.0: + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + engines: {node: '>=0.10.0'} + + regenerate-unicode-properties@10.2.0: + resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + + regexpu-core@6.2.0: + resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} + engines: {node: '>=4'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.12.0: + resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} + hasBin: true + + remove-accents@0.5.0: + resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rollup@4.40.0: + resolution: {integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shamir-secret-sharing@0.0.3: + resolution: {integrity: sha512-GPIb+QZDyjwwKSlVXEjHoOaBeevmdWz2IM2tz07nQvd0L9eMfLhzEqr7imajjjXCAO/cWgzXCCj0yFNMx6+miQ==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + snarkjs@0.7.5: + resolution: {integrity: sha512-h+3c4rXZKLhLuHk4LHydZCk/h5GcNvk5GjVKRRkHmfb6Ntf8gHOA9zea3g656iclRuhqQ3iKDWFgiD9ypLrKiA==} + hasBin: true + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + + static-eval@2.0.2: + resolution: {integrity: sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + superstruct@1.0.4: + resolution: {integrity: sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==} + engines: {node: '>=14.0.0'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + + svgo@2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + + tailwind-merge@3.2.0: + resolution: {integrity: sha512-FQT/OVqCD+7edmmJpsgCsY820RTD5AkBryuG5IUqR5YQZSdj5xlH5nLgH7YPths7WsLPSpSBNneJdM8aS8aeFA==} + + tailwindcss@4.1.4: + resolution: {integrity: sha512-1ZIUqtPITFbv/DxRmDr5/agPqJwF69d24m9qmM1939TJehgY539CtzeZRjbLt5G6fSy/7YqqYsfvoTEw9xUI2A==} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + tinyglobby@0.2.13: + resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} + engines: {node: '>=12.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tryer@1.0.1: + resolution: {integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==} + + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tunnel@0.0.6: + resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} + engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} + + turbo-stream@2.4.0: + resolution: {integrity: sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==} + + tw-animate-css@1.2.8: + resolution: {integrity: sha512-AxSnYRvyFnAiZCUndS3zQZhNfV/B77ZhJ+O7d3K6wfg/jKJY+yv6ahuyXwnyaYA9UdLqnpCwhTRv9pPTBnPR2g==} + + tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + + type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typescript-eslint@8.31.0: + resolution: {integrity: sha512-u+93F0sB0An8WEAPtwxVhFby573E8ckdjwUUQUj9QA4v8JAvgtoDdIyYR3XFwFHq2W1KJ1AurwJCO+w+Y1ixyQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} + hasBin: true + + underscore@1.12.1: + resolution: {integrity: sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.0: + resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + unload@2.2.0: + resolution: {integrity: sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + 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 + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + 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 + + use-sync-external-store@1.5.0: + resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + valibot@0.36.0: + resolution: {integrity: sha512-CjF1XN4sUce8sBK9TixrDqFM7RwNkuXdJu174/AwmQUB62QbCQADg5lLe8ldBalFgtj1uKj+pKwDJiNo4Mn+eQ==} + + vite-auto-i18n-plugin@1.0.26: + resolution: {integrity: sha512-y3mt2X0W8/gPlG1ygaMtd2vT/bjT8JIeZOB5wEO2hChw0LNA9SZJNaZKHa2yqnOCMIyO0FuzqWcbfHdJXiXoRg==} + + vite@6.3.3: + resolution: {integrity: sha512-5nXH+QsELbFKhsEfWLkHrvgRpTdGJzqOZ+utSdmPTvwHmvU6ITTm3xx+mRusihkcI8GeC7lCDyn3kDtiki9scw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + wasmbuilder@0.0.16: + resolution: {integrity: sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==} + + wasmcurves@0.2.2: + resolution: {integrity: sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ==} + + web-worker@1.2.0: + resolution: {integrity: sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zustand@4.5.6: + resolution: {integrity: sha512-ibr/n1hBzLLj5Y+yUcU7dYw8p6WnIVzdJbnX+1YpaScvZVF2ziugqHs+LAmHw4lWO9c/zRj+K1ncgWDQuthEdQ==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0.6' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + +snapshots: + + '@0no-co/graphql.web@1.1.2(graphql@16.10.0)': + optionalDependencies: + graphql: 16.10.0 + + '@0no-co/graphqlsp@1.12.16(graphql@16.10.0)(typescript@5.7.3)': + dependencies: + '@gql.tada/internal': 1.0.8(graphql@16.10.0)(typescript@5.7.3) + graphql: 16.10.0 + typescript: 5.7.3 + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.8': {} + + '@babel/core@7.26.10': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.27.0 + '@babel/helper-compilation-targets': 7.27.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) + '@babel/helpers': 7.27.0 + '@babel/parser': 7.27.0 + '@babel/template': 7.27.0 + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.27.0': + dependencies: + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.25.9': + dependencies: + '@babel/types': 7.27.0 + + '@babel/helper-compilation-targets@7.27.0': + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.27.0(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.27.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.27.0(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-annotate-as-pure': 7.25.9 + regexpu-core: 6.2.0 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-compilation-targets': 7.27.0 + '@babel/helper-plugin-utils': 7.26.5 + debug: 4.4.0 + lodash.debounce: 4.0.8 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + '@babel/helper-member-expression-to-functions@7.25.9': + dependencies: + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.27.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.25.9': + dependencies: + '@babel/types': 7.27.0 + + '@babel/helper-plugin-utils@7.26.5': {} + + '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-wrap-function': 7.25.9 + '@babel/traverse': 7.27.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.27.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + dependencies: + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helper-wrap-function@7.25.9': + dependencies: + '@babel/template': 7.27.0 + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.27.0': + dependencies: + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 + + '@babel/parser@7.27.0': + dependencies: + '@babel/types': 7.27.0 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/traverse': 7.27.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.10) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/traverse': 7.27.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + + '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-async-generator-functions@7.26.8(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.10) + '@babel/traverse': 7.27.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.10) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.26.5(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-block-scoping@7.27.0(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-compilation-targets': 7.27.0 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) + '@babel/traverse': 7.27.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/template': 7.27.0 + + '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-for-of@7.26.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-compilation-targets': 7.27.0 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/traverse': 7.27.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.27.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-nullish-coalescing-operator@7.26.6(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-compilation-targets': 7.27.0 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.10) + + '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-react-constant-elements@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-react-jsx-development@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.10) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) + '@babel/types': 7.27.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-pure-annotations@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-regenerator@7.27.0(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + regenerator-transform: 0.15.2 + + '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-template-literals@7.26.8(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-typeof-symbol@7.27.0(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-typescript@7.27.0(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/preset-env@7.26.9(@babel/core@7.26.10)': + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/core': 7.26.10 + '@babel/helper-compilation-targets': 7.27.0 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10) + '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.10) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.10) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.10) + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.26.10) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-block-scoped-functions': 7.26.5(@babel/core@7.26.10) + '@babel/plugin-transform-block-scoping': 7.27.0(@babel/core@7.26.10) + '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.10) + '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.26.10) + '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-for-of': 7.26.9(@babel/core@7.26.10) + '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.10) + '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.26.10) + '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-regenerator': 7.27.0(@babel/core@7.26.10) + '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.10) + '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-template-literals': 7.26.8(@babel/core@7.26.10) + '@babel/plugin-transform-typeof-symbol': 7.27.0(@babel/core@7.26.10) + '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.10) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.10) + babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.26.10) + babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.10) + babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.26.10) + core-js-compat: 3.41.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/types': 7.27.0 + esutils: 2.0.3 + + '@babel/preset-react@7.26.3(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-react-jsx-development': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-react-pure-annotations': 7.25.9(@babel/core@7.26.10) + transitivePeerDependencies: + - supports-color + + '@babel/preset-typescript@7.27.0(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.10) + '@babel/plugin-transform-typescript': 7.27.0(@babel/core@7.26.10) + transitivePeerDependencies: + - supports-color + + '@babel/runtime@7.27.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.27.0': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + + '@babel/traverse@7.27.0': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.27.0 + '@babel/parser': 7.27.0 + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.27.0': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@emotion/hash@0.9.2': {} + + '@esbuild/aix-ppc64@0.25.3': + optional: true + + '@esbuild/android-arm64@0.25.3': + optional: true + + '@esbuild/android-arm@0.25.3': + optional: true + + '@esbuild/android-x64@0.25.3': + optional: true + + '@esbuild/darwin-arm64@0.25.3': + optional: true + + '@esbuild/darwin-x64@0.25.3': + optional: true + + '@esbuild/freebsd-arm64@0.25.3': + optional: true + + '@esbuild/freebsd-x64@0.25.3': + optional: true + + '@esbuild/linux-arm64@0.25.3': + optional: true + + '@esbuild/linux-arm@0.25.3': + optional: true + + '@esbuild/linux-ia32@0.25.3': + optional: true + + '@esbuild/linux-loong64@0.25.3': + optional: true + + '@esbuild/linux-mips64el@0.25.3': + optional: true + + '@esbuild/linux-ppc64@0.25.3': + optional: true + + '@esbuild/linux-riscv64@0.25.3': + optional: true + + '@esbuild/linux-s390x@0.25.3': + optional: true + + '@esbuild/linux-x64@0.25.3': + optional: true + + '@esbuild/netbsd-arm64@0.25.3': + optional: true + + '@esbuild/netbsd-x64@0.25.3': + optional: true + + '@esbuild/openbsd-arm64@0.25.3': + optional: true + + '@esbuild/openbsd-x64@0.25.3': + optional: true + + '@esbuild/sunos-x64@0.25.3': + optional: true + + '@esbuild/win32-arm64@0.25.3': + optional: true + + '@esbuild/win32-ia32@0.25.3': + optional: true + + '@esbuild/win32-x64@0.25.3': + optional: true + + '@eslint-community/eslint-utils@4.6.1(eslint@9.25.1(jiti@2.4.2))': + dependencies: + eslint: 9.25.1(jiti@2.4.2) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/config-array@0.20.0': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.2.1': {} + + '@eslint/core@0.13.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.1': + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.25.1': {} + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.2.8': + dependencies: + '@eslint/core': 0.13.0 + levn: 0.4.1 + + '@floating-ui/core@1.6.9': + dependencies: + '@floating-ui/utils': 0.2.9 + + '@floating-ui/dom@1.6.13': + dependencies: + '@floating-ui/core': 1.6.9 + '@floating-ui/utils': 0.2.9 + + '@floating-ui/react-dom@2.1.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@floating-ui/dom': 1.6.13 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + '@floating-ui/utils@0.2.9': {} + + '@gql.tada/cli-utils@1.6.3(@0no-co/graphqlsp@1.12.16(graphql@16.10.0)(typescript@5.7.3))(graphql@16.10.0)(typescript@5.7.3)': + dependencies: + '@0no-co/graphqlsp': 1.12.16(graphql@16.10.0)(typescript@5.7.3) + '@gql.tada/internal': 1.0.8(graphql@16.10.0)(typescript@5.7.3) + graphql: 16.10.0 + typescript: 5.7.3 + + '@gql.tada/internal@1.0.8(graphql@16.10.0)(typescript@5.7.3)': + dependencies: + '@0no-co/graphql.web': 1.1.2(graphql@16.10.0) + graphql: 16.10.0 + typescript: 5.7.3 + + '@graphql-typed-document-node/core@3.2.0(graphql@16.10.0)': + dependencies: + graphql: 16.10.0 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.2': {} + + '@iden3/bigarray@0.0.2': {} + + '@iden3/binfileutils@0.0.12': + dependencies: + fastfile: 0.0.20 + ffjavascript: 0.3.1 + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@mysten/bcs@1.1.0': + dependencies: + bs58: 6.0.0 + + '@mysten/bcs@1.6.0': + dependencies: + '@scure/base': 1.2.5 + + '@mysten/dapp-kit@0.15.7(@tanstack/react-query@5.74.4(react@19.1.0))(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3)': + dependencies: + '@mysten/sui': 1.28.1(typescript@5.7.3) + '@mysten/utils': 0.0.0 + '@mysten/wallet-standard': 0.14.6(typescript@5.7.3) + '@mysten/zksend': 0.12.27(typescript@5.7.3) + '@radix-ui/react-dialog': 1.1.11(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-dropdown-menu': 2.1.12(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.0(@types/react@19.1.2)(react@19.1.0) + '@tanstack/react-query': 5.74.4(react@19.1.0) + '@vanilla-extract/css': 1.17.1 + '@vanilla-extract/dynamic': 2.1.2 + '@vanilla-extract/recipes': 0.5.5(@vanilla-extract/css@1.17.1) + clsx: 2.1.1 + react: 19.1.0 + zustand: 4.5.6(@types/react@19.1.2)(react@19.1.0) + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - '@types/react' + - '@types/react-dom' + - babel-plugin-macros + - immer + - react-dom + - typescript + + '@mysten/seal@0.3.5(typescript@5.7.3)': + dependencies: + '@mysten/bcs': 1.6.0 + '@mysten/sui': 1.26.1(typescript@5.7.3) + '@noble/curves': 1.9.0 + '@noble/hashes': 1.8.0 + shamir-secret-sharing: 0.0.3 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - typescript + + '@mysten/sui@1.12.0(typescript@5.7.3)': + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.10.0) + '@mysten/bcs': 1.1.0 + '@noble/curves': 1.9.0 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + '@suchipi/femver': 1.0.0 + bech32: 2.0.0 + gql.tada: 1.8.10(graphql@16.10.0)(typescript@5.7.3) + graphql: 16.10.0 + tweetnacl: 1.0.3 + valibot: 0.36.0 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - typescript + + '@mysten/sui@1.14.3(typescript@5.7.3)': + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.10.0) + '@mysten/bcs': 1.1.0 + '@noble/curves': 1.9.0 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + '@suchipi/femver': 1.0.0 + bech32: 2.0.0 + gql.tada: 1.8.10(graphql@16.10.0)(typescript@5.7.3) + graphql: 16.10.0 + tweetnacl: 1.0.3 + valibot: 0.36.0 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - typescript + + '@mysten/sui@1.26.1(typescript@5.7.3)': + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.10.0) + '@mysten/bcs': 1.6.0 + '@noble/curves': 1.9.0 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.5 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + gql.tada: 1.8.10(graphql@16.10.0)(typescript@5.7.3) + graphql: 16.10.0 + poseidon-lite: 0.2.1 + valibot: 0.36.0 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - typescript + + '@mysten/sui@1.28.1(typescript@5.7.3)': + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.10.0) + '@mysten/bcs': 1.6.0 + '@mysten/utils': 0.0.0 + '@noble/curves': 1.9.0 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.5 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + gql.tada: 1.8.10(graphql@16.10.0)(typescript@5.7.3) + graphql: 16.10.0 + poseidon-lite: 0.2.1 + valibot: 0.36.0 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - typescript + + '@mysten/sui@1.28.2(typescript@5.7.3)': + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.10.0) + '@mysten/bcs': 1.6.0 + '@mysten/utils': 0.0.0 + '@noble/curves': 1.9.0 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.5 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + gql.tada: 1.8.10(graphql@16.10.0)(typescript@5.7.3) + graphql: 16.10.0 + poseidon-lite: 0.2.1 + valibot: 0.36.0 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - typescript + + '@mysten/utils@0.0.0': + dependencies: + '@scure/base': 1.2.5 + + '@mysten/wallet-standard@0.13.12(typescript@5.7.3)': + dependencies: + '@mysten/sui': 1.14.3(typescript@5.7.3) + '@wallet-standard/core': 1.0.3 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - typescript + + '@mysten/wallet-standard@0.13.7(typescript@5.7.3)': + dependencies: + '@mysten/sui': 1.12.0(typescript@5.7.3) + '@wallet-standard/core': 1.0.3 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - typescript + + '@mysten/wallet-standard@0.14.6(typescript@5.7.3)': + dependencies: + '@mysten/sui': 1.28.1(typescript@5.7.3) + '@wallet-standard/core': 1.1.0 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - typescript + + '@mysten/window-wallet-core@0.0.2': + dependencies: + '@mysten/utils': 0.0.0 + jose: 6.0.10 + valibot: 0.36.0 + + '@mysten/zksend@0.11.12(typescript@5.7.3)': + dependencies: + '@mysten/sui': 1.14.3(typescript@5.7.3) + '@mysten/wallet-standard': 0.13.12(typescript@5.7.3) + mitt: 3.0.1 + nanostores: 0.10.3 + valibot: 0.36.0 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - typescript + + '@mysten/zksend@0.12.27(typescript@5.7.3)': + dependencies: + '@mysten/sui': 1.28.1(typescript@5.7.3) + '@mysten/utils': 0.0.0 + '@mysten/wallet-standard': 0.14.6(typescript@5.7.3) + '@mysten/window-wallet-core': 0.0.2 + mitt: 3.0.1 + nanostores: 0.10.3 + valibot: 0.36.0 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - typescript + + '@noble/curves@1.9.0': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/hashes@1.8.0': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@radix-ui/primitive@1.1.2': {} + + '@radix-ui/react-arrow@1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-collection@1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.0(@types/react@19.1.2)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.2)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.2 + + '@radix-ui/react-context@1.1.2(@types/react@19.1.2)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.2 + + '@radix-ui/react-dialog@1.1.11(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-portal': 1.1.6(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.0(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.2)(react@19.1.0) + aria-hidden: 1.2.4 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-remove-scroll: 2.6.3(@types/react@19.1.2)(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-direction@1.1.1(@types/react@19.1.2)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.2 + + '@radix-ui/react-dismissable-layer@1.1.7(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.2)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-dropdown-menu@2.1.12(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-menu': 2.1.12(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.2)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-focus-guards@1.1.2(@types/react@19.1.2)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.2 + + '@radix-ui/react-focus-scope@1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.2)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-id@1.1.1(@types/react@19.1.2)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.2)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.2 + + '@radix-ui/react-menu@2.1.12(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-popper': 1.2.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-portal': 1.1.6(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.7(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.0(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.2)(react@19.1.0) + aria-hidden: 1.2.4 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-remove-scroll: 2.6.3(@types/react@19.1.2)(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-popper@1.2.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-arrow': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/rect': 1.1.1 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-portal@1.1.6(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.2)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-presence@1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.2)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-primitive@2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-slot': 1.2.0(@types/react@19.1.2)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-roving-focus@1.1.7(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.2)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.2 + '@types/react-dom': 19.1.2(@types/react@19.1.2) + + '@radix-ui/react-slot@1.2.0(@types/react@19.1.2)(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.2 + + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.2)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.2 + + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.2)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.2)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.2)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.2 + + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.2)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.2)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.2 + + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.2)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.2)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.2 + + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.2)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.2 + + '@radix-ui/react-use-rect@1.1.1(@types/react@19.1.2)(react@19.1.0)': + dependencies: + '@radix-ui/rect': 1.1.1 + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.2 + + '@radix-ui/react-use-size@1.1.1(@types/react@19.1.2)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.2)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.2 + + '@radix-ui/rect@1.1.1': {} + + '@rollup/pluginutils@4.2.1': + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + + '@rollup/rollup-android-arm-eabi@4.40.0': + optional: true + + '@rollup/rollup-android-arm64@4.40.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.40.0': + optional: true + + '@rollup/rollup-darwin-x64@4.40.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.40.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.40.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.40.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.40.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.40.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.40.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.40.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.40.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.40.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.40.0': + optional: true + + '@scure/base@1.2.5': {} + + '@scure/bip32@1.7.0': + dependencies: + '@noble/curves': 1.9.0 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.5 + + '@scure/bip39@1.6.0': + dependencies: + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.5 + + '@suchipi/femver@1.0.0': {} + + '@suiet/wallet-kit@0.3.3(@mysten/sui@1.28.2(typescript@5.7.3))(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3)': + dependencies: + '@mysten/sui': 1.28.2(typescript@5.7.3) + '@mysten/wallet-standard': 0.13.7(typescript@5.7.3) + '@mysten/zksend': 0.11.12(typescript@5.7.3) + '@radix-ui/react-dialog': 1.1.11(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@suiet/wallet-sdk': 0.3.2(@mysten/sui@1.28.2(typescript@5.7.3))(typescript@5.7.3) + '@svgr/rollup': 6.5.1 + '@wallet-standard/core': 1.0.3 + buffer: 6.0.3 + classnames: 2.5.1 + lodash-es: 4.17.21 + mitt: 3.0.1 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-query: 3.39.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - '@types/react' + - '@types/react-dom' + - react-native + - supports-color + - typescript + + '@suiet/wallet-sdk@0.3.2(@mysten/sui@1.28.2(typescript@5.7.3))(typescript@5.7.3)': + dependencies: + '@mysten/sui': 1.28.2(typescript@5.7.3) + '@mysten/wallet-standard': 0.13.7(typescript@5.7.3) + '@mysten/zksend': 0.11.12(typescript@5.7.3) + '@noble/hashes': 1.8.0 + buffer: 6.0.3 + superstruct: 1.0.4 + tweetnacl: 1.0.3 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - typescript + + '@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + + '@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + + '@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + + '@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + + '@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + + '@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + + '@svgr/babel-preset@6.5.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.26.10) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.26.10) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.26.10) + '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.26.10) + '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.26.10) + '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.26.10) + '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.26.10) + '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.26.10) + + '@svgr/core@6.5.1': + dependencies: + '@babel/core': 7.26.10 + '@svgr/babel-preset': 6.5.1(@babel/core@7.26.10) + '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) + camelcase: 6.3.0 + cosmiconfig: 7.1.0 + transitivePeerDependencies: + - supports-color + + '@svgr/hast-util-to-babel-ast@6.5.1': + dependencies: + '@babel/types': 7.27.0 + entities: 4.5.0 + + '@svgr/plugin-jsx@6.5.1(@svgr/core@6.5.1)': + dependencies: + '@babel/core': 7.26.10 + '@svgr/babel-preset': 6.5.1(@babel/core@7.26.10) + '@svgr/core': 6.5.1 + '@svgr/hast-util-to-babel-ast': 6.5.1 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + + '@svgr/plugin-svgo@6.5.1(@svgr/core@6.5.1)': + dependencies: + '@svgr/core': 6.5.1 + cosmiconfig: 7.1.0 + deepmerge: 4.3.1 + svgo: 2.8.0 + + '@svgr/rollup@6.5.1': + dependencies: + '@babel/core': 7.26.10 + '@babel/plugin-transform-react-constant-elements': 7.25.9(@babel/core@7.26.10) + '@babel/preset-env': 7.26.9(@babel/core@7.26.10) + '@babel/preset-react': 7.26.3(@babel/core@7.26.10) + '@babel/preset-typescript': 7.27.0(@babel/core@7.26.10) + '@rollup/pluginutils': 4.2.1 + '@svgr/core': 6.5.1 + '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) + '@svgr/plugin-svgo': 6.5.1(@svgr/core@6.5.1) + transitivePeerDependencies: + - supports-color + + '@tailwindcss/node@4.1.4': + dependencies: + enhanced-resolve: 5.18.1 + jiti: 2.4.2 + lightningcss: 1.29.2 + tailwindcss: 4.1.4 + + '@tailwindcss/oxide-android-arm64@4.1.4': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.4': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.4': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.4': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.4': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.4': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.4': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.4': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.4': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.4': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.4': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.4': + optional: true + + '@tailwindcss/oxide@4.1.4': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.4 + '@tailwindcss/oxide-darwin-arm64': 4.1.4 + '@tailwindcss/oxide-darwin-x64': 4.1.4 + '@tailwindcss/oxide-freebsd-x64': 4.1.4 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.4 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.4 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.4 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.4 + '@tailwindcss/oxide-linux-x64-musl': 4.1.4 + '@tailwindcss/oxide-wasm32-wasi': 4.1.4 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.4 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.4 + + '@tailwindcss/vite@4.1.4(vite@6.3.3(@types/node@22.15.2)(jiti@2.4.2)(lightningcss@1.29.2))': + dependencies: + '@tailwindcss/node': 4.1.4 + '@tailwindcss/oxide': 4.1.4 + tailwindcss: 4.1.4 + vite: 6.3.3(@types/node@22.15.2)(jiti@2.4.2)(lightningcss@1.29.2) + + '@tanstack/query-core@5.74.4': {} + + '@tanstack/react-query@5.74.4(react@19.1.0)': + dependencies: + '@tanstack/query-core': 5.74.4 + react: 19.1.0 + + '@trysound/sax@0.2.0': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.7 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.27.0 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + + '@types/babel__traverse@7.20.7': + dependencies: + '@babel/types': 7.27.0 + + '@types/estree@1.0.7': {} + + '@types/http-errors@1.8.2': {} + + '@types/json-schema@7.0.15': {} + + '@types/node@22.15.2': + dependencies: + undici-types: 6.21.0 + + '@types/parse-json@4.0.2': {} + + '@types/react-dom@19.1.2(@types/react@19.1.2)': + dependencies: + '@types/react': 19.1.2 + + '@types/react@19.1.2': + dependencies: + csstype: 3.1.3 + + '@typescript-eslint/eslint-plugin@8.31.0(@typescript-eslint/parser@8.31.0(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.31.0(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.31.0 + '@typescript-eslint/type-utils': 8.31.0(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.31.0(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.31.0 + eslint: 9.25.1(jiti@2.4.2) + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.31.0(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.31.0 + '@typescript-eslint/types': 8.31.0 + '@typescript-eslint/typescript-estree': 8.31.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.31.0 + debug: 4.4.0 + eslint: 9.25.1(jiti@2.4.2) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.31.0': + dependencies: + '@typescript-eslint/types': 8.31.0 + '@typescript-eslint/visitor-keys': 8.31.0 + + '@typescript-eslint/type-utils@8.31.0(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.31.0(typescript@5.7.3) + '@typescript-eslint/utils': 8.31.0(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3) + debug: 4.4.0 + eslint: 9.25.1(jiti@2.4.2) + ts-api-utils: 2.1.0(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.31.0': {} + + '@typescript-eslint/typescript-estree@8.31.0(typescript@5.7.3)': + dependencies: + '@typescript-eslint/types': 8.31.0 + '@typescript-eslint/visitor-keys': 8.31.0 + debug: 4.4.0 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.1 + ts-api-utils: 2.1.0(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.31.0(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3)': + dependencies: + '@eslint-community/eslint-utils': 4.6.1(eslint@9.25.1(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.31.0 + '@typescript-eslint/types': 8.31.0 + '@typescript-eslint/typescript-estree': 8.31.0(typescript@5.7.3) + eslint: 9.25.1(jiti@2.4.2) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.31.0': + dependencies: + '@typescript-eslint/types': 8.31.0 + eslint-visitor-keys: 4.2.0 + + '@vanilla-extract/css@1.17.1': + dependencies: + '@emotion/hash': 0.9.2 + '@vanilla-extract/private': 1.0.6 + css-what: 6.1.0 + cssesc: 3.0.0 + csstype: 3.1.3 + dedent: 1.5.3 + deep-object-diff: 1.1.9 + deepmerge: 4.3.1 + lru-cache: 10.4.3 + media-query-parser: 2.0.2 + modern-ahocorasick: 1.1.0 + picocolors: 1.1.1 + transitivePeerDependencies: + - babel-plugin-macros + + '@vanilla-extract/dynamic@2.1.2': + dependencies: + '@vanilla-extract/private': 1.0.6 + + '@vanilla-extract/private@1.0.6': {} + + '@vanilla-extract/recipes@0.5.5(@vanilla-extract/css@1.17.1)': + dependencies: + '@vanilla-extract/css': 1.17.1 + + '@vitalets/google-translate-api@9.2.1': + dependencies: + '@types/http-errors': 1.8.2 + http-errors: 2.0.0 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + '@vitejs/plugin-react@4.4.1(vite@6.3.3(@types/node@22.15.2)(jiti@2.4.2)(lightningcss@1.29.2))': + dependencies: + '@babel/core': 7.26.10 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 6.3.3(@types/node@22.15.2)(jiti@2.4.2)(lightningcss@1.29.2) + transitivePeerDependencies: + - supports-color + + '@wallet-standard/app@1.1.0': + dependencies: + '@wallet-standard/base': 1.1.0 + + '@wallet-standard/base@1.1.0': {} + + '@wallet-standard/core@1.0.3': + dependencies: + '@wallet-standard/app': 1.1.0 + '@wallet-standard/base': 1.1.0 + '@wallet-standard/features': 1.1.0 + '@wallet-standard/wallet': 1.1.0 + + '@wallet-standard/core@1.1.0': + dependencies: + '@wallet-standard/app': 1.1.0 + '@wallet-standard/base': 1.1.0 + '@wallet-standard/errors': 0.1.1 + '@wallet-standard/features': 1.1.0 + '@wallet-standard/wallet': 1.1.0 + + '@wallet-standard/errors@0.1.1': + dependencies: + chalk: 5.4.1 + commander: 13.1.0 + + '@wallet-standard/features@1.1.0': + dependencies: + '@wallet-standard/base': 1.1.0 + + '@wallet-standard/wallet@1.1.0': + dependencies: + '@wallet-standard/base': 1.1.0 + + acorn-jsx@5.3.2(acorn@8.14.1): + dependencies: + acorn: 8.14.1 + + acorn@8.14.1: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + argparse@2.0.1: {} + + aria-hidden@1.2.4: + dependencies: + tslib: 2.8.1 + + async@3.2.6: {} + + asynckit@0.4.0: {} + + auto-i18n-plugin-core@1.0.26: + dependencies: + '@babel/core': 7.26.10 + '@babel/generator': 7.27.0 + '@babel/preset-env': 7.26.9(@babel/core@7.26.10) + '@babel/preset-typescript': 7.27.0(@babel/core@7.26.10) + '@vitalets/google-translate-api': 9.2.1 + axios: 1.9.0 + crypto-js: 4.2.0 + tunnel: 0.0.6 + transitivePeerDependencies: + - debug + - encoding + - supports-color + + axios@1.9.0: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.2 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + b4a@1.6.7: {} + + babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.26.10): + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/core': 7.26.10 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.26.10): + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) + core-js-compat: 3.41.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.26.10): + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) + transitivePeerDependencies: + - supports-color + + balanced-match@1.0.2: {} + + base-x@5.0.1: {} + + base64-js@1.5.1: {} + + bech32@2.0.0: {} + + bfj@7.1.0: + dependencies: + bluebird: 3.7.2 + check-types: 11.2.3 + hoopy: 0.1.4 + jsonpath: 1.1.1 + tryer: 1.0.1 + + big-integer@1.6.52: {} + + blake2b-wasm@2.4.0: + dependencies: + b4a: 1.6.7 + nanoassert: 2.0.0 + + bluebird@3.7.2: {} + + boolbase@1.0.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + broadcast-channel@3.7.0: + dependencies: + '@babel/runtime': 7.27.0 + detect-node: 2.1.0 + js-sha3: 0.8.0 + microseconds: 0.2.0 + nano-time: 1.0.0 + oblivious-set: 1.0.0 + rimraf: 3.0.2 + unload: 2.2.0 + + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001715 + electron-to-chromium: 1.5.142 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.24.4) + + bs58@6.0.0: + dependencies: + base-x: 5.0.1 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + callsites@3.1.0: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001715: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.4.1: {} + + check-types@11.2.3: {} + + circom_runtime@0.1.28: + dependencies: + ffjavascript: 0.3.1 + + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + + classnames@2.5.1: {} + + clsx@2.1.1: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@13.1.0: {} + + commander@7.2.0: {} + + concat-map@0.0.1: {} + + convert-source-map@2.0.0: {} + + cookie@1.0.2: {} + + core-js-compat@3.41.0: + dependencies: + browserslist: 4.24.4 + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.1 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-js@4.2.0: {} + + css-select@4.3.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + + css-tree@1.1.3: + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + + css-what@6.1.0: {} + + cssesc@3.0.0: {} + + csso@4.2.0: + dependencies: + css-tree: 1.1.3 + + csstype@3.1.3: {} + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + dedent@1.5.3: {} + + deep-is@0.1.4: {} + + deep-object-diff@1.1.9: {} + + deepmerge@4.3.1: {} + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + detect-libc@2.0.4: {} + + detect-node-es@1.1.0: {} + + detect-node@2.1.0: {} + + dom-serializer@1.4.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + domelementtype@2.3.0: {} + + domhandler@4.3.1: + dependencies: + domelementtype: 2.3.0 + + domutils@2.8.0: + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + ejs@3.1.10: + dependencies: + jake: 10.9.2 + + electron-to-chromium@1.5.142: {} + + enhanced-resolve@5.18.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + entities@2.2.0: {} + + entities@4.5.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild@0.25.3: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.3 + '@esbuild/android-arm': 0.25.3 + '@esbuild/android-arm64': 0.25.3 + '@esbuild/android-x64': 0.25.3 + '@esbuild/darwin-arm64': 0.25.3 + '@esbuild/darwin-x64': 0.25.3 + '@esbuild/freebsd-arm64': 0.25.3 + '@esbuild/freebsd-x64': 0.25.3 + '@esbuild/linux-arm': 0.25.3 + '@esbuild/linux-arm64': 0.25.3 + '@esbuild/linux-ia32': 0.25.3 + '@esbuild/linux-loong64': 0.25.3 + '@esbuild/linux-mips64el': 0.25.3 + '@esbuild/linux-ppc64': 0.25.3 + '@esbuild/linux-riscv64': 0.25.3 + '@esbuild/linux-s390x': 0.25.3 + '@esbuild/linux-x64': 0.25.3 + '@esbuild/netbsd-arm64': 0.25.3 + '@esbuild/netbsd-x64': 0.25.3 + '@esbuild/openbsd-arm64': 0.25.3 + '@esbuild/openbsd-x64': 0.25.3 + '@esbuild/sunos-x64': 0.25.3 + '@esbuild/win32-arm64': 0.25.3 + '@esbuild/win32-ia32': 0.25.3 + '@esbuild/win32-x64': 0.25.3 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + escodegen@1.14.3: + dependencies: + esprima: 4.0.1 + estraverse: 4.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + + eslint-plugin-react-hooks@5.2.0(eslint@9.25.1(jiti@2.4.2)): + dependencies: + eslint: 9.25.1(jiti@2.4.2) + + eslint-plugin-react-refresh@0.4.20(eslint@9.25.1(jiti@2.4.2)): + dependencies: + eslint: 9.25.1(jiti@2.4.2) + + eslint-scope@8.3.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.0: {} + + eslint@9.25.1(jiti@2.4.2): + dependencies: + '@eslint-community/eslint-utils': 4.6.1(eslint@9.25.1(jiti@2.4.2)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.20.0 + '@eslint/config-helpers': 0.2.1 + '@eslint/core': 0.13.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.25.1 + '@eslint/plugin-kit': 0.2.8 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.2 + '@types/estree': 1.0.7 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + escape-string-regexp: 4.0.0 + eslint-scope: 8.3.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.4.2 + transitivePeerDependencies: + - supports-color + + espree@10.3.0: + dependencies: + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) + eslint-visitor-keys: 4.2.0 + + esprima@1.2.2: {} + + esprima@4.0.1: {} + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + esutils@2.0.3: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastfile@0.0.20: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fdir@6.4.4(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + ffjavascript@0.3.0: + dependencies: + wasmbuilder: 0.0.16 + wasmcurves: 0.2.2 + web-worker: 1.2.0 + + ffjavascript@0.3.1: + dependencies: + wasmbuilder: 0.0.16 + wasmcurves: 0.2.2 + web-worker: 1.2.0 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + follow-redirects@1.15.9: {} + + form-data@4.0.2: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + mime-types: 2.1.35 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-nonce@1.0.1: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@11.12.0: {} + + globals@14.0.0: {} + + globals@15.15.0: {} + + gopd@1.2.0: {} + + gql.tada@1.8.10(graphql@16.10.0)(typescript@5.7.3): + dependencies: + '@0no-co/graphql.web': 1.1.2(graphql@16.10.0) + '@0no-co/graphqlsp': 1.12.16(graphql@16.10.0)(typescript@5.7.3) + '@gql.tada/cli-utils': 1.6.3(@0no-co/graphqlsp@1.12.16(graphql@16.10.0)(typescript@5.7.3))(graphql@16.10.0)(typescript@5.7.3) + '@gql.tada/internal': 1.0.8(graphql@16.10.0)(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - graphql + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + graphql@16.10.0: {} + + gsap@3.12.7: {} + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hoopy@0.1.4: {} + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + is-arrayish@0.2.1: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + isexe@2.0.0: {} + + jake@10.9.2: + dependencies: + async: 3.2.6 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + + jiti@2.4.2: {} + + jose@6.0.10: {} + + js-sha3@0.8.0: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.0.2: {} + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + jsonpath@1.1.1: + dependencies: + esprima: 1.2.2 + static-eval: 2.0.2 + underscore: 1.12.1 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.3.0: + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lightningcss-darwin-arm64@1.29.2: + optional: true + + lightningcss-darwin-x64@1.29.2: + optional: true + + lightningcss-freebsd-x64@1.29.2: + optional: true + + lightningcss-linux-arm-gnueabihf@1.29.2: + optional: true + + lightningcss-linux-arm64-gnu@1.29.2: + optional: true + + lightningcss-linux-arm64-musl@1.29.2: + optional: true + + lightningcss-linux-x64-gnu@1.29.2: + optional: true + + lightningcss-linux-x64-musl@1.29.2: + optional: true + + lightningcss-win32-arm64-msvc@1.29.2: + optional: true + + lightningcss-win32-x64-msvc@1.29.2: + optional: true + + lightningcss@1.29.2: + dependencies: + detect-libc: 2.0.4 + optionalDependencies: + lightningcss-darwin-arm64: 1.29.2 + lightningcss-darwin-x64: 1.29.2 + lightningcss-freebsd-x64: 1.29.2 + lightningcss-linux-arm-gnueabihf: 1.29.2 + lightningcss-linux-arm64-gnu: 1.29.2 + lightningcss-linux-arm64-musl: 1.29.2 + lightningcss-linux-x64-gnu: 1.29.2 + lightningcss-linux-x64-musl: 1.29.2 + lightningcss-win32-arm64-msvc: 1.29.2 + lightningcss-win32-x64-msvc: 1.29.2 + + lines-and-columns@1.2.4: {} + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash-es@4.17.21: {} + + lodash.debounce@4.0.8: {} + + lodash.merge@4.6.2: {} + + logplease@1.2.15: {} + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lucide-react@0.488.0(react@19.1.0): + dependencies: + react: 19.1.0 + + match-sorter@6.3.4: + dependencies: + '@babel/runtime': 7.27.0 + remove-accents: 0.5.0 + + math-intrinsics@1.1.0: {} + + mdn-data@2.0.14: {} + + media-query-parser@2.0.2: + dependencies: + '@babel/runtime': 7.27.0 + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + microseconds@0.2.0: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + mitt@3.0.1: {} + + modern-ahocorasick@1.1.0: {} + + ms@2.1.3: {} + + nano-time@1.0.0: + dependencies: + big-integer: 1.6.52 + + nanoassert@2.0.0: {} + + nanoid@3.3.11: {} + + nanostores@0.10.3: {} + + natural-compare@1.4.0: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-releases@2.0.19: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + oblivious-set@1.0.0: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + optionator@0.8.3: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.5 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + 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.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-type@4.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + poseidon-lite@0.2.1: {} + + postcss@8.5.3: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.1.2: {} + + prelude-ls@1.2.1: {} + + proxy-from-env@1.1.0: {} + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + r1csfile@0.0.48: + dependencies: + '@iden3/bigarray': 0.0.2 + '@iden3/binfileutils': 0.0.12 + fastfile: 0.0.20 + ffjavascript: 0.3.0 + + react-dom@19.1.0(react@19.1.0): + dependencies: + react: 19.1.0 + scheduler: 0.26.0 + + react-query@3.39.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + '@babel/runtime': 7.27.0 + broadcast-channel: 3.7.0 + match-sorter: 6.3.4 + react: 19.1.0 + optionalDependencies: + react-dom: 19.1.0(react@19.1.0) + + react-refresh@0.17.0: {} + + react-remove-scroll-bar@2.3.8(@types/react@19.1.2)(react@19.1.0): + dependencies: + react: 19.1.0 + react-style-singleton: 2.2.3(@types/react@19.1.2)(react@19.1.0) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.2 + + react-remove-scroll@2.6.3(@types/react@19.1.2)(react@19.1.0): + dependencies: + react: 19.1.0 + react-remove-scroll-bar: 2.3.8(@types/react@19.1.2)(react@19.1.0) + react-style-singleton: 2.2.3(@types/react@19.1.2)(react@19.1.0) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.1.2)(react@19.1.0) + use-sidecar: 1.1.3(@types/react@19.1.2)(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.2 + + react-router-dom@7.5.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-router: 7.5.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + + react-router@7.5.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + cookie: 1.0.2 + react: 19.1.0 + set-cookie-parser: 2.7.1 + turbo-stream: 2.4.0 + optionalDependencies: + react-dom: 19.1.0(react@19.1.0) + + react-style-singleton@2.2.3(@types/react@19.1.2)(react@19.1.0): + dependencies: + get-nonce: 1.0.1 + react: 19.1.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.2 + + react@19.1.0: {} + + regenerate-unicode-properties@10.2.0: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regenerator-runtime@0.14.1: {} + + regenerator-transform@0.15.2: + dependencies: + '@babel/runtime': 7.27.0 + + regexpu-core@6.2.0: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.0 + regjsgen: 0.8.0 + regjsparser: 0.12.0 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.0 + + regjsgen@0.8.0: {} + + regjsparser@0.12.0: + dependencies: + jsesc: 3.0.2 + + remove-accents@0.5.0: {} + + resolve-from@4.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.1.0: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rollup@4.40.0: + dependencies: + '@types/estree': 1.0.7 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.40.0 + '@rollup/rollup-android-arm64': 4.40.0 + '@rollup/rollup-darwin-arm64': 4.40.0 + '@rollup/rollup-darwin-x64': 4.40.0 + '@rollup/rollup-freebsd-arm64': 4.40.0 + '@rollup/rollup-freebsd-x64': 4.40.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.40.0 + '@rollup/rollup-linux-arm-musleabihf': 4.40.0 + '@rollup/rollup-linux-arm64-gnu': 4.40.0 + '@rollup/rollup-linux-arm64-musl': 4.40.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.40.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.40.0 + '@rollup/rollup-linux-riscv64-gnu': 4.40.0 + '@rollup/rollup-linux-riscv64-musl': 4.40.0 + '@rollup/rollup-linux-s390x-gnu': 4.40.0 + '@rollup/rollup-linux-x64-gnu': 4.40.0 + '@rollup/rollup-linux-x64-musl': 4.40.0 + '@rollup/rollup-win32-arm64-msvc': 4.40.0 + '@rollup/rollup-win32-ia32-msvc': 4.40.0 + '@rollup/rollup-win32-x64-msvc': 4.40.0 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + scheduler@0.26.0: {} + + semver@6.3.1: {} + + semver@7.7.1: {} + + set-cookie-parser@2.7.1: {} + + setprototypeof@1.2.0: {} + + shamir-secret-sharing@0.0.3: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + snarkjs@0.7.5: + dependencies: + '@iden3/binfileutils': 0.0.12 + bfj: 7.1.0 + blake2b-wasm: 2.4.0 + circom_runtime: 0.1.28 + ejs: 3.1.10 + fastfile: 0.0.20 + ffjavascript: 0.3.1 + js-sha3: 0.8.0 + logplease: 1.2.15 + r1csfile: 0.0.48 + + source-map-js@1.2.1: {} + + source-map@0.6.1: {} + + stable@0.1.8: {} + + static-eval@2.0.2: + dependencies: + escodegen: 1.14.3 + + statuses@2.0.1: {} + + strip-json-comments@3.1.1: {} + + superstruct@1.0.4: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svg-parser@2.0.4: {} + + svgo@2.8.0: + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.1.1 + stable: 0.1.8 + + tailwind-merge@3.2.0: {} + + tailwindcss@4.1.4: {} + + tapable@2.2.1: {} + + tinyglobby@0.2.13: + dependencies: + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + tr46@0.0.3: {} + + tryer@1.0.1: {} + + ts-api-utils@2.1.0(typescript@5.7.3): + dependencies: + typescript: 5.7.3 + + tslib@2.8.1: {} + + tunnel@0.0.6: {} + + turbo-stream@2.4.0: {} + + tw-animate-css@1.2.8: {} + + tweetnacl@1.0.3: {} + + type-check@0.3.2: + dependencies: + prelude-ls: 1.1.2 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typescript-eslint@8.31.0(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.31.0(@typescript-eslint/parser@8.31.0(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': 8.31.0(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.31.0(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.25.1(jiti@2.4.2) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + typescript@5.7.3: {} + + underscore@1.12.1: {} + + undici-types@6.21.0: {} + + unicode-canonical-property-names-ecmascript@2.0.1: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.1.0 + + unicode-match-property-value-ecmascript@2.2.0: {} + + unicode-property-aliases-ecmascript@2.1.0: {} + + unload@2.2.0: + dependencies: + '@babel/runtime': 7.27.0 + detect-node: 2.1.0 + + update-browserslist-db@1.1.3(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + use-callback-ref@1.3.3(@types/react@19.1.2)(react@19.1.0): + dependencies: + react: 19.1.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.2 + + use-sidecar@1.1.3(@types/react@19.1.2)(react@19.1.0): + dependencies: + detect-node-es: 1.1.0 + react: 19.1.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.2 + + use-sync-external-store@1.5.0(react@19.1.0): + dependencies: + react: 19.1.0 + + valibot@0.36.0: {} + + vite-auto-i18n-plugin@1.0.26: + dependencies: + '@babel/core': 7.26.10 + '@babel/preset-env': 7.26.9(@babel/core@7.26.10) + '@babel/preset-typescript': 7.27.0(@babel/core@7.26.10) + auto-i18n-plugin-core: 1.0.26 + transitivePeerDependencies: + - debug + - encoding + - supports-color + + vite@6.3.3(@types/node@22.15.2)(jiti@2.4.2)(lightningcss@1.29.2): + dependencies: + esbuild: 0.25.3 + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.3 + rollup: 4.40.0 + tinyglobby: 0.2.13 + optionalDependencies: + '@types/node': 22.15.2 + fsevents: 2.3.3 + jiti: 2.4.2 + lightningcss: 1.29.2 + + wasmbuilder@0.0.16: {} + + wasmcurves@0.2.2: + dependencies: + wasmbuilder: 0.0.16 + + web-worker@1.2.0: {} + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrappy@1.0.2: {} + + yallist@3.1.1: {} + + yaml@1.10.2: {} + + yocto-queue@0.1.0: {} + + zustand@4.5.6(@types/react@19.1.2)(react@19.1.0): + dependencies: + use-sync-external-store: 1.5.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.2 + react: 19.1.0 diff --git a/move202503/AKAKing23/code/chain_front/public/advanced.png b/move202503/AKAKing23/code/chain_front/public/advanced.png new file mode 100644 index 00000000..0674f5c2 Binary files /dev/null and b/move202503/AKAKing23/code/chain_front/public/advanced.png differ diff --git a/move202503/AKAKing23/code/chain_front/public/circuits/ability.r1cs b/move202503/AKAKing23/code/chain_front/public/circuits/ability.r1cs new file mode 100644 index 00000000..dc011a4e Binary files /dev/null and b/move202503/AKAKing23/code/chain_front/public/circuits/ability.r1cs differ diff --git a/move202503/AKAKing23/code/chain_front/public/circuits/ability.wasm b/move202503/AKAKing23/code/chain_front/public/circuits/ability.wasm new file mode 100644 index 00000000..ed8e9bdb Binary files /dev/null and b/move202503/AKAKing23/code/chain_front/public/circuits/ability.wasm differ diff --git a/move202503/AKAKing23/code/chain_front/public/circuits/ability_proof.zkey b/move202503/AKAKing23/code/chain_front/public/circuits/ability_proof.zkey new file mode 100644 index 00000000..50845055 Binary files /dev/null and b/move202503/AKAKing23/code/chain_front/public/circuits/ability_proof.zkey differ diff --git a/move202503/AKAKing23/code/chain_front/public/circuits/verification_key.json b/move202503/AKAKing23/code/chain_front/public/circuits/verification_key.json new file mode 100644 index 00000000..94aa485a --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/public/circuits/verification_key.json @@ -0,0 +1,104 @@ +{ + "protocol": "groth16", + "curve": "bn128", + "nPublic": 3, + "vk_alpha_1": [ + "16634909769583691121580159870407934840190562119506884902768617615839695643970", + "21757090781022985320157544286157970037021212015301972628513917772543640366703", + "1" + ], + "vk_beta_2": [ + [ + "1843414671297698511482925586575323988623882205551711852417868031167567950124", + "2442669351776478400314549372291058083393299941539162109081974556703702242101" + ], + [ + "17056807451259302578612534267662730788306627175392516831685168122735978786924", + "19280708826615422225678437765460147085542959367201591420156450414713207527591" + ], + [ + "1", + "0" + ] + ], + "vk_gamma_2": [ + [ + "10857046999023057135944570762232829481370756359578518086990519993285655852781", + "11559732032986387107991004021392285783925812861821192530917403151452391805634" + ], + [ + "8495653923123431417604973247489272438418190587263600148770280649306958101930", + "4082367875863433681332203403145435568316851327593401208105741076214120093531" + ], + [ + "1", + "0" + ] + ], + "vk_delta_2": [ + [ + "10857046999023057135944570762232829481370756359578518086990519993285655852781", + "11559732032986387107991004021392285783925812861821192530917403151452391805634" + ], + [ + "8495653923123431417604973247489272438418190587263600148770280649306958101930", + "4082367875863433681332203403145435568316851327593401208105741076214120093531" + ], + [ + "1", + "0" + ] + ], + "vk_alphabeta_12": [ + [ + [ + "4670522309383287506604282574149239691670274892174940112322583378140204994062", + "2801096524386741941040108002188394235371691261228899421197913940083980977668" + ], + [ + "14294908710779067494722479858860427688366458139479747285443997975952727032888", + "3171603720947474201032373088603729044884573504436807227901276999878668370578" + ], + [ + "12016630735365360337163897381942050210578021608807017434395644314412734083590", + "8362887083263168943526469696808502911150775216229673229997246292758736094713" + ] + ], + [ + [ + "17620544323504166712218691308038358196033528852684779844828405295705700542957", + "6127759305344194555043223241832976233841303152502521389869085425095407991667" + ], + [ + "14565263355670031313164183921934414237081639415031054974538630749865387947619", + "16201391736498710989336204627149672491107446344022440050258493323677187959056" + ], + [ + "9385359082608613175976893546693371880847120814366242933788340163117174423094", + "9157555761118407757789406384935713405136713066959826906175173598649923676930" + ] + ] + ], + "IC": [ + [ + "17901250411333494485920330162930036752114372065782160465252078669560188273602", + "20718164248992870962983567662361713610106286521203506235246506820407697851305", + "1" + ], + [ + "18560871238309448818460766562744547697148363037343956535792235616659017629936", + "848996258987629030560802456856143978874163406710746626629073992328887796032", + "1" + ], + [ + "7874345070739401918729490017220510840012387915996666165096279053332508734978", + "13852450233139738604328359130811646100736017746403163286072714982369405518174", + "1" + ], + [ + "10286600277144562479559831743823704670448219507618562412904737597091255798077", + "5934839280547658510772066750929157448004508409420318809358983794566350893316", + "1" + ] + ] +} \ No newline at end of file diff --git a/move202503/AKAKing23/code/chain_front/public/intermediate.png b/move202503/AKAKing23/code/chain_front/public/intermediate.png new file mode 100644 index 00000000..1d7e9e6f Binary files /dev/null and b/move202503/AKAKing23/code/chain_front/public/intermediate.png differ diff --git a/move202503/AKAKing23/code/chain_front/public/logo.png b/move202503/AKAKing23/code/chain_front/public/logo.png new file mode 100644 index 00000000..8bbf3214 Binary files /dev/null and b/move202503/AKAKing23/code/chain_front/public/logo.png differ diff --git a/move202503/AKAKing23/code/chain_front/public/primary.png b/move202503/AKAKing23/code/chain_front/public/primary.png new file mode 100644 index 00000000..518c2b7f Binary files /dev/null and b/move202503/AKAKing23/code/chain_front/public/primary.png differ diff --git a/move202503/AKAKing23/code/chain_front/public/vite.svg b/move202503/AKAKing23/code/chain_front/public/vite.svg new file mode 100644 index 00000000..e7b8dfb1 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/move202503/AKAKing23/code/chain_front/src/App.css b/move202503/AKAKing23/code/chain_front/src/App.css new file mode 100644 index 00000000..b9d355df --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/move202503/AKAKing23/code/chain_front/src/App.tsx b/move202503/AKAKing23/code/chain_front/src/App.tsx new file mode 100644 index 00000000..c3c91746 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/App.tsx @@ -0,0 +1,14 @@ +// import { useState } from 'react' +// import reactLogo from './assets/react.svg' +// import viteLogo from '/vite.svg' +// import './App.css' + +function App() { + return ( + <> +
+ + ); +} + +export default App; diff --git a/move202503/AKAKing23/code/chain_front/src/api/axios.ts b/move202503/AKAKing23/code/chain_front/src/api/axios.ts new file mode 100644 index 00000000..a457fa3e --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/api/axios.ts @@ -0,0 +1,42 @@ +import axios from 'axios'; + +// 创建axios实例 +const service = axios.create({ + baseURL: '/api', // 基础URL + timeout: 50000, // 请求超时时间 + headers: { + 'Content-Type': 'application/json;charset=utf-8', + }, +}); + +// 请求拦截器 +service.interceptors.request.use( + (config) => { + // 可以在这里添加token等认证信息 + // const token = localStorage.getItem('token'); + // if (token) { + // config.headers['Authorization'] = `Bearer ${token}`; + // } + return config; + }, + (error) => { + console.error('请求错误', error); + return Promise.reject(error); + } +); + +// 响应拦截器 +service.interceptors.response.use( + (response) => { + const res = response.data; + // 这里可以根据后端返回的状态码进行不同处理 + return res; + }, + (error) => { + console.error('响应错误', error); + // 这里可以处理HTTP状态码错误 + return Promise.reject(error); + } +); + +export default service; \ No newline at end of file diff --git a/move202503/AKAKing23/code/chain_front/src/api/coze.ts b/move202503/AKAKing23/code/chain_front/src/api/coze.ts new file mode 100644 index 00000000..4ed95a11 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/api/coze.ts @@ -0,0 +1,104 @@ +import service from './axios'; + +// coze接口类型定义 +export interface CozeRequestParams { + input: string; + userId?: string; + [key: string]: string | number | boolean | undefined; // 更精确的参数类型 +} + +export interface CozeResponse { + reply?: string; + data?: { + output?: Array<{ + question: string; + options: string[]; + explanation?: string; + }>; + [key: string]: unknown; + }; + status: string; + message: string; + [key: string]: string | number | boolean | object | undefined; // 更精确的返回类型 +} + +// 验证答案接口参数 +export interface VerifyAnswerParams { + questionIndex: number; + selectedOption: number; + userId?: string; +} + +// 验证答案接口返回 +export interface VerifyAnswerResponse { + status: string; + data: { + isCorrect: boolean; + correctAnswer: string | number; + correctOptionLetter: string; + explanation?: string; + }; +} + +// 查看答案解析接口参数 +export interface QuestionSolutionParams { + questionIndex: number; + userId?: string; +} + +// 查看答案解析接口返回 +export interface QuestionSolutionResponse { + status: string; + data: { + question: string; + options: string[]; + answer: string | number; + correctOptionLetter: string; + explanation: string; + }; +} + +/** + * 向coze API发送消息 + * @param params 请求参数 + * @returns Promise + */ +export function sendMessageToCoze(params: CozeRequestParams): Promise { + return service({ + url: '/api/coze', + method: 'post', + data: params + }); +} + +/** + * 验证答案 + * @param params 验证参数 + * @returns Promise + */ +export function verifyAnswer(params: VerifyAnswerParams): Promise { + return service({ + url: '/api/verify-answer', + method: 'post', + data: params + }); +} + +/** + * 获取问题答案与解析 + * @param params 查询参数 + * @returns Promise + */ +export function getQuestionSolution(params: QuestionSolutionParams): Promise { + return service({ + url: '/api/question-solution', + method: 'get', + params + }); +} + +export default { + sendMessageToCoze, + verifyAnswer, + getQuestionSolution +}; \ No newline at end of file diff --git a/move202503/AKAKing23/code/chain_front/src/api/index.ts b/move202503/AKAKing23/code/chain_front/src/api/index.ts new file mode 100644 index 00000000..a6128d9f --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/api/index.ts @@ -0,0 +1,10 @@ +import service from './axios'; +import cozeApi from './coze'; + +export { service }; +export * from './coze'; + +export default { + service, + coze: cozeApi +}; \ No newline at end of file diff --git a/move202503/AKAKing23/code/chain_front/src/api/sui.ts b/move202503/AKAKing23/code/chain_front/src/api/sui.ts new file mode 100644 index 00000000..b15b01c6 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/api/sui.ts @@ -0,0 +1,430 @@ +import { Transaction } from "@mysten/sui/transactions"; +import { TESTNET_COUNTER_PACKAGE_ID } from "@/utils/constants"; +// 合约地址 +// export const CONTRACT_ADDRESS = '0x20cded4f9df05e37b44e3be2ffa9004dec77786950719fad6083694fdca45bf2'; // 需要替换为实际部署的合约地址 +export const CONTRACT_ADDRESS = TESTNET_COUNTER_PACKAGE_ID; + +/** + * 创建交易对象用于回答正确后奖励积分 + * @param quizManagerId - Quiz管理器ID + * @param userAddress - 用户地址 + * @param questionId - 问题ID + * @param points - 奖励积分数量 + * @returns 交易对象 + */ +export function createRewardTransaction( + quizManagerId: string, + userAddress: string, + questionId: number, + points: number +): Transaction { + const tx = new Transaction(); + + tx.moveCall({ + target: `${CONTRACT_ADDRESS}::point_token::reward_correct_answer`, + arguments: [ + tx.object(quizManagerId), // Quiz管理器实例 + tx.pure.address(userAddress), // 用户地址 + tx.pure.u64(questionId), // 问题ID + tx.pure.u64(points), // 奖励的积分数量 + ], + }); + + return tx; +} + +/** + * 创建交易对象用于铸造SBT奖励 + * @param issuerCapId - 发行者凭证ID + * @param name - SBT名称 + * @param description - SBT描述 + * @param url - 元数据URL + * @param recipient - 接收者地址 + * @returns 交易对象 + */ +export function createMintSBTTransaction( + issuerCapId: string, + name: string, + description: string, + url: string, + recipient: string +): Transaction { + const tx = new Transaction(); + + tx.moveCall({ + target: `${CONTRACT_ADDRESS}::sbt::mint`, + arguments: [ + tx.object(issuerCapId), // 发行者凭证 + tx.pure.string(name), // SBT名称 + tx.pure.string(description), // SBT描述 + tx.pure.string(url), // 元数据URL + tx.pure.address(recipient), // 接收者地址 + ], + }); + + return tx; +} + +/** + * 创建交易对象用于用户自助铸造SBT成就奖励 + * 不需要发行者凭证,用户可以在满足条件时直接铸造 + * @param name - SBT名称 + * @param description - SBT描述 + * @param url - 元数据URL + * @param quizScore - 用户的得分 + * @param totalQuestions - 测验的总题目数 + * @returns 交易对象 + */ +export function createSelfMintSBTTransaction( + name: string, + description: string, + url: string, + quizScore: number, + totalQuestions: number +): Transaction { + const tx = new Transaction(); + + tx.moveCall({ + target: `${CONTRACT_ADDRESS}::sbt::self_mint_achievement`, + arguments: [ + tx.pure.string(name), // SBT名称 + tx.pure.string(description), // SBT描述 + tx.pure.string(url), // 元数据URL + tx.pure.u64(quizScore), // 用户得分 + tx.pure.u64(totalQuestions), // 总题目数 + ], + }); + + return tx; +} + +/** + * 创建交易参数用于用户自助铸造SBT成就奖励 + * @param name - SBT名称 + * @param description - SBT描述 + * @param url - 元数据URL + * @param quizScore - 用户的得分 + * @param totalQuestions - 测验的总题目数 + * @returns 签名执行交易参数 + */ +export function createSelfMintSBTParams( + name: string, + description: string, + url: string, + quizScore: number, + totalQuestions: number +): { transaction: Transaction } { + return { + transaction: createSelfMintSBTTransaction( + name, + description, + url, + quizScore, + totalQuestions + ), + }; +} + +/** + * 创建交易参数用于铸造SBT奖励 + * @param issuerCapId - 发行者凭证ID + * @param name - SBT名称 + * @param description - SBT描述 + * @param url - 元数据URL + * @param recipient - 接收者地址 + * @returns 签名执行交易参数 + */ +export function createMintSBTParams( + issuerCapId: string, + name: string, + description: string, + url: string, + recipient: string +): { transaction: Transaction } { + return { + transaction: createMintSBTTransaction( + issuerCapId, + name, + description, + url, + recipient + ), + }; +} + +/** + * 创建交易对象用于直接奖励用户积分(使用direct_reward方法) + * @param quizManagerId - Quiz管理器ID + * @param userAddress - 用户地址 + * @param amount - 奖励积分数量 + * @returns 交易对象 + */ +export function createDirectRewardTransaction( + quizManagerId: string, + userAddress: string, + amount: number +): Transaction { + const tx = new Transaction(); + + tx.moveCall({ + target: `${CONTRACT_ADDRESS}::quiz::direct_reward`, + arguments: [ + tx.object(quizManagerId), // Quiz管理器实例 + tx.pure.address(userAddress), // 接收代币的用户地址 + tx.pure.u64(amount), // 奖励数量 + ], + }); + + return tx; +} + +/** + * 创建交易对象用于查看题目解析(使用简化方法) + * 调用新添加的view_solution_simple方法,不需要传入问题ID + * @param quizManagerId - Quiz管理器ID + * @param payment - 用户积分代币ID + * @param amount - 要销毁的积分数量 + * @returns 交易对象 + */ +export function createViewSolutionSimpleTransaction( + quizManagerId: string, + payment: string, + amount: number +): Transaction { + const tx = new Transaction(); + + tx.moveCall({ + target: `${CONTRACT_ADDRESS}::quiz::view_solution_simple`, + arguments: [ + tx.object(quizManagerId), // Quiz管理器实例 + tx.object(payment), // 用户的代币ID + tx.pure.u64(amount), // 要销毁的积分数量 + ], + }); + + return tx; +} + +/** + * 创建直接奖励交易参数 + * @param quizManagerId - Quiz管理器ID + * @param userAddress - 用户地址 + * @param amount - 奖励数量 + * @returns 签名执行交易参数 + */ +export function createDirectRewardParams( + quizManagerId: string, + userAddress: string, + amount: number +): { transaction: Transaction } { + return { + transaction: createDirectRewardTransaction( + quizManagerId, + userAddress, + amount + ), + }; +} + +// /** +// * 创建交易对象用于添加问题到链上 +// * @param quizManagerId - Quiz管理器ID +// * @param content - 问题内容 +// * @param correctAnswer - 正确答案 +// * @param rewardPoints - 回答正确的积分奖励 +// * @param solutionContent - 解析内容 +// * @param tokenCost - 查看解析所需积分 +// * @returns 交易对象 +// */ +export function createAddQuestionTransaction( + quizManagerId: string, + content: string, + correctAnswer: string, + rewardPoints: number, + solutionContent: string, + tokenCost: number +): Transaction { + const tx = new Transaction(); + + tx.moveCall({ + target: `${CONTRACT_ADDRESS}::point_token::add_question`, + arguments: [ + tx.object(quizManagerId), // Quiz管理器 + tx.pure.string(content), // 问题内容 + tx.pure.string(correctAnswer), // 正确答案 + tx.pure.u64(rewardPoints), // 奖励积分 + tx.pure.string(solutionContent), // 解析内容 + tx.pure.u64(tokenCost), // 解析费用 + ], + }); + + return tx; +} + +/** + * 创建交易对象用于添加简化问题到链上(不包含答案、解析和选项) + * 由于TypeScript中处理Move vector参数有困难,简化为创建一个不包含选项的问题 + * @param registryId - 问题注册表ID + * @param content - 问题内容 + * @returns 交易对象 + */ +export function createAddSimpleQuestionTransaction( + registryId: string, + content: string +): Transaction { + const tx = new Transaction(); + + // 假设我们添加了一个新的合约方法,只接收content参数 + tx.moveCall({ + target: `${CONTRACT_ADDRESS}::quiz::add_simple_question`, + arguments: [ + tx.object(registryId), // 问题注册表 + tx.pure.string(content), // 问题内容 + ], + }); + + return tx; +} + +/** + * 创建交易参数用于添加简化问题 + * @param registryId - 问题注册表ID + * @param content - 问题内容 + * @returns 签名执行交易参数 + */ +export function createAddSimpleQuestionParams( + registryId: string, + content: string +): { transaction: Transaction } { + return { + transaction: createAddSimpleQuestionTransaction( + registryId, + content + ), + }; +} + +/** + * 创建交易对象用于验证零知识证明 + * @param verifierId - 验证器对象ID + * @param circuit_name - 电路名称 + * @param proof - 证明字符串 + * @param public_inputs - 公共输入字符串 + * @param required_level - 要求的能力等级 + * @returns 交易对象 + */ +export function createVerifyZkProofTransaction( + verifierId: string, + circuit_name: string, + proof: string, + public_inputs: string, + required_level: number +): Transaction { + const tx = new Transaction(); + + tx.moveCall({ + target: `${CONTRACT_ADDRESS}::zk_verifier::verify_proof`, + arguments: [ + tx.object(verifierId), // 验证器对象实例 + tx.pure.string(circuit_name), // 电路名称 + tx.pure.string(proof), // 证明字符串 + tx.pure.string(public_inputs), // 公共输入字符串 + tx.pure.u64(required_level), // 要求等级 + ], + }); + + return tx; +} + +/** + * 创建验证零知识证明的交易参数 + * @param verifierId - 验证器对象ID + * @param circuit_name - 电路名称 + * @param proof - 证明字符串 + * @param public_inputs - 公共输入字符串 + * @param required_level - 要求的能力等级 + * @returns 签名执行交易参数 + */ +export function createVerifyZkProofParams( + verifierId: string, + circuit_name: string, + proof: string, + public_inputs: string, + required_level: number +): { transaction: Transaction } { + return { + transaction: createVerifyZkProofTransaction( + verifierId, + circuit_name, + proof, + public_inputs, + required_level + ), + }; +} + +/** + * 创建交易对象用于添加验证密钥 + * @param verifierId - 验证器对象ID + * @param circuit_name - 电路名称 + * @param verification_key - 验证密钥JSON字符串 + * @returns 交易对象 + */ +export function createAddVerificationKeyTransaction( + verifierId: string, + circuit_name: string, + verification_key: string +): Transaction { + const tx = new Transaction(); + + tx.moveCall({ + target: `${CONTRACT_ADDRESS}::zk_verifier::add_verification_key`, + arguments: [ + tx.object(verifierId), // 验证器对象实例 + tx.pure.string(circuit_name), // 电路名称 + tx.pure.string(verification_key), // 验证密钥JSON字符串 + ], + }); + + return tx; +} + +/** + * 创建添加验证密钥的交易参数 + * @param verifierId - 验证器对象ID + * @param circuit_name - 电路名称 + * @param verification_key - 验证密钥JSON字符串 + * @returns 签名执行交易参数 + */ +export function createAddVerificationKeyParams( + verifierId: string, + circuit_name: string, + verification_key: string +): { transaction: Transaction } { + return { + transaction: createAddVerificationKeyTransaction( + verifierId, + circuit_name, + verification_key + ), + }; +} + +export default { + createRewardTransaction, + createDirectRewardTransaction, + createViewSolutionSimpleTransaction, + createDirectRewardParams, + createAddQuestionTransaction, + createAddSimpleQuestionTransaction, + createAddSimpleQuestionParams, + createMintSBTTransaction, + createMintSBTParams, + createSelfMintSBTTransaction, + createSelfMintSBTParams, + createVerifyZkProofTransaction, + createVerifyZkProofParams, + createAddVerificationKeyTransaction, + createAddVerificationKeyParams, + CONTRACT_ADDRESS, +}; diff --git a/move202503/AKAKing23/code/chain_front/src/api/walrus.ts b/move202503/AKAKing23/code/chain_front/src/api/walrus.ts new file mode 100644 index 00000000..3086901b --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/api/walrus.ts @@ -0,0 +1,298 @@ +// Copyright (c), Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 +import { SealClient } from "@mysten/seal"; +import { Transaction } from "@mysten/sui/transactions"; +import { getAllowlistedKeyServers } from "@mysten/seal"; +import { fromHex, toHex } from "@mysten/sui/utils"; +import { TESTNET_COUNTER_PACKAGE_ID } from "@/utils/constants"; +// import type { SuiClient } from "@mysten/sui/client"; + +// 定义数据结构类型 +export type WalrusData = { + status: string; + blobId: string; + endEpoch: string; + suiRefType: string; + suiRef: string; + suiBaseUrl: string; + blobUrl: string; + suiUrl: string; + isImage: boolean; +}; + +// Walrus服务类型 +export type WalrusService = { + id: string; + name: string; + publisherUrl: string; + aggregatorUrl: string; +}; + +// 存储信息类型定义 +export type StorageInfo = { + alreadyCertified?: { + blobId: string; + endEpoch: string; + event: { + txDigest: string; + }; + }; + newlyCreated?: { + blobObject: { + blobId: string; + storage: { + endEpoch: string; + }; + id: string; + }; + }; +}; + +// 默认Walrus服务 +export const walrusServices: WalrusService[] = [ + { + id: "service1", + name: "walrus.space", + publisherUrl: "/publisher1", + aggregatorUrl: "/aggregator1", + }, + { + id: "service2", + name: "staketab.org", + publisherUrl: "/publisher2", + aggregatorUrl: "/aggregator2", + }, + { + id: "service3", + name: "redundex.com", + publisherUrl: "/publisher3", + aggregatorUrl: "/aggregator3", + }, + { + id: "service4", + name: "nodes.guru", + publisherUrl: "/publisher4", + aggregatorUrl: "/aggregator4", + }, + { + id: "service5", + name: "banansen.dev", + publisherUrl: "/publisher5", + aggregatorUrl: "/aggregator5", + }, + { + id: "service6", + name: "everstake.one", + publisherUrl: "/publisher6", + aggregatorUrl: "/aggregator6", + }, +]; + +// 常量 +const SUI_VIEW_TX_URL = `https://suiscan.xyz/testnet/tx`; +const SUI_VIEW_OBJECT_URL = `https://suiscan.xyz/testnet/object`; +const NUM_EPOCH = 1; + +/** + * 获取Walrus聚合器URL + */ +export function getAggregatorUrl(serviceId: string, path: string): string { + const service = walrusServices.find((s) => s.id === serviceId); + const cleanPath = path.replace(/^\/+/, "").replace(/^v1\//, ""); + return `${service?.aggregatorUrl}/v1/${cleanPath}`; +} + +/** + * 获取Walrus发布者URL + */ +export function getPublisherUrl(serviceId: string, path: string): string { + const service = walrusServices.find((s) => s.id === serviceId); + const cleanPath = path.replace(/^\/+/, "").replace(/^v1\//, ""); + return `${service?.publisherUrl}/v1/${cleanPath}`; +} + +/** + * 将数据加密并上传到Walrus服务 + */ +export async function encryptAndUploadToWalrus( + file: File, + policyObject: string, + suiClient: unknown, // 使用unknown类型,然后在函数内部使用类型断言 + serviceId: string = "service1" // 默认使用第一个服务 +): Promise { + // 创建SealClient + const client = new SealClient({ + suiClient: suiClient as any, // 使用any类型断言解决版本兼容问题 + serverObjectIds: getAllowlistedKeyServers("testnet"), + verifyKeyServers: false, + }); + + // 读取文件内容 + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = async function (event) { + if (event.target && event.target.result) { + const result = event.target.result; + if (result instanceof ArrayBuffer) { + try { + // 生成随机数 + const nonce = crypto.getRandomValues(new Uint8Array(5)); + const policyObjectBytes = fromHex(policyObject); + const id = toHex(new Uint8Array([...policyObjectBytes, ...nonce])); + + // 加密数据 + const { encryptedObject: encryptedBytes } = await client.encrypt({ + threshold: 2, + packageId: TESTNET_COUNTER_PACKAGE_ID, + id, + data: new Uint8Array(result), + }); + + // 存储加密数据 + const storageInfo = await storeBlob(encryptedBytes, serviceId); + + // 构建并返回结果 + const walrusData = formatUploadResult(storageInfo.info, file.type); + resolve(walrusData); + } catch (error) { + reject(error); + } + } else { + reject(new Error("Unexpected result type: " + typeof result)); + } + } + }; + reader.onerror = reject; + reader.readAsArrayBuffer(file); + }); +} + +/** + * 存储加密后的Blob数据到Walrus服务 + */ +async function storeBlob(encryptedData: Uint8Array, serviceId: string) { + const response = await fetch( + `${getPublisherUrl(serviceId, `/v1/blobs?epochs=${NUM_EPOCH}`)}`, + { + method: "PUT", + body: encryptedData, + } + ); + + if (response.status === 200) { + const info = await response.json(); + return { info }; + } else { + throw new Error("存储Blob数据到Walrus失败!请尝试其他Walrus服务。"); + } +} + +/** + * 格式化上传结果为易于使用的对象 + */ +function formatUploadResult(storage_info: StorageInfo, media_type: string): WalrusData { + let info: WalrusData; + + if ("alreadyCertified" in storage_info && storage_info.alreadyCertified) { + info = { + status: "Already certified", + blobId: storage_info.alreadyCertified.blobId, + endEpoch: storage_info.alreadyCertified.endEpoch, + suiRefType: "Previous Sui Certified Event", + suiRef: storage_info.alreadyCertified.event.txDigest, + suiBaseUrl: SUI_VIEW_TX_URL, + blobUrl: getAggregatorUrl( + "service1", // 默认使用service1 + `/v1/blobs/${storage_info.alreadyCertified.blobId}` + ), + suiUrl: `${SUI_VIEW_OBJECT_URL}/${storage_info.alreadyCertified.event.txDigest}`, + isImage: media_type.startsWith("image"), + }; + } else if ("newlyCreated" in storage_info && storage_info.newlyCreated) { + info = { + status: "Newly created", + blobId: storage_info.newlyCreated.blobObject.blobId, + endEpoch: storage_info.newlyCreated.blobObject.storage.endEpoch, + suiRefType: "Associated Sui Object", + suiRef: storage_info.newlyCreated.blobObject.id, + suiBaseUrl: SUI_VIEW_OBJECT_URL, + blobUrl: getAggregatorUrl( + "service1", // 默认使用service1 + `/v1/blobs/${storage_info.newlyCreated.blobObject.blobId}` + ), + suiUrl: `${SUI_VIEW_OBJECT_URL}/${storage_info.newlyCreated.blobObject.id}`, + isImage: media_type.startsWith("image"), + }; + } else { + throw Error("Unhandled successful response!"); + } + + return info; +} + +/** + * 创建关联加密数据到Sui对象的交易 + * 返回值使用any类型以避免Transaction版本兼容性问题 + */ +export function createPublishBlobTransaction( + policyObject: string, + // capId: string, + moduleName: string, + blobId: string, + packageId: string, + difficulty?: string +): any { + const tx = new Transaction(); + + // 判断是否提供了difficulty参数 + if (difficulty) { + // 使用publish_with_difficulty函数 + tx.moveCall({ + target: `${packageId}::${moduleName}::publish_with_difficulty`, + arguments: [ + tx.object(policyObject), + tx.pure.string(blobId), + tx.pure.string(difficulty), + ], + }); + } else { + // 使用基本的publish函数 + tx.moveCall({ + target: `${packageId}::${moduleName}::publish`, + arguments: [ + tx.object(policyObject), + tx.pure.string(blobId), + ], + }); + } + + tx.setGasBudget(10000000); + return tx; +} + +/** + * 创建查询指定难度的题目Blob列表的交易 + * 注意:实际查询结果需要通过前端事件索引实现 + * @param difficulty 题目难度级别 + * @param packageId 包ID + * @param moduleName 模块名称,通常为"seal_quiz_walrus" + * @returns Transaction 交易对象 + */ +export function createQueryBlobsTransaction( + difficulty: string, + packageId: string, + moduleName: string = "seal_quiz_walrus" +): Transaction { + const tx = new Transaction(); + + // 调用query_blobs_by_difficulty方法 + tx.moveCall({ + target: `${packageId}::${moduleName}::query_blobs_by_difficulty`, + arguments: [ + tx.pure.string(difficulty), + ], + }); + + tx.setGasBudget(10000000); + return tx; +} \ No newline at end of file diff --git a/move202503/AKAKing23/code/chain_front/src/assets/fonts/EricaOne-Regular.ttf b/move202503/AKAKing23/code/chain_front/src/assets/fonts/EricaOne-Regular.ttf new file mode 100644 index 00000000..8bd91d11 Binary files /dev/null and b/move202503/AKAKing23/code/chain_front/src/assets/fonts/EricaOne-Regular.ttf differ diff --git a/move202503/AKAKing23/code/chain_front/src/assets/fonts/RammettoOne-Regular.ttf b/move202503/AKAKing23/code/chain_front/src/assets/fonts/RammettoOne-Regular.ttf new file mode 100644 index 00000000..e5bddb2f Binary files /dev/null and b/move202503/AKAKing23/code/chain_front/src/assets/fonts/RammettoOne-Regular.ttf differ diff --git a/move202503/AKAKing23/code/chain_front/src/assets/images/blurball.png b/move202503/AKAKing23/code/chain_front/src/assets/images/blurball.png new file mode 100644 index 00000000..dd42f344 Binary files /dev/null and b/move202503/AKAKing23/code/chain_front/src/assets/images/blurball.png differ diff --git a/move202503/AKAKing23/code/chain_front/src/assets/images/logo.png b/move202503/AKAKing23/code/chain_front/src/assets/images/logo.png new file mode 100644 index 00000000..0eb8c7ae Binary files /dev/null and b/move202503/AKAKing23/code/chain_front/src/assets/images/logo.png differ diff --git a/move202503/AKAKing23/code/chain_front/src/assets/react.svg b/move202503/AKAKing23/code/chain_front/src/assets/react.svg new file mode 100644 index 00000000..6c87de9b --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/move202503/AKAKing23/code/chain_front/src/components/Background.css b/move202503/AKAKing23/code/chain_front/src/components/Background.css new file mode 100644 index 00000000..7590506d --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/components/Background.css @@ -0,0 +1,35 @@ +.background { + --scale: 0.7; + pointer-events: none; +} + +.fullscreen { + position: fixed; + top: 0%; + left: 0; + width: 100%; + height: 100%; + /* z-index: 101; */ + /* z-index: -1; */ +} + +.background .ball { + position: absolute; + left: calc(100% * var(--x)); + top: calc(100% * var(--y)); + width: calc(var(--scale) * 50rem * var(--s)); + height: calc(var(--scale) * 50rem * var(--s)); + opacity: var(--o); + overflow: hidden; +} + +/* 黑暗模式下,小球亮了点,这里再减去一点透明度 */ +.darkMode .background .ball { + opacity: calc(var(--o) - 0.4); +} + +.background .ball img { + position: relative; + width: 100%; + height: 100%; +} diff --git a/move202503/AKAKing23/code/chain_front/src/components/BackgroundBall.tsx b/move202503/AKAKing23/code/chain_front/src/components/BackgroundBall.tsx new file mode 100644 index 00000000..9ac6be40 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/components/BackgroundBall.tsx @@ -0,0 +1,146 @@ +import React, { useEffect, useRef } from "react"; +import { gsap } from "gsap"; +import blurballImage from "@/assets/images/blurball.png"; +import "./Background.css"; + +const BackgroundBall: React.FC = () => { + const backgroundRef = useRef(null); + + useEffect(() => { + let balls: NodeListOf | null = null; + let mouse_x = 0; + let mouse_y = 0; + let distance_x = 0; + let distance_y = 0; + + const init = () => { + if (!backgroundRef.current) return; + balls = backgroundRef.current.querySelectorAll(".ball"); + + // 绑定监听事件 + document.addEventListener("mousemove", handleMouseMove); + document.addEventListener("touchmove", handleTouchMove); + document.addEventListener("mouseleave", resetBalls); + document.addEventListener("touchend", resetBalls); + }; + + const handleMouseMove = (e: MouseEvent) => { + moveBalls(e.clientX, e.clientY); + }; + + const handleTouchMove = (e: TouchEvent) => { + moveBalls(e.touches[0].clientX, e.touches[0].clientY); + }; + + // 移动背景模糊小球 + const moveBalls = (x: number, y: number) => { + // 防止大幅度抖动:例如在鼠标离开界面后再回来 + if (Math.abs(x - mouse_x) >= window.innerWidth / 10) mouse_x = x; + if (Math.abs(y - mouse_y) >= window.innerHeight / 10) mouse_y = y; + + // 更新距离:将距离与屏幕尺寸绑定:避免不同尺寸下移动距离差异过大 + distance_x += ((x - mouse_x) / window.innerWidth) * 80; + distance_y += ((y - mouse_y) / window.innerHeight) * 80; + + // 移动小球 + if (balls) { + gsap.to(balls, { + x: `${-distance_x}px`, + y: `${-distance_y}px`, + duration: 3, + ease: "power3.out", + }); + } + + // 更新坐标 + mouse_x = x; + mouse_y = y; + }; + + // 复位所有背景模糊小球 + const resetBalls = () => { + if (balls) { + gsap.to(balls, { + x: 0, + y: 0, + duration: 5, + ease: "power3.out", + }); + } + distance_x = distance_y = 0; + }; + + init(); + + // 清理事件监听 + return () => { + document.removeEventListener("mousemove", handleMouseMove); + document.removeEventListener("touchmove", handleTouchMove); + document.removeEventListener("mouseleave", resetBalls); + document.removeEventListener("touchend", resetBalls); + }; + }, []); + + return ( +
+ {/* 这里的模糊小球用图片代替滤镜是为了适配safari浏览器,safari对于滤镜不太友好,大范围模糊容易卡顿 */} +
+ blurball +
+
+ blurball +
+
+ blurball +
+
+ blurball +
+
+ blurball +
+
+ ); +}; + +export default BackgroundBall; diff --git a/move202503/AKAKing23/code/chain_front/src/components/Layout.tsx b/move202503/AKAKing23/code/chain_front/src/components/Layout.tsx new file mode 100644 index 00000000..fe1b7af7 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/components/Layout.tsx @@ -0,0 +1,45 @@ +import React from "react"; +import { Link, Outlet, useLocation } from "react-router-dom"; +import { ConnectButton } from "@mysten/dapp-kit"; +import BackgroundBall from "@/components/BackgroundBall"; +import logoImage from "@/assets/images/logo.png"; +// 将Layout组件拆分为外层和内层组件 +const InnerLayout: React.FC = () => { + const location = useLocation(); + const isHomePage = location.pathname === "/" || location.pathname === ""; + + return ( +
+
+
+ {/* LearnChain-X */} + + learnChain-X + +
+ +
+ +
+ + +
+
+ ); +}; + +const Layout: React.FC = () => { + return ; +}; + +const changelang = () => { + const lang = localStorage.setItem("lang", "zhcn"); + console.log(lang); +}; +changelang(); +export default Layout; diff --git a/move202503/AKAKing23/code/chain_front/src/components/Loading.css b/move202503/AKAKing23/code/chain_front/src/components/Loading.css new file mode 100644 index 00000000..6575e673 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/components/Loading.css @@ -0,0 +1,101 @@ +.loading { + --scale: 1; + display: flex; + justify-content: center; + align-items: center; + position: fixed; + top: 15%; + left: 0; + width: 100%; + height: 80%; + background-color: var(--color_white, #ffffff); + mix-blend-mode: darken; + z-index: 10; +} +._fullscreen { + position: fixed; + top: 20%; + left: 0; + width: 100%; + height: 80%; + display: flex; +} + +.loading_icon { + position: absolute; + width: calc(var(--scale) * 35rem); +} + +.loading_icon path { + fill: none; + stroke: var(--color_back, #5763fa); + stroke-linecap: round; +} + +.loading_icon path:nth-child(1) { + stroke-width: 2; + stroke-dasharray: 0 5 0 5 0 5 0 5 0 500; +} + +.loading_icon path:nth-child(2) { + stroke-width: 4; + stroke-dasharray: 0 500 0 500; + stroke-dashoffset: 480; +} + +.loading_mask { + position: absolute; + width: 145vmax; + height: 145vmax; + border-radius: 100%; + /* background-color: var(--color_back, #a9aef4); */ + background-color: var(--color_back, #434040); + transform: scale(0); +} + +.loading_container { + position: relative; + width: calc(var(--scale) * 9.5rem); + height: calc(var(--scale) * 9.5rem); + display: flex; + align-items: center; + justify-content: center; +} +.loading_circle { + position: absolute; + width: calc(var(--scale) * 9.5rem); + height: calc(var(--scale) * 9.5rem); + border-radius: 100%; + /* background-color: var(--color_back, #5763fa); */ + /* background: linear-gradient( + 135deg, + var(--gradient_start, #6366f1) 0%, + var(--gradient_end, #14b8a6) 100% + ); */ + background: linear-gradient(135deg, #4361ee, #3a0ca3, #e98bb5); + box-shadow: 0 0 100px rgba(0, 0, 0, 0.5); + opacity: 0; +} + +.loading_tip { + position: absolute; + color: var(--color_front, #ffffff); + transition: color 0.5s cubic-bezier(0.33, 1, 0.68, 1); + cursor: pointer; + transform: translateY(50%); + clip-path: circle(0%); + font-size: 1.5rem; + font-weight: bold; +} + +._font_2 { + font-family: "Arial", sans-serif; + text-transform: uppercase; + letter-spacing: 2px; +} + +@media (hover: hover) { + .loading_tip:hover { + color: var(--color_gray, #888888); + } +} diff --git a/move202503/AKAKing23/code/chain_front/src/components/Loading.tsx b/move202503/AKAKing23/code/chain_front/src/components/Loading.tsx new file mode 100644 index 00000000..933f5ce7 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/components/Loading.tsx @@ -0,0 +1,229 @@ +import { useState, useEffect, useRef } from "react"; +import { gsap } from "gsap"; +import "./Loading.css"; +import { ConnectModal, useCurrentAccount } from "@mysten/dapp-kit"; +import { useNavigate } from "react-router-dom"; + +// 为window添加自定义属性声明 +declare global { + interface Window { + hideLoading?: (immediate?: () => void, next?: () => void) => void; + } +} + +const Loading = ({ onHideComplete }: { onHideComplete: () => void }) => { + const [isVisible, setIsVisible] = useState(true); + const currentAccount = useCurrentAccount(); + const [open, setOpen] = useState(false); + + const iconRef = useRef(null); + const path1Ref = useRef(null); + const path2Ref = useRef(null); + const tipRef = useRef(null); + const circleRef = useRef(null); + const maskRef = useRef(null); + const navigate = useNavigate(); + // 使用gsap.core.Timeline类型 + let animater: gsap.core.Timeline | null = null; + + // 初始化动画 + const initAnimation = () => { + // loading初始动画:小蛇循环划8 + animater = gsap.timeline().fromTo( + [path1Ref.current, path2Ref.current], + // 间隔开两端线条的描边偏移:使虚线线段呈现一个小蛇的样子 + { + strokeDashoffset: (i) => { + if (i === 0) return 0; + else return 480; + }, + }, + { + strokeDashoffset: (i) => { + if (i === 0) return -275; + else return 205; + }, + duration: 2, + ease: "linear", + onComplete: () => { + // 每播放完一次,检查一下加载状态,加载完成则执行完成动画,反之继续循环播放等待加载 + if (document.readyState === "complete") finishAnimation(); + else animater?.restart(); + }, + } + ); + }; + + // 加载完成:小蛇变成一个球 + const finishAnimation = () => { + animater = gsap + .timeline() + // 动画的第一部分:蛇头缩放消失,蛇身虚线偏移成圆形,并汇聚成实线,整体缩小以适应一会儿出现的文字 + .to(path2Ref.current, { + strokeWidth: 0, + duration: 0.4, + ease: "power3.out", + }) + .to( + path1Ref.current, + { + strokeDashoffset: -300, + duration: 0.4, + ease: "power3.out", + }, + "<" + ) + .to( + path1Ref.current, + { + strokeDasharray: "138 0 0 0 0 0 0 0 0 500", + duration: 0.7, + ease: "power3.out", + }, + "<" + ) + .to( + iconRef.current, + { + scale: 0.6, + duration: 0.7, + ease: "power3.out", + }, + "<" + ) + // 动画的第二部分:提示文字显示 + .to( + tipRef.current, + { + clipPath: "circle(100%)", + y: 0, + duration: 0.7, + ease: "power3.out", + }, + "<0.3" + ) + .to( + circleRef.current, + { + opacity: 1, + duration: 0.7, + ease: "power3.out", + }, + "<" + ); + }; + + // 隐藏loading动画 + const hideLoading = (immediate?: () => void, next?: () => void) => { + // 动画播放器播放完后:才可以执行函数播放后续动画,否则会因为动画冲突导致BUG + if (animater && animater.isActive()) return; + if (immediate) immediate(); //存在立即执行函数,则立即执行 + + // 隐藏loading + animater = gsap + .timeline() + .to(tipRef.current, { + cursor: "auto", + scale: 0, + duration: 1, + ease: "power3.out", + }) + .to( + maskRef.current, + { + scale: 1, + duration: 2.5, + ease: "power3.out", + onComplete: () => { + setIsVisible(false); // 动画完成后,隐藏loading + if (next) next(); //如果有后续函数,则执行 + if (onHideComplete) onHideComplete(); + }, + }, + "<" + ); + setTimeout(() => { + navigate("/dashboard"); + }, 1000); + }; + + useEffect(() => { + initAnimation(); + + // 提供一个全局访问点 + window.hideLoading = hideLoading; + + return () => { + // 清理 + if (animater) animater.kill(); + window.hideLoading = undefined; + }; + }, []); + + // 监听钱包连接状态,连接成功后调用hideLoading + useEffect(() => { + // 当currentAccount存在时,表示钱包已连接成功 + if (currentAccount) { + // 适当延迟一下执行,保证连接界面关闭 + setTimeout(() => { + hideLoading(); + }, 300); + } + }, [currentAccount]); + + if (!isVisible) return null; + + return ( +
+ + + + +
+
+
+ + {" "} + {currentAccount ? "Connected" : "Connect Wallet"} +

+ } + open={open} + onOpenChange={(isOpen) => setOpen(isOpen)} + /> + {/*

hideLoading()} + > + START +

*/} +
+
+ ); +}; + +export default Loading; diff --git a/move202503/AKAKing23/code/chain_front/src/components/TypeWriter.tsx b/move202503/AKAKing23/code/chain_front/src/components/TypeWriter.tsx new file mode 100644 index 00000000..faa7470b --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/components/TypeWriter.tsx @@ -0,0 +1,26 @@ +import React, { useState, useEffect } from 'react'; + +interface TypeWriterProps { + text: string; + delay?: number; +} + +const TypeWriter: React.FC = ({ text, delay = 100 }) => { + const [displayText, setDisplayText] = useState(''); + const [currentIndex, setCurrentIndex] = useState(0); + + useEffect(() => { + if (currentIndex < text.length) { + const timeout = setTimeout(() => { + setDisplayText(prev => prev + text[currentIndex]); + setCurrentIndex(currentIndex + 1); + }, delay); + + return () => clearTimeout(timeout); + } + }, [currentIndex, delay, text]); + + return {displayText}; +}; + +export default TypeWriter; \ No newline at end of file diff --git a/move202503/AKAKing23/code/chain_front/src/components/ui/button.tsx b/move202503/AKAKing23/code/chain_front/src/components/ui/button.tsx new file mode 100644 index 00000000..a2df8dce --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/components/ui/button.tsx @@ -0,0 +1,59 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90", + destructive: + "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", + outline: + "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50", + secondary: + "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80", + ghost: + "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2 has-[>svg]:px-3", + sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5", + lg: "h-10 rounded-md px-6 has-[>svg]:px-4", + icon: "size-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +function Button({ + className, + variant, + size, + asChild = false, + ...props +}: React.ComponentProps<"button"> & + VariantProps & { + asChild?: boolean + }) { + const Comp = asChild ? Slot : "button" + + return ( + + ) +} + +export { Button, buttonVariants } diff --git a/move202503/AKAKing23/code/chain_front/src/index.css b/move202503/AKAKing23/code/chain_front/src/index.css new file mode 100644 index 00000000..2c247f9e --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/index.css @@ -0,0 +1,313 @@ +:root { + font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + --radius: 0.625rem; + --background: oklch(1 0 0); + --foreground: oklch(0.145 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.205 0 0); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted: oklch(0.97 0 0); + --muted-foreground: oklch(0.556 0 0); + --accent: oklch(0.97 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --input: oklch(0.922 0 0); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 2.5em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} + +/* 导入自定义样式 */ +@import './styles/layout.css'; +@import "tailwindcss"; +@import "tw-animate-css"; + +@custom-variant dark (&:is(.dark *)); + +@theme inline { + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); +} + +.dark { + --background: oklch(0.145 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.205 0 0); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.205 0 0); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.922 0 0); + --primary-foreground: oklch(0.205 0 0); + --secondary: oklch(0.269 0 0); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.556 0 0); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.556 0 0); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } +} + +/* 钱包页面样式 */ +.wallet-page { + max-width: 800px; + margin: 0 auto; + padding: 20px; +} + +.wallet-connect-section { + margin-bottom: 30px; + background-color: #f5f5f5; + padding: 20px; + border-radius: 8px; + text-align: center; +} + +.wallet-info { + margin-bottom: 30px; + background-color: #f0f8ff; + padding: 20px; + border-radius: 8px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); +} + +.wallet-not-connected { + margin-bottom: 30px; + background-color: #fff0f0; + padding: 20px; + border-radius: 8px; + text-align: center; +} + +.wallet-info-section { + background-color: #f5f5f5; + padding: 20px; + border-radius: 8px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + margin-bottom: 20px; +} + +.wallet-info-section h2 { + color: #333; + margin-bottom: 15px; +} + +.wallet-info-section p { + margin: 10px 0; + line-height: 1.5; +} + +/* 钱包链接样式 */ +.wallet-link { + display: inline-block; + margin-right: 15px; + padding: 8px 15px; + background-color: #4a90e2; + color: white; + text-decoration: none; + border-radius: 4px; + font-weight: 500; + transition: background-color 0.2s; +} + +.wallet-link:hover { + background-color: #3a7bc8; +} + +/* 字体 */ +@font-face { + font-family: title; + src: url(@/assets/fonts/EricaOne-Regular.ttf); +} +@font-face { + font-family: content; + src: url(@/assets/fonts/RammettoOne-Regular.ttf); +} + +/* 测验横幅样式 */ +.quiz-banner { + margin-top: 3rem; + padding: 2rem; + background: linear-gradient(135deg, #3498db, #2980b9); + border-radius: 12px; + color: white; + text-align: center; + box-shadow: 0 6px 16px rgba(0, 0, 0, 0.1); + animation: fadeIn 0.5s ease-in-out; +} + +.quiz-banner h2 { + font-size: 1.8rem; + margin-bottom: 1rem; +} + +.quiz-banner p { + margin-bottom: 1.5rem; + font-size: 1.1rem; + opacity: 0.9; +} + +.quiz-link { + display: inline-block; + background-color: white; + color: #2980b9; + padding: 0.75rem 2rem; + border-radius: 50px; + font-weight: bold; + text-decoration: none; + transition: all 0.3s ease; +} + +.quiz-link:hover { + transform: translateY(-3px); + box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1); +} + +/* 添加淡入动画 */ +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} diff --git a/move202503/AKAKing23/code/chain_front/src/lib/utils.ts b/move202503/AKAKing23/code/chain_front/src/lib/utils.ts new file mode 100644 index 00000000..bd0c391d --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/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/move202503/AKAKing23/code/chain_front/src/main.tsx b/move202503/AKAKing23/code/chain_front/src/main.tsx new file mode 100644 index 00000000..d42ba045 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/main.tsx @@ -0,0 +1,23 @@ +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import { RouterProvider } from "react-router-dom"; +import "./index.css"; +import router from "./router"; +import "../lang/index"; +import { SuiClientProvider, WalletProvider } from "@mysten/dapp-kit"; +import "@mysten/dapp-kit/dist/index.css"; +import { networkConfig } from "./utils/networkConfig.ts"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +const queryClient = new QueryClient(); + +createRoot(document.getElementById("root")!).render( + + + + + + + + + +); diff --git a/move202503/AKAKing23/code/chain_front/src/pages/About.tsx b/move202503/AKAKing23/code/chain_front/src/pages/About.tsx new file mode 100644 index 00000000..0207ba1e --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/pages/About.tsx @@ -0,0 +1,21 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; + +const About: React.FC = () => { + return ( +
+

关于我们

+

LearnChain-X是一个专注于区块链技术教育的平台,我们致力于帮助更多人了解和掌握区块链技术。

+

我们提供从入门到精通的系列课程,涵盖区块链基础知识、智能合约开发、DApp开发等多个方面。

+ +

我们的使命

+

普及区块链知识,培养区块链技术人才,推动区块链技术在各行业的应用。

+ +
+ 返回首页 +
+
+ ); +}; + +export default About; \ No newline at end of file diff --git a/move202503/AKAKing23/code/chain_front/src/pages/Courses.tsx b/move202503/AKAKing23/code/chain_front/src/pages/Courses.tsx new file mode 100644 index 00000000..80bdcf7d --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/pages/Courses.tsx @@ -0,0 +1,61 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; + +interface Course { + id: string; + title: string; + description: string; + level: string; +} + +const Courses: React.FC = () => { + // 模拟课程数据 + const coursesList: Course[] = [ + { + id: '1', + title: '区块链基础入门', + description: '了解区块链的基本概念、原理和应用场景', + level: '初级' + }, + { + id: '2', + title: '以太坊与智能合约开发', + description: '学习以太坊平台和Solidity智能合约开发', + level: '中级' + }, + { + id: '3', + title: 'DApp全栈开发实战', + description: '从前端到后端,完整开发去中心化应用', + level: '高级' + }, + ]; + + return ( +
+

课程列表

+
+ {coursesList.map(course => ( +
+

{course.title}

+

{course.description}

+ 难度: {course.level} + 查看详情 +
+ ))} +
+ +
+

测试你的区块链知识

+

完成我们的区块链选择题测验,检验你的学习成果!

+ 开始测验 +
+ +
+ 返回 +
+
+ ); +}; + +export default Courses; \ No newline at end of file diff --git a/move202503/AKAKing23/code/chain_front/src/pages/Dashboard.tsx b/move202503/AKAKing23/code/chain_front/src/pages/Dashboard.tsx new file mode 100644 index 00000000..6b187716 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/pages/Dashboard.tsx @@ -0,0 +1,393 @@ +import React, { useEffect, useRef, useState } from "react"; +import { gsap } from "gsap"; +import { useNavigate } from "react-router-dom"; +import "./Dashbord.css"; +// import BackgroundBall from "@/components/BackgroundBall"; +const Dashboard: React.FC = () => { + const navigate = useNavigate(); + const [isVisible, setIsVisible] = useState(true); + const [isMobile, setIsMobile] = useState(false); // 添加移动设备检测状态 + const containerRef = useRef(null); + const middleRef = useRef(null); + const titleRef = useRef(null); + const bigballRef = useRef(null); + const smallballsRefs = useRef([]); + const lineRef = useRef(null); + const ballsRef = useRef(null); + const titleLettersRefs = useRef([]); + const navRef = useRef(null); + const infoRef = useRef(null); + const animaterRef = useRef(null); + const maxDistanceRef = useRef(0); + + const isSafari = + /^((?!chrome|android).)*safari/i.test(navigator.userAgent) && + !navigator.userAgent.includes("CriOS"); + + // 重置welcome动画样式 + const reset = () => { + gsap + .timeline() + .set(lineRef.current, { + scale: 1, + opacity: 1, + }) + .set(ballsRef.current, { + scale: 1, + opacity: 1, + }) + .set(titleLettersRefs.current, { + clipPath: "circle(100%)", + y: 0, + }) + .set([navRef.current, infoRef.current], { + opacity: 1, + }); + + if (navRef.current) { + navRef.current.classList.add("welcome_nav_show"); + } + }; + + // 显示welcome + const show = () => { + // 动画播放器存在且正在播放动画:不执行函数,否则会因为动画冲突导致BUG + if (animaterRef.current && animaterRef.current.isActive()) return; + + reset(); // 重置为最终状态 + setIsVisible(true); // 显示welcome + + // 不再播放从小到大的动画 + animaterRef.current = gsap.timeline(); + }; + + // 隐藏welcome + const hidden = (immediate?: () => void, next?: () => void) => { + // 动画播放器存在且正在播放动画:不执行函数,否则会因为动画冲突导致BUG + if (animaterRef.current && animaterRef.current.isActive()) return; + + if (immediate) immediate(); // 存在立即执行代码,则立即执行 + + // 播放动画 + animaterRef.current = gsap + .timeline() + .to(lineRef.current, { + opacity: 0, + duration: 0.8, + ease: "power3.out", + }) + .to( + ballsRef.current, + { + opacity: 0, + duration: 0.8, + ease: "power3.out", + }, + "<" + ) + .to( + titleLettersRefs.current, + { + clipPath: "circle(0%)", + y: "-50%", + duration: 0.5, + ease: "power3.out", + stagger: { + each: 0.03, + from: "random", + }, + }, + "<" + ) + .to( + [navRef.current, infoRef.current], + { + opacity: 0, + duration: 0.8, + ease: "power3.out", + onComplete: () => { + setIsVisible(false); // 隐藏welcome + if (next) next(); // 如果有后续函数,则执行 + }, + }, + "<" + ); + }; + + // 移动标题文字,移动端和桌面端使用不同的移动距离 + const moveTitle = (x: number, y: number) => { + // 为移动设备调整移动距离 + const factor = isMobile ? 20 : 40; + + // 更新距离:以屏幕中心为基准。将距离与屏幕尺寸绑定:避免不同尺寸下移动距离差异过大 + // const distanceX = ((x - window.innerWidth / 2) / window.innerWidth) * factor; + const distanceX = + ((x - window.innerWidth / 3) / window.innerWidth) * factor; + // const distanceY = ((y - window.innerHeight / 2) / window.innerHeight) * factor; + const distanceY = + ((y - window.innerHeight / 3) / window.innerHeight) * factor; + + // 移动标题 + gsap.to(titleRef.current, { + x: `${distanceX}px`, + y: `${distanceY}px`, + duration: isMobile ? 2 : 3, // 移动设备上使用更短的动画时间 + ease: "power3.out", + }); + }; + + // 移动小球,也根据设备类型调整 + const moveSmallballs = (x: number, y: number) => { + // 更新距离:以屏幕中心为基准 + let distanceX = x - window.innerWidth / 2; + let distanceY = y - window.innerHeight / 2; + + // 移动设备上缩小移动距离 + if (isMobile) { + distanceX *= 0.5; + distanceY *= 0.5; + } + + // 限制移动边界 + distanceX = Math.min( + maxDistanceRef.current, + Math.max(-maxDistanceRef.current, distanceX) + ); + distanceY = Math.min( + maxDistanceRef.current, + Math.max(-maxDistanceRef.current, distanceY) + ); + + // 移动小球 + gsap.to(smallballsRefs.current, { + x: `${distanceX}px`, + y: `${distanceY}px`, + duration: isMobile ? 0.7 : 1, // 移动设备上使用更短的动画时间 + ease: "power3.out", + stagger: 0.1, + }); + }; + + // 导航函数替代全局存储的方法 + const startNewGame = (difficulty: string) => { + hidden(undefined, () => navigate(`/quiz?difficulty=${difficulty}`)); + }; + + // const continueGame = () => { + // if (playerActive) { + // hidden(undefined, () => navigate("/game/continue")); + // } + // }; + + // const showRank = () => { + // hidden(undefined, () => navigate("/rank")); + // }; + + // const showInstructions = () => { + // hidden(undefined, () => navigate("/instructions")); + // }; + + // 检查是否是移动设备 + const checkMobile = () => { + setIsMobile(window.innerWidth <= 768); + }; + + // 调整尺寸 + const handleResize = () => { + if (bigballRef.current) { + // 小球的移动范围局限在大球的周围 + maxDistanceRef.current = bigballRef.current.offsetWidth / 2.5; + } + + // 检查设备类型 + checkMobile(); + }; + + useEffect(() => { + // 检查是否有活跃玩家存档 + // 这里可以添加从localStorage或API获取玩家状态的逻辑 + // const checkPlayerActive = async () => { + // // 示例:检查localStorage中是否有玩家数据 + // const playerData = localStorage.getItem("playerData"); + // setPlayerActive(!!playerData); + // }; + + // checkPlayerActive(); + + // 初始化检查设备类型 + checkMobile(); + + // 绑定相关事件 + const bindEvents = () => { + const container = containerRef.current; + const middle = middleRef.current; + + if (container) { + // 在界面范围内:标题文字跟随鼠标/手指偏移 + container.onmousemove = (e: MouseEvent) => { + moveTitle(e.x, e.y); + }; + container.ontouchmove = (e: TouchEvent) => { + moveTitle(e.touches[0].clientX, e.touches[0].clientY); + }; + // 移动结束后,让标题回到原位,即屏幕中心点 + container.onmouseout = () => { + moveTitle(window.innerWidth / 2, window.innerHeight / 2); + }; + container.ontouchend = () => { + moveTitle(window.innerWidth / 2, window.innerHeight / 2); + }; + } + + if (middle) { + // 在靠近中间内容的范围内:小球跟随鼠标/手指偏移,形成融球效果 + middle.onmousemove = (e: MouseEvent) => { + moveSmallballs(e.x, e.y); + }; + middle.ontouchmove = (e: TouchEvent) => { + moveSmallballs(e.touches[0].clientX, e.touches[0].clientY); + }; + // 移动结束后,让小球回到原位,即屏幕中心点 + middle.onmouseout = () => { + moveSmallballs(window.innerWidth / 2, window.innerHeight / 2); + }; + middle.ontouchend = () => { + moveSmallballs(window.innerWidth / 2, window.innerHeight / 2); + }; + } + }; + + // 初始化 + handleResize(); + bindEvents(); + + // 显示欢迎界面 + show(); + + // 添加window的resize事件监听 + window.addEventListener("resize", handleResize); + + // 清理函数 + return () => { + window.removeEventListener("resize", handleResize); + }; + }, []); + + return ( +
+
+
+
+ {"MOVE".split("").map((letter, index) => ( +

{ + if (el && !titleLettersRefs.current.includes(el)) { + titleLettersRefs.current.push(el); + } + }} + > + {letter} +

+ ))} +
+
+ {"START".split("").map((letter, index) => ( +

{ + if (el && !titleLettersRefs.current.includes(el)) { + titleLettersRefs.current.push(el); + } + }} + > + {letter} +

+ ))} +
+
+

+ The beloved technology growth platform of global geeks +

+ {/* safari浏览器对css的filter适配不友好,这里检测到如果是safari浏览器,则取消滤镜融球效果 */} +
+
+ {[1, 1.5, 1.2].map((scale, index) => ( +
{ + if (el && !smallballsRefs.current.includes(el)) { + smallballsRefs.current.push(el); + } + }} + >
+ ))} +
+ + + +
+
+
+
startNewGame('primary')}> +
+

Primary

+
+
+
+
startNewGame('intermediate')}> +
+

Intermediate

+
+
+
+
startNewGame('advanced')}> +
+

Advanced

+
+
+ {/*
+
+
+

INSTRUTION

+
+
*/} +
+
+ ); +}; + +export default Dashboard; diff --git a/move202503/AKAKing23/code/chain_front/src/pages/Dashbord.css b/move202503/AKAKing23/code/chain_front/src/pages/Dashbord.css new file mode 100644 index 00000000..67a386d9 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/pages/Dashbord.css @@ -0,0 +1,388 @@ +.welcome { + --scale: 1; + justify-content: center; + align-items: center; +} + +/* ._fullscreen { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + z-index: 100; +} */ + +._fullscreen { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + display: flex; + z-index: 100; + overflow: hidden; +} + +._hidden { + display: none; +} + +.welcome_middle { + position: relative; + display: flex; + justify-content: center; + align-items: center; + width: 100vw; + height: 100vh; + /* width: 100%; */ + /* height: 100%; */ + /* width: calc(var(--scale) * 82rem); + height: calc(var(--scale) * 55rem); */ +} + +.welcome_middle_title { + display: flex; + flex-direction: column; + position: absolute; + left: 300px; + color: var(--color_white); + mix-blend-mode: exclusion; + z-index: 10; + font-family: title !important; +} + +.welcome_middle_title > div { + display: flex; +} + +.welcome_middle_title > div:nth-child(1) { + margin-right: calc(var(--scale) * 15rem); +} + +.welcome_middle_title > div:nth-child(2) { + justify-content: flex-end; + margin-left: calc(var(--scale) * 15rem); +} + +.welcome_middle_title p { + font-family: title; + /* line-height: calc(var(--scale) * 17rem); */ +} + +.welcome_middle_info { + position: absolute; + bottom: 30px; + left: 30px; + width: 40%; + /* color: var(--color_back); */ + color: var(--color_white); + line-height: calc(var(--scale) * 3.5rem); + mix-blend-mode: exclusion; + z-index: 10; + font-family: title; +} + +.welcome_middle_balls { + position: absolute; + display: flex; + justify-content: center; + align-items: center; + /* width: calc(var(--scale) * 85rem); + height: calc(var(--scale) * 85rem); */ + width: 100vw; + height: 100vh; +} + +.welcome_middle_balls div { + position: absolute; + left: 500px; +} + +.welcome_middle_balls_filter { + filter: contrast(1000%); + /* background-color: var(--color_back); */ + background-color: var(--color_white); + mix-blend-mode: var(--mix); + opacity: 0.5; +} + +.welcome_middle_balls_filter div { + filter: blur(calc(var(--scale) * 3rem)); +} + +.welcome_middle_balls_big { + width: calc(var(--scale) * 30rem); + height: calc(var(--scale) * 30rem); + background-color: var(--color_front); + border-radius: 100%; +} + +.welcome_middle_balls_small { + width: calc(var(--scale) * 15rem * var(--s)); + height: calc(var(--scale) * 15rem * var(--s)); + background-color: var(--color_front); + border-radius: 100%; +} + +.welcome_middle_line { + position: absolute; + width: calc(var(--scale) * 66rem); + overflow: visible; +} + +.welcome_middle_line circle { + stroke: var(--color_front); + stroke-dasharray: 0 calc(var(--scale) * 2rem); + transform-origin: center; + /* animation: welcome_line_rotate 8s linear infinite; */ +} + +.welcome_nav { + /* 整个选项框显示前的旋转度数 */ + --before_rotate: 45deg; + /* 整个选项框显示后的旋转度数 */ + --after_rotate: 0deg; + /* 每一个选项的间隔旋转度数 */ + --interval_rotate: 12deg; + /* 每一个选项屏幕比例修改后的修正旋转度数 */ + --correct_rotate: 0deg; + position: absolute; + display: flex; + justify-content: center; + align-items: center; + /* width: calc(var(--scale) * 135rem); */ + width: calc(var(--scale) * 100rem); + height: calc(var(--scale) * 50rem); + transform: rotate(var(--before_rotate)); + pointer-events: none; + /* 样式偏上 */ + bottom: 200px; +} + +.welcome_nav_show { + transform: rotate(var(--after_rotate)); + transition: transform 1.2s var(--ease_out); +} + +.welcome_nav_line { + position: absolute; + width: 100%; + overflow: visible; + animation: welcome_line_rotate 15s linear infinite; +} + +.welcome_nav_line circle { + stroke: var(--color_front); + stroke-dasharray: 0 calc(var(--scale) * 2rem); +} + +.welcome_nav_selection { + position: absolute; + /* width: 100%; */ + width: 70%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + transform-origin: center; + transform: rotate(calc(var(--interval_rotate) * var(--i))); +} + +.wns_node { + position: absolute; + display: flex; + align-items: center; + left: 80%; + height: calc(var(--scale) * 7rem); + transform-origin: left; + transform: rotate(calc(var(--interval_rotate) * var(--i) * -1 - var(--correct_rotate))); + pointer-events: all; + cursor: pointer; +} + +.wns_node div { + position: relative; + display: flex; + justify-content: center; + align-items: center; + width: calc(var(--scale) * 1rem); + height: calc(var(--scale) * 1rem); + background-color: var(--color_front); + border-radius: 100%; + margin-right: calc(var(--scale) * 1.5rem); +} + +.wns_node div::after { + content: ""; + position: absolute; + width: 200%; + height: 200%; + border: calc(var(--scale) * 0.05rem) solid var(--color_front); + border-radius: 100%; + transform: scale(0); + transition: transform 0.5s var(--ease_out); +} + +.wns_node p { + /* align-self: flex-end; */ + color: var(--color_front); + white-space: nowrap; + transition: transform 0.5s var(--ease_out); +} + +.wns_unclickable { + pointer-events: none; + cursor: auto; +} + +.wns_unclickable div { + background-color: var(--color_gray); +} + +.wns_unclickable p { + color: var(--color_gray); +} + +@media (hover: hover) { + .wns_node:hover div::after { + transform: scale(1); + } + .wns_node:hover p { + transform: translateX(5%); + } +} + +._dashed { + fill: none; + stroke-width: 0.2; +} + +._font_2 { + font-size: calc(var(--scale) * 2.2rem); + font-family: title !important; +} + +._font_3 { + font-size: calc(var(--scale) * 2rem); +} + +._font_6 { + /* font-size: calc(var(--scale) * 15rem); */ + font-size: calc(var(--scale) * 8rem); +} + +/* 定义全局CSS变量,通常会在根样式中定义 */ +:root { + --color_white: #ffffff; + /* --color_front: #041a31; */ + --color_front: #020432; + --color_back: #000000; + --color_gray: #a0a0a0; + --mix: difference; + --ease_out: cubic-bezier(0.33, 1, 0.68, 1); +} + +@keyframes welcome_line_rotate { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} + +@media screen and (max-aspect-ratio: 1/1) { + .welcome_nav { + --interval_rotate: 25deg; + --before_rotate: 5deg; + --after_rotate: 60deg; + --correct_rotate: 60deg; + width: calc(var(--scale) * 135rem * 0.9); + height: calc(var(--scale) * 135rem * 0.9); + } + .wns_node { + left: 100%; + } +} + +/* 添加移动端适配 */ +@media screen and (max-width: 768px) { + .welcome { + --scale: 0.5; /* 在移动设备上缩小整体比例 */ + } + + .welcome_middle { + width: 100%; + height: auto; + flex-direction: column; + } + + .welcome_middle_title { + transform: scale(0.4); + } + + .welcome_middle_title > div:nth-child(1) { + margin-right: calc(var(--scale) * 5rem); + } + + .welcome_middle_title > div:nth-child(2) { + margin-left: calc(var(--scale) * 5rem); + } + + .welcome_middle_info { + width: 80%; + text-align: center; + position: relative; + margin-top: 1rem; + } + + .welcome_nav { + width: calc(var(--scale) * 105rem); + height: calc(var(--scale) * 105rem); + } +} + +/* 小屏幕设备的更多适配 */ +@media screen and (max-width: 480px) { + .welcome { + --scale: 0.35; /* 在更小的移动设备上进一步缩小 */ + } + + .welcome_middle_title { + transform: scale(0.5); + } + + .welcome_nav { + width: calc(var(--scale) * 95rem); + height: calc(var(--scale) * 95rem); + } + + ._font_6 { + font-size: calc(var(--scale) * 6rem); + } + + ._font_3 { + font-size: calc(var(--scale) * 2.5rem); + } + + ._font_2 { + font-size: calc(var(--scale) * 1.8rem); + } +} + +/* 针对横屏模式的适配 */ +@media screen and (orientation: landscape) and (max-height: 500px) { + .welcome { + --scale: 0.4; + } + + .welcome_middle { + height: 90vh; + } + + .welcome_nav { + transform: scale(0.8); + } +} \ No newline at end of file diff --git a/move202503/AKAKing23/code/chain_front/src/pages/Dashbord.module.css b/move202503/AKAKing23/code/chain_front/src/pages/Dashbord.module.css new file mode 100644 index 00000000..7fb4b9d9 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/pages/Dashbord.module.css @@ -0,0 +1,278 @@ +.welcome { + --scale: 1; + justify-content: center; + align-items: center; + } + + ._fullscreen { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + z-index: 100; + } + + ._hidden { + display: none; + } + + .welcome_middle { + position: relative; + display: flex; + justify-content: center; + align-items: center; + width: calc(var(--scale) * 82rem); + height: calc(var(--scale) * 55rem); + } + + .welcome_middle_title { + display: flex; + flex-direction: column; + position: absolute; + color: var(--color_white); + mix-blend-mode: exclusion; + z-index: 10; + } + + .welcome_middle_title > div { + display: flex; + } + + .welcome_middle_title > div:nth-child(1) { + margin-right: calc(var(--scale) * 15rem); + } + + .welcome_middle_title > div:nth-child(2) { + justify-content: flex-end; + margin-left: calc(var(--scale) * 15rem); + } + + .welcome_middle_title p { + font-family: title; + line-height: calc(var(--scale) * 17rem); + } + + .welcome_middle_info { + position: absolute; + left: 0; + bottom: 0; + width: 40%; + color: var(--color_white); + line-height: calc(var(--scale) * 3.5rem); + mix-blend-mode: exclusion; + z-index: 10; + } + + .welcome_middle_balls { + position: absolute; + display: flex; + justify-content: center; + align-items: center; + width: calc(var(--scale) * 85rem); + height: calc(var(--scale) * 85rem); + } + + .welcome_middle_balls div { + position: absolute; + } + + .welcome_middle_balls_filter { + filter: contrast(1000%); + background-color: var(--color_back); + mix-blend-mode: var(--mix); + } + + .welcome_middle_balls_filter div { + filter: blur(calc(var(--scale) * 3rem)); + } + + .welcome_middle_balls_big { + width: calc(var(--scale) * 30rem); + height: calc(var(--scale) * 30rem); + background-color: var(--color_front); + border-radius: 100%; + } + + .welcome_middle_balls_small { + width: calc(var(--scale) * 15rem * var(--s)); + height: calc(var(--scale) * 15rem * var(--s)); + background-color: var(--color_front); + border-radius: 100%; + } + + .welcome_middle_line { + position: absolute; + width: calc(var(--scale) * 66rem); + overflow: visible; + } + + .welcome_middle_line circle { + stroke: var(--color_front); + stroke-dasharray: 0 calc(var(--scale) * 2rem); + transform-origin: center; + animation: welcome_line_rotate 8s linear infinite; + } + + .welcome_nav { + /* 整个选项框显示前的旋转度数 */ + --before_rotate: 45deg; + /* 整个选项框显示后的旋转度数 */ + --after_rotate: 0deg; + /* 每一个选项的间隔旋转度数 */ + --interval_rotate: 12deg; + /* 每一个选项屏幕比例修改后的修正旋转度数 */ + --correct_rotate: 0deg; + position: absolute; + display: flex; + justify-content: center; + align-items: center; + width: calc(var(--scale) * 135rem); + height: calc(var(--scale) * 135rem); + transform: rotate(var(--before_rotate)); + pointer-events: none; + } + + .welcome_nav_show { + transform: rotate(var(--after_rotate)); + transition: transform 1.2s var(--ease_out); + } + + .welcome_nav_line { + position: absolute; + width: 100%; + overflow: visible; + animation: welcome_line_rotate 15s linear infinite; + } + + .welcome_nav_line circle { + stroke: var(--color_front); + stroke-dasharray: 0 calc(var(--scale) * 2rem); + } + + .welcome_nav_selection { + position: absolute; + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + transform-origin: center; + transform: rotate(calc(var(--interval_rotate) * var(--i))); + } + + .wns_node { + position: absolute; + display: flex; + align-items: center; + left: 99.7%; + height: calc(var(--scale) * 7rem); + transform-origin: left; + transform: rotate(calc(var(--interval_rotate) * var(--i) * -1 - var(--correct_rotate))); + pointer-events: all; + cursor: pointer; + } + + .wns_node div { + position: relative; + display: flex; + justify-content: center; + align-items: center; + width: calc(var(--scale) * 1rem); + height: calc(var(--scale) * 1rem); + background-color: var(--color_front); + border-radius: 100%; + margin-right: calc(var(--scale) * 1rem); + } + + .wns_node div::after { + content: ""; + position: absolute; + width: 200%; + height: 200%; + border: calc(var(--scale) * 0.05rem) solid var(--color_front); + border-radius: 100%; + transform: scale(0); + transition: transform 0.5s var(--ease_out); + } + + .wns_node p { + align-self: flex-end; + color: var(--color_front); + white-space: nowrap; + transition: transform 0.5s var(--ease_out); + } + + .wns_unclickable { + pointer-events: none; + cursor: auto; + } + + .wns_unclickable div { + background-color: var(--color_gray); + } + + .wns_unclickable p { + color: var(--color_gray); + } + + @media (hover: hover) { + .wns_node:hover div::after { + transform: scale(1); + } + .wns_node:hover p { + transform: translateX(5%); + } + } + + ._dashed { + fill: none; + stroke-width: 0.2; + } + + ._font_2 { + font-size: calc(var(--scale) * 2rem); + } + + ._font_3 { + font-size: calc(var(--scale) * 3rem); + } + + ._font_6 { + font-size: calc(var(--scale) * 15rem); + } + + /* 定义全局CSS变量,通常会在根样式中定义 */ + :root { + --color_white: #ffffff; + /* --color_front: #0a84ff; */ + --color_front: #fff; + --color_back: #000000; + --color_gray: #a0a0a0; + --mix: difference; + --ease_out: cubic-bezier(0.33, 1, 0.68, 1); + } + + @keyframes welcome_line_rotate { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } + } + + @media screen and (max-aspect-ratio: 1/1) { + .welcome_nav { + --interval_rotate: 25deg; + --before_rotate: 5deg; + --after_rotate: 60deg; + --correct_rotate: 60deg; + width: calc(var(--scale) * 135rem * 0.9); + height: calc(var(--scale) * 135rem * 0.9); + } + .wns_node { + left: 100%; + } + } \ No newline at end of file diff --git a/move202503/AKAKing23/code/chain_front/src/pages/EncryptAndUpload.tsx b/move202503/AKAKing23/code/chain_front/src/pages/EncryptAndUpload.tsx new file mode 100644 index 00000000..1ba67e6f --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/pages/EncryptAndUpload.tsx @@ -0,0 +1,344 @@ +// @ts-nocheck +import React, { useState } from "react"; +import { Transaction } from "@mysten/sui/transactions"; +import { TESTNET_COUNTER_PACKAGE_ID } from "@/utils/constants"; +import { useSignAndExecuteTransaction, useSuiClient } from "@mysten/dapp-kit"; +import { getAllowlistedKeyServers, SealClient } from "@mysten/seal"; +import { fromHex, toHex } from "@mysten/sui/utils"; + +export type Data = { + status: string; + blobId: string; + endEpoch: string; + suiRefType: string; + suiRef: string; + suiBaseUrl: string; + blobUrl: string; + suiUrl: string; + isImage: string; +}; + +interface WalrusUploadProps { + policyObject: string; + cap_id: string; + moduleName: string; +} + +type WalrusService = { + id: string; + name: string; + publisherUrl: string; + aggregatorUrl: string; +}; + +export function WalrusUpload({ + policyObject, + cap_id, + moduleName, +}: WalrusUploadProps) { + const [file, setFile] = useState(null); + const [info, setInfo] = useState(null); + const [isUploading, setIsUploading] = useState(false); + const [selectedService, setSelectedService] = useState("service1"); + + const SUI_VIEW_TX_URL = `https://suiscan.xyz/testnet/tx`; + const SUI_VIEW_OBJECT_URL = `https://suiscan.xyz/testnet/object`; + + const NUM_EPOCH = 1; + const suiClient = useSuiClient(); + console.log(suiClient, "suiClient---"); + + const client = new SealClient({ + suiClient, + serverObjectIds: getAllowlistedKeyServers("testnet"), + verifyKeyServers: false, + }); + console.log(client, "client----"); + + const services: WalrusService[] = [ + { + id: "service1", + name: "walrus.space", + publisherUrl: "/publisher1", + aggregatorUrl: "/aggregator1", + }, + { + id: "service2", + name: "staketab.org", + publisherUrl: "/publisher2", + aggregatorUrl: "/aggregator2", + }, + { + id: "service3", + name: "redundex.com", + publisherUrl: "/publisher3", + aggregatorUrl: "/aggregator3", + }, + { + id: "service4", + name: "nodes.guru", + publisherUrl: "/publisher4", + aggregatorUrl: "/aggregator4", + }, + { + id: "service5", + name: "banansen.dev", + publisherUrl: "/publisher5", + aggregatorUrl: "/aggregator5", + }, + { + id: "service6", + name: "everstake.one", + publisherUrl: "/publisher6", + aggregatorUrl: "/aggregator6", + }, + ]; + + function getAggregatorUrl(path: string): string { + const service = services.find((s) => s.id === selectedService); + const cleanPath = path.replace(/^\/+/, "").replace(/^v1\//, ""); + return `${service?.aggregatorUrl}/v1/${cleanPath}`; + } + + function getPublisherUrl(path: string): string { + const service = services.find((s) => s.id === selectedService); + const cleanPath = path.replace(/^\/+/, "").replace(/^v1\//, ""); + return `${service?.publisherUrl}/v1/${cleanPath}`; + } + + const { mutate: signAndExecute } = useSignAndExecuteTransaction({ + execute: async ({ bytes, signature }) => + await suiClient.executeTransactionBlock({ + transactionBlock: bytes, + signature, + options: { + showRawEffects: true, + showEffects: true, + }, + }), + }); + + const handleFileChange = (event: any) => { + const file = event.target.files[0]; + // Max 10 MiB size + if (file.size > 10 * 1024 * 1024) { + alert("File size must be less than 10 MiB"); + return; + } + // Check if file is an image + if (!file.type.startsWith("image/")) { + alert("Only image files are allowed"); + return; + } + setFile(file); + setInfo(null); + }; + + const handleSubmit = () => { + setIsUploading(true); + if (file) { + const reader = new FileReader(); + reader.onload = async function (event) { + if (event.target && event.target.result) { + const result = event.target.result; + if (result instanceof ArrayBuffer) { + const nonce = crypto.getRandomValues(new Uint8Array(5)); + const policyObjectBytes = fromHex(policyObject); + const id = toHex(new Uint8Array([...policyObjectBytes, ...nonce])); + const { encryptedObject: encryptedBytes } = await client.encrypt({ + threshold: 2, + packageId: TESTNET_COUNTER_PACKAGE_ID, + id, + data: new Uint8Array(result), + }); + const storageInfo = await storeBlob(encryptedBytes); + displayUpload(storageInfo.info, file.type); + setIsUploading(false); + } else { + console.error("Unexpected result type:", typeof result); + setIsUploading(false); + } + } + }; + reader.readAsArrayBuffer(file); + } else { + console.error("No file selected"); + } + }; + + const displayUpload = (storage_info: any, media_type: any) => { + let info; + if ("alreadyCertified" in storage_info) { + info = { + status: "Already certified", + blobId: storage_info.alreadyCertified.blobId, + endEpoch: storage_info.alreadyCertified.endEpoch, + suiRefType: "Previous Sui Certified Event", + suiRef: storage_info.alreadyCertified.event.txDigest, + suiBaseUrl: SUI_VIEW_TX_URL, + blobUrl: getAggregatorUrl( + `/v1/blobs/${storage_info.alreadyCertified.blobId}` + ), + suiUrl: `${SUI_VIEW_OBJECT_URL}/${storage_info.alreadyCertified.event.txDigest}`, + isImage: media_type.startsWith("image"), + }; + } else if ("newlyCreated" in storage_info) { + info = { + status: "Newly created", + blobId: storage_info.newlyCreated.blobObject.blobId, + endEpoch: storage_info.newlyCreated.blobObject.storage.endEpoch, + suiRefType: "Associated Sui Object", + suiRef: storage_info.newlyCreated.blobObject.id, + suiBaseUrl: SUI_VIEW_OBJECT_URL, + blobUrl: getAggregatorUrl( + `/v1/blobs/${storage_info.newlyCreated.blobObject.blobId}` + ), + suiUrl: `${SUI_VIEW_OBJECT_URL}/${storage_info.newlyCreated.blobObject.id}`, + isImage: media_type.startsWith("image"), + }; + } else { + throw Error("Unhandled successful response!"); + } + setInfo(info); + }; + + const storeBlob = (encryptedData: Uint8Array) => { + return fetch(`${getPublisherUrl(`/v1/blobs?epochs=${NUM_EPOCH}`)}`, { + method: "PUT", + body: encryptedData, + }).then((response) => { + if (response.status === 200) { + return response.json().then((info) => { + return { info }; + }); + } else { + alert( + "Error publishing the blob on Walrus, please select a different Walrus service." + ); + setIsUploading(false); + throw new Error("Something went wrong when storing the blob!"); + } + }); + }; + + async function handlePublish( + wl_id: string, + cap_id: string, + moduleName: string + ) { + const tx = new Transaction(); + tx.moveCall({ + target: `${packageId}::${moduleName}::publish`, + arguments: [ + tx.object(wl_id), + tx.object(cap_id), + tx.pure.string(info!.blobId), + ], + }); + + tx.setGasBudget(10000000); + signAndExecute( + { + transaction: tx, + }, + { + onSuccess: async (result) => { + console.log("res", result); + alert( + "Blob attached successfully, now share the link or upload more." + ); + }, + } + ); + } + + return ( +
+
+
+
Select Walrus service:
+ +
+ +

File size must be less than 10 MiB. Only image files are allowed.

+ + {isUploading && ( +
+
+ + Uploading to Walrus (may take a few seconds, retrying with + different service is possible){" "} + +
+ )} + + {info && file && ( + + )} + +
+
+ ); +} + +export default WalrusUpload; diff --git a/move202503/AKAKing23/code/chain_front/src/pages/Home.tsx b/move202503/AKAKing23/code/chain_front/src/pages/Home.tsx new file mode 100644 index 00000000..b55570fa --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/pages/Home.tsx @@ -0,0 +1,21 @@ +import React from "react"; +import TypeWriter from "../components/TypeWriter"; +import Loading from "@/components/Loading"; +const Home: React.FC = () => { + return ( +
+
+

知识上链,成就永恒

+

+ +

+
+ console.log("加载动画完成")} /> +
+ ); +}; + +export default Home; diff --git a/move202503/AKAKing23/code/chain_front/src/pages/NotFound.tsx b/move202503/AKAKing23/code/chain_front/src/pages/NotFound.tsx new file mode 100644 index 00000000..6f7d5c37 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/pages/NotFound.tsx @@ -0,0 +1,14 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; + +const NotFound: React.FC = () => { + return ( +
+

404 - 页面未找到

+

抱歉,您访问的页面不存在。

+ 返回首页 +
+ ); +}; + +export default NotFound; \ No newline at end of file diff --git a/move202503/AKAKing23/code/chain_front/src/pages/Quiz.tsx b/move202503/AKAKing23/code/chain_front/src/pages/Quiz.tsx new file mode 100644 index 00000000..2e7103cb --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/pages/Quiz.tsx @@ -0,0 +1,1116 @@ +// @ts-nocheck +import React, { useState, useEffect, useRef } from "react"; +import { Link, useSearchParams } from "react-router-dom"; +import { + sendMessageToCoze, + verifyAnswer, + getQuestionSolution, +} from "../api/coze"; +import { + createDirectRewardParams, + createViewSolutionSimpleTransaction, + createAddSimpleQuestionParams, + createSelfMintSBTParams, + CONTRACT_ADDRESS, +} from "../api/sui"; +import "../styles/Quiz.css"; +import { TESTNET_QUIZMANAGER_ID, TESTNET_REGISTRY_ID,TESTNET_COUNTER_PACKAGE_ID } from "@/utils/constants"; +import { + useCurrentAccount, + useSignAndExecuteTransaction, + useSuiClient, +} from "@mysten/dapp-kit"; +import { Button } from "@/components/ui/button"; +import { Loader2 } from "lucide-react"; +import { + encryptAndUploadToWalrus, + createPublishBlobTransaction, +} from "@/api/walrus"; +import { Transaction } from "@mysten/sui/transactions"; + +interface QuizQuestion { + id?: number; + question: string; + options: string[]; + explanation?: string; +} + +const Quiz: React.FC = () => { + const [searchParams] = useSearchParams(); + const difficulty = searchParams.get("difficulty") || "primary"; + const [loading, setLoading] = useState(true); + const [questions, setQuestions] = useState([]); + const [currentQuestionIndex, setCurrentQuestionIndex] = useState(0); + const [selectedOption, setSelectedOption] = useState(null); + const [score, setScore] = useState(0); + const [quizCompleted, setQuizCompleted] = useState(false); + const [showAnswer, setShowAnswer] = useState(false); + const [answerResult, setAnswerResult] = useState<{ + isCorrect: boolean; + correctAnswer: string | number; + correctOptionLetter?: string; + explanation?: string; + } | null>(null); + const [sbtAwarded, setSbtAwarded] = useState(false); + const [encryptingQuestions, setEncryptingQuestions] = + useState(false); + const [questionsEncrypted, setQuestionsEncrypted] = useState(false); + const [walrusBlobId, setWalrusBlobId] = useState(""); + const [suiWalrusUrl, setSuiWalrusUrl] = useState(""); + + const currentAccount = useCurrentAccount(); + const { mutate: signAndExecuteTransaction } = useSignAndExecuteTransaction(); + const suiClient = useSuiClient(); + // userCoinId已经不再用于查看解析功能,但仍保留用于获取和显示代币余额 + const [userCoinId, setUserCoinId] = useState(null); + const [userTokenBalance, setUserTokenBalance] = useState("0"); + + // 使用useRef创建一个引用,用于跟踪函数是否已被调用 + const encryptionAttemptedRef = useRef(false); + + // 获取用户代币ID和余额的函数 + const getUserCoinId = async (address: string) => { + try { + if (!address) return null; + + // 获取用户拥有的所有代币 + const coins = await suiClient.getCoins({ + owner: address, + coinType: `${CONTRACT_ADDRESS}::point_token::POINT_TOKEN`, + }); + console.log(coins, "coins----"); + + // 如果用户有代币,返回第一个代币的ID + if (coins && coins.data && coins.data.length > 0) { + // 计算总余额 + let totalBalance = 0n; + for (const coin of coins.data) { + if (coin.balance) { + totalBalance += BigInt(coin.balance); + } + } + + // 更新余额状态(转换为可读格式,假设代币有9位小数) + const formattedBalance = formatTokenBalance(totalBalance); + setUserTokenBalance(formattedBalance); + + return coins.data[0].coinObjectId; + } + + return null; + } catch (error) { + console.error("获取用户代币失败:", error); + return null; + } + }; + + // 格式化代币余额的辅助函数 + const formatTokenBalance = (balance: bigint): string => { + const decimals = 9; // 假设代币有9位小数 + const divisor = BigInt(10 ** decimals); + + if (balance === 0n) return "0"; + + const integerPart = balance / divisor; + const fractionalPart = balance % divisor; + + if (fractionalPart === 0n) { + return integerPart.toString(); + } + + // 确保小数部分有正确的前导零 + let fractionalStr = fractionalPart.toString().padStart(decimals, "0"); + // 移除尾部的0 + fractionalStr = fractionalStr.replace(/0+$/, ""); + + return `${integerPart}.${fractionalStr}`; + }; + + // 手动刷新代币余额 + const refreshTokenBalance = async () => { + if (currentAccount) { + await getUserCoinId(currentAccount.address); + } + }; + + // 在组件挂载和用户账户变更时获取用户代币ID和余额 + useEffect(() => { + if (currentAccount) { + getUserCoinId(currentAccount.address).then((coinId) => { + setUserCoinId(coinId); + }); + } else { + setUserTokenBalance("0"); // 重置余额 + setUserCoinId(null); + } + }, [currentAccount]); + + useEffect(() => { + const fetchQuizQuestions = async () => { + try { + setLoading(true); + // 从localStorage检查是否已经缓存了题目 + const cachedQuestions = localStorage.getItem( + `quizQuestions_${difficulty}` + ); + // 生成或获取用户ID + const userId = + localStorage.getItem("userId") || + `user_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`; + localStorage.setItem("userId", userId); + + if (cachedQuestions) { + const parsedQuestions = JSON.parse(cachedQuestions); + setQuestions(parsedQuestions); + setLoading(false); + + // 加载缓存题目后,自动加密并上传到Walrus + if ( + currentAccount && + parsedQuestions.length > 0 && + !questionsEncrypted + ) { + setTimeout(() => { + // 将parsedQuestions作为参数传递 + encryptQuestionsToWalrus(parsedQuestions); + }, 1000); + } + } else { + // 如果没有缓存,则调用API获取题目 + // 根据难度级别调整提示词 + let prompt = ""; + switch (difficulty) { + case "primary": + prompt = + "请生成3道初级Move语言相关的选择题,每道题有4个选项,格式为JSON数组"; + break; + case "intermediate": + prompt = + "请生成3道中级Move语言相关的选择题,每道题有4个选项,格式为JSON数组"; + break; + case "advanced": + prompt = + "请生成3道高级Move语言相关的选择题,每道题有4个选项,格式为JSON数组"; + break; + default: + prompt = + "请生成3道初级Move语言相关的选择题,每道题有4个选项,格式为JSON数组"; + } + + const response = await sendMessageToCoze({ + input: prompt, + userId: userId, + }); + + // 处理返回的数据 + if (response.status === "success") { + let questions = []; + + // 尝试从不同位置提取题目数据 + if (response.data?.output && Array.isArray(response.data.output)) { + // 标准格式 + questions = response.data.output; + } else if (typeof response.data === "string") { + // 如果data是字符串,尝试解析 + try { + const parsedData = JSON.parse(response.data); + questions = Array.isArray(parsedData) + ? parsedData + : parsedData.output && Array.isArray(parsedData.output) + ? parsedData.output + : []; + } catch (e) { + console.error("解析字符串数据失败", e); + } + } + console.log(questions.length, "questions.length--"); + + if (questions.length > 0) { + setQuestions(questions); + // 缓存到localStorage,包含难度信息 + localStorage.setItem( + `quizQuestions_${difficulty}`, + JSON.stringify(questions) + ); + + // 加载新题目后,如果用户已登录,自动加密并上传到Walrus + if (currentAccount) { + setTimeout(() => { + encryptQuestionsToWalrus(questions); + }, 1000); + } + } else { + // 如果未能提取到题目数据,使用默认题目 + const defaultQuestions = getDefaultQuestions(); + setQuestions(defaultQuestions); + + // 如果用户已登录,自动加密并上传默认题目到Walrus + if (currentAccount) { + setTimeout(() => { + encryptQuestionsToWalrus(defaultQuestions); + }, 1000); + } + } + } else { + // 如果返回数据格式不正确,使用默认题目 + const defaultQuestions = getDefaultQuestions(); + setQuestions(defaultQuestions); + + // 如果用户已登录,自动加密并上传默认题目到Walrus + if (currentAccount) { + setTimeout(() => { + encryptQuestionsToWalrus(defaultQuestions); + }, 1000); + } + } + + // 模拟加载时间,给loading动画一些展示时间 + setTimeout(() => { + setLoading(false); + }, 1000); + } + } catch (error) { + console.error("获取题目失败", error); + const defaultQuestions = getDefaultQuestions(); + setQuestions(defaultQuestions); + setLoading(false); + + // 如果用户已登录,加载失败时也尝试加密并上传默认题目到Walrus + if (currentAccount) { + setTimeout(() => { + encryptQuestionsToWalrus(defaultQuestions); + }, 1000); + } + } + }; + + fetchQuizQuestions(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [difficulty, currentAccount]); // 移除 questionsEncrypted 作为依赖项 + + const getDefaultQuestions = (): QuizQuestion[] => { + return [ + { + explanation: + "Move语言是由Facebook的子公司Novi Financial开发的,用于其数字货币项目Diem(原Libra)的智能合约编程语言。", + options: ["A. Google", "B. Facebook", "C. Microsoft", "D. Apple"], + question: "Move语言是由哪个组织开发的?", + }, + { + explanation: + "Move语言是一种静态类型的编程语言,它强调类型安全性和资源管理,特别适合编写智能合约。", + options: ["A. 面向对象", "B. 静态类型", "C. 动态类型", "D. 过程式"], + question: "Move语言的主要特点是什么?", + }, + { + explanation: + "在Move语言中,使用关键字'resource'来声明资源,资源是一种特殊的结构体,它代表在Move中具有持久存在的数据。", + options: ["A. struct", "B. resource", "C. module", "D. fun"], + question: "在Move语言中,以下哪个关键字用于声明资源?", + }, + ]; + }; + + const handleOptionSelect = (optionIndex: number) => { + setSelectedOption(optionIndex); + }; + + const handleNextQuestion = () => { + // 重置答案状态 + setShowAnswer(false); + setSelectedOption(null); + setAnswerResult(null); + + // 移动到下一题或完成测验 + if (currentQuestionIndex < questions.length - 1) { + setCurrentQuestionIndex(currentQuestionIndex + 1); + } else { + setQuizCompleted(true); + // 检查是否所有题目都回答正确,尝试发放SBT + if (score === questions.length && currentAccount) { + mintAchievementSBT(); + } + } + }; + + const handleCheckAnswer = async () => { + if (selectedOption === null) return; + try { + const userId = localStorage.getItem("userId") || "default"; + const result = await verifyAnswer({ + questionIndex: currentQuestionIndex, + selectedOption: selectedOption, + userId: userId, + }); + + if (result.status === "success") { + setAnswerResult(result.data); + setShowAnswer(true); + + // 如果答案正确,增加分数并调用合约奖励用户 + if (result.data.isCorrect && currentAccount) { + setScore(score + 1); + + try { + // 奖励积分数量 + const rewardAmount = 1000000000; + + // 使用useSignAndExecuteTransaction的mutate方法执行交易 + signAndExecuteTransaction( + createDirectRewardParams( + TESTNET_QUIZMANAGER_ID, + currentAccount.address, + rewardAmount + ), + { + onSuccess: (result) => { + console.log("奖励积分成功!", result); + setTimeout(() => { + refreshTokenBalance(); + }, 1000); + }, + onError: (error) => { + console.error("奖励积分失败:", error); + }, + } + ); + } catch (walletError) { + console.error("调用钱包或合约失败:", walletError); + } + } + } + } catch (error) { + console.error("验证答案失败", error); + setShowAnswer(true); + } + }; + + const handleViewSolution = async () => { + try { + const userId = localStorage.getItem("userId") || "default"; + const result = await getQuestionSolution({ + questionIndex: currentQuestionIndex, + userId: userId, + }); + + if (result.status === "success") { + // 如果用户已登录且有代币,调用合约查看解析 + if (currentAccount && userCoinId) { + try { + // 使用新的简化方法,设置销毁的代币数量 + // const amount = 100000000; // 1 POINT (考虑小数位数) + const amount = 50000000; + + // 创建交易,使用简化的方法 + const transaction = createViewSolutionSimpleTransaction( + TESTNET_QUIZMANAGER_ID, + userCoinId, + amount + ); + + // 执行交易 + signAndExecuteTransaction( + { transaction }, + { + onSuccess: () => { + // 刷新代币余额 + setTimeout(() => { + refreshTokenBalance(); + }, 1000); + + // 设置答案结果 + setAnswerResult({ + isCorrect: + selectedOption !== null && + isCorrectOption( + result.data.answer, + selectedOption, + result.data.correctOptionLetter + ), + correctAnswer: result.data.answer, + correctOptionLetter: result.data.correctOptionLetter, + explanation: result.data.explanation, + }); + setShowAnswer(true); + }, + onError: (error) => { + console.error("查看解析失败:", error); + }, + } + ); + } catch (error) { + alert("缺少积分代币"); + console.error("调用合约查看解析失败:", error); + } + } else if (currentAccount) { + alert("暂无积分代币"); + // 如果用户已登录但没有代币,使用直接奖励方法 + // try { + // // 创建直接奖励交易 + // signAndExecuteTransaction( + // createDirectRewardParams( + // TESTNET_QUIZMANAGER_ID, + // currentAccount.address, + // 1000000 // 奖励1个代币 + // ), + // { + // onSuccess: (result) => { + // console.log("查看解析成功(使用直接奖励)!", result); + // // 刷新代币余额 + // refreshTokenBalance(); + // }, + // onError: (error) => { + // console.error("查看解析失败:", error); + // }, + // } + // ); + // } catch (error) { + // console.error("调用合约查看解析失败:", error); + // } + } + } + } catch (error) { + console.error("获取答案解析失败", error); + } + }; + + const resetQuiz = () => { + setCurrentQuestionIndex(0); + setSelectedOption(null); + setScore(0); + setQuizCompleted(false); + setShowAnswer(false); + setAnswerResult(null); + setSbtAwarded(false); + }; + + // 添加简化问题到链上的示例函数 + const handleAddSimpleQuestion = async () => { + if (!currentAccount) { + console.error("用户未登录"); + return; + } + + try { + // 这里应该获取问题注册表ID + const registryId = TESTNET_REGISTRY_ID; // 使用测试网络的注册表ID + + // 创建一个问题示例 + const question = { + content: + "Move语言中,以下哪个关键字用于声明模块?\nA. struct\nB. resource\nC. module\nD. function", + }; + + // 使用签名执行交易的mutate方法来添加问题 + signAndExecuteTransaction( + createAddSimpleQuestionParams(registryId, question.content), + { + onSuccess: (result) => { + console.log("简化问题添加成功!", result); + // 这里可以解析返回的结果获取问题ID + // 前端自己存储选项和正确答案,不上传到链上 + }, + onError: (error) => { + console.error("简化问题添加失败:", error); + }, + } + ); + } catch (error) { + console.error("添加简化问题失败:", error); + } + }; + + // 铸造成就SBT奖励 + const mintAchievementSBT = async () => { + if (!currentAccount || sbtAwarded) return; + + try { + // 根据难度级别设置不同的SBT信息 + let sbtName, sbtDescription, sbtUrl; + + switch (difficulty) { + case "primary": + sbtName = "LearnChain-X 初级答题达人"; + sbtDescription = + "恭喜完成LearnChain-X初级难度的所有问题并答对全部题目,获得初级答题达人成就!"; + // sbtUrl = primaryBadge; // 使用导入的初级徽章图片 + sbtUrl = "https://learnchainx.netlify.app/primary.png"; // 使用导入的初级徽章图片 + + break; + case "intermediate": + sbtName = "LearnChain-X 中级答题达人"; + sbtDescription = + "恭喜完成LearnChain-X中级难度的所有问题并答对全部题目,获得中级答题达人成就!"; + sbtUrl = "https://learnchainx.netlify.app/intermediate.png"; // 使用导入的中级徽章图片 + break; + case "advanced": + sbtName = "LearnChain-X 高级答题达人"; + sbtDescription = + "恭喜完成LearnChain-X高级难度的所有问题并答对全部题目,获得高级答题达人成就!这证明了您在Move语言方面的专业知识!"; + sbtUrl = "https://learnchainx.netlify.app/advanced.png"; // 使用导入的中级徽章图片 + break; + default: + sbtName = "LearnChain-X 答题达人"; + sbtDescription = + "恭喜完成LearnChain-X所有问题并答对全部题目,赢得此成就徽章!"; + sbtUrl = "https://learnchainx.netlify.app/primary.png"; // 使用导入的初级徽章图片 + } + + // 创建并执行自助铸造SBT的交易 + signAndExecuteTransaction( + createSelfMintSBTParams( + sbtName, + sbtDescription, + sbtUrl, + score, // 当前得分 + questions.length // 总题目数 + ), + { + onSuccess: (result) => { + console.log("SBT铸造成功!", result); + setSbtAwarded(true); + alert( + `恭喜您获得「${ + difficulty === "primary" + ? "初级" + : difficulty === "intermediate" + ? "中级" + : "高级" + }答题达人」成就徽章!` + ); + }, + onError: (error) => { + console.error("SBT铸造失败:", error); + alert("SBT铸造失败: " + error.message); + }, + } + ); + } catch (error) { + console.error("创建SBT交易失败:", error); + } + }; + + // 加密并上传题目到Walrus + const encryptQuestionsToWalrus = async (questionsToEncrypt = questions) => { + console.log(questionsToEncrypt, "questionsToEncrypt---"); + + // 如果已经尝试过加密,直接返回 + if (encryptionAttemptedRef.current) { + console.log("已经尝试过加密,不再重复执行"); + return; + } + + // 标记已尝试加密 + encryptionAttemptedRef.current = true; + + if ( + !currentAccount || + !questionsToEncrypt.length || + encryptingQuestions || + questionsEncrypted + ) + return; + + try { + setEncryptingQuestions(true); + + // 检查是否已创建白名单或从localStorage获取白名单ID + let allowlistObjectId = localStorage.getItem("allowlist_object_id"); + + // 如果没有白名单ID,创建一个新的白名单 + if (!allowlistObjectId) { + try { + // 创建白名单交易 + const createAllowlistTx = new Transaction(); + createAllowlistTx.moveCall({ + target: `${TESTNET_COUNTER_PACKAGE_ID}::allowlist::create_allowlist`, + arguments: [] + }); + + // 执行创建白名单交易 + const createResult = await new Promise((resolve) => { + signAndExecuteTransaction( + { transaction: createAllowlistTx as any }, + { + onSuccess: (result) => { + console.log("白名单创建成功:", result); + resolve(result); + }, + onError: (error) => { + console.error("白名单创建失败:", error); + resolve(null); + } + } + ); + }); + console.log(createResult,'createResult'); + + // 从交易结果中提取白名单对象ID + if (createResult) { + try { + console.log("交易结果:", createResult); + + // 交易完成后,直接查询用户拥有的Allowlist对象 + const objects = await suiClient.getOwnedObjects({ + owner: currentAccount.address, + filter: { + StructType: `${TESTNET_COUNTER_PACKAGE_ID}::allowlist::Allowlist` + }, + options: { + showContent: true + } + }); + + console.log("找到的白名单对象:", objects); + + if (objects && objects.data && objects.data.length > 0) { + // 获取最新创建的白名单对象ID + allowlistObjectId = objects.data[0].data?.objectId; + if (allowlistObjectId) { + localStorage.setItem("allowlist_object_id", allowlistObjectId); + console.log("已创建白名单并保存ID:", allowlistObjectId); + } + } + } catch (error) { + console.error("获取白名单对象失败:", error); + } + } + } catch (error) { + console.error("创建白名单失败:", error); + } + } + + // 如果已有白名单ID,将当前用户添加到白名单 + if (allowlistObjectId && currentAccount) { + try { + // 创建添加用户到白名单的交易 + const addToAllowlistTx = new Transaction(); + addToAllowlistTx.moveCall({ + target: `${TESTNET_COUNTER_PACKAGE_ID}::allowlist::add_to_allowlist`, + arguments: [ + addToAllowlistTx.object(allowlistObjectId), + addToAllowlistTx.pure.address(currentAccount.address) + ] + }); + + // 执行添加用户到白名单的交易 + await new Promise((resolve) => { + signAndExecuteTransaction( + { transaction: addToAllowlistTx as any }, + { + onSuccess: (result) => { + console.log("用户已添加到白名单:", result); + resolve(result); + }, + onError: (error) => { + console.error("添加用户到白名单失败:", error); + resolve(null); + } + } + ); + }); + } catch (error) { + console.error("添加用户到白名单失败:", error); + } + } + + // 创建包含题目和答案的数据结构 + const questionsData = { + questions: questionsToEncrypt, + difficulty, + timestamp: Date.now(), + creator: currentAccount.address, + }; + + // 检查是否已经加密过该难度的题目 + const encryptedKey = `encrypted_${difficulty}_${currentAccount.address}`; + const hasEncrypted = localStorage.getItem(encryptedKey); + + const encryptedSuiUrl = `encryptedSuiUrl_${difficulty}_${currentAccount.address}`; + const hasEncryptedSuiUrl = localStorage.getItem(encryptedSuiUrl); + + if (hasEncrypted) { + console.log(`题目已经加密过,使用缓存的blobId: ${hasEncrypted}`); + setWalrusBlobId(hasEncrypted); + setSuiWalrusUrl(hasEncryptedSuiUrl); + setQuestionsEncrypted(true); + setEncryptingQuestions(false); + return; + } + + // 将题目数据转为JSON并创建Blob + const jsonData = JSON.stringify(questionsData); + const blob = new Blob([jsonData], { type: "application/json" }); + const file = new File([blob], `quiz_${difficulty}_${Date.now()}.json`, { + type: "application/json", + }); + + // 使用Walrus API加密并上传 + const policyObject = currentAccount.address; + const result = await encryptAndUploadToWalrus( + file, + policyObject, + suiClient as unknown // 使用类型断言解决SuiClient版本兼容问题 + ); + // 保存返回的blobId + setWalrusBlobId(result.blobId); + setSuiWalrusUrl(result.suiUrl); + setQuestionsEncrypted(true); + + // 缓存加密状态到localStorage + localStorage.setItem(encryptedKey, result.blobId); + localStorage.setItem(encryptedSuiUrl, result.suiUrl); + + console.log("题目已加密存储到Walrus:", result); + + // 显示加密成功提示 + setTimeout(() => { + // alert( + // `${difficulty}难度题目已成功加密存储到Walrus!BlobId: ${result.blobId.substring( + // 0, + // 10 + // )}...`; + // ); + console.log( + `${difficulty}难度题目已成功加密存储到Walrus!BlobId: ${result.blobId.substring( + 0, + 10 + )}...` + ); + }, 500); + + // // 可选:将blobId关联到SUI对象 + // const capId = + // "0x4bb927a676df9af934ffb8861f340a4fa1042fb1276d061304e273e71dae62b3"; // 示例ID,实际使用时需要传入有效值 + // const packageId = "0x1234"; // 替换为实际的包ID + + try { + // 使用类型断言解决Transaction版本兼容性问题 + const tx = createPublishBlobTransaction( + policyObject, + // capId, + "seal_quiz_walrus", + result.blobId, + TESTNET_COUNTER_PACKAGE_ID, + difficulty // 传递题目难度级别作为参数 + ); + + signAndExecuteTransaction( + { transaction: tx as any }, // 使用类型断言解决类型兼容性问题 + { + onSuccess: (result) => { + console.log("题目blobId已关联到SUI对象", result); + }, + onError: (error) => { + console.error("关联题目blobId失败", error); + }, + } + ); + } catch (error) { + console.error("创建关联交易失败", error); + } + } catch (error) { + console.error("加密题目失败:", error); + // 如果发生错误,重置尝试状态,允许再次尝试 + encryptionAttemptedRef.current = false; + alert("加密题目失败,请稍后再试"); + } finally { + setEncryptingQuestions(false); + } + }; + + if (loading) { + return ( +
+
+

+ 一大波 + {difficulty === "primary" + ? "初级" + : difficulty === "intermediate" + ? "中级" + : difficulty === "advanced" + ? "高级" + : ""} + 题库正在来临... +

+
+ ); + } + + if (quizCompleted) { + return ( +
+

测验完成!

+

+ 您的分数: {score} / {questions.length} +

+ {score === questions.length && ( +
+

🏆 恭喜您答对所有题目!

+ {sbtAwarded ? ( +

+ 已获得「 + {difficulty === "primary" + ? "初级" + : difficulty === "intermediate" + ? "中级" + : "高级"} + 答题达人」灵魂绑定代币成就徽章! +

+ ) : currentAccount ? ( + + ) : ( +

请连接钱包以领取SBT成就徽章

+ )} +
+ )} +
+ + + 返回首页 + +
+
+ ); + } + + const currentQuestion = questions[currentQuestionIndex]; + + // 如果没有题目,显示加载中 + if (!currentQuestion) { + return ( +
+
+

加载题目中...

+
+ ); + } + + return ( +
+ {/* */} + {/* 显示用户代币余额 */} + {currentAccount && ( +
+

+ 积分余额: {userTokenBalance} POINT +

+ +
+ )} +
+
+
+
+

+ 问题 {currentQuestionIndex + 1} / {questions.length} +

+
+
+

{currentQuestion.question}

+ +
+ {currentQuestion.options.map((option, index) => ( +
!showAnswer && handleOptionSelect(index)} + > + + {String.fromCharCode(65 + index)} + + {option} +
+ ))} +
+ + {showAnswer && answerResult && ( +
+

{answerResult.isCorrect ? "✓ 回答正确!" : "✗ 回答错误!"}

+ {answerResult.correctOptionLetter && ( +

+ 正确答案:{answerResult.correctOptionLetter} +

+ )} + {answerResult.explanation && ( +

{answerResult.explanation}

+ )} +
+ )} + +
+ {selectedOption !== null && !showAnswer && ( + + )} + + {showAnswer && ( + + )} +
+
+ {!walrusBlobId && ( + + )} + {walrusBlobId && ( +
+
+ 题目加密信息: +
+

BlobId: {walrusBlobId}

+

难度级别: {difficulty}

+

题目数量: {questions.length}

+

状态: {questionsEncrypted ? "✅ 已加密存储" : "❌ 未加密"}

+ + Sui Object + +
+ )} + {/* 添加问题按钮,仅在开发环境显示 */} + {/* {process.env.NODE_ENV === "development" && ( +
+
+ + + +
+ + {walrusBlobId && ( +
+
题目加密信息:
+

BlobId: {walrusBlobId}

+

难度级别: {difficulty}

+

题目数量: {questions.length}

+

状态: {questionsEncrypted ? "✅ 已加密存储" : "❌ 未加密"}

+
+ )} +
+ )} */} +
+ ); +}; + +// 辅助函数,判断选项是否为正确选项 +const isCorrectOption = ( + correctAnswer: string | number, + optionIndex: number, + correctOptionLetter?: string +): boolean => { + // 如果有提供correctOptionLetter,优先使用字母判断 + if (correctOptionLetter) { + const letterIndex = correctOptionLetter.charCodeAt(0) - 65; // 'A'的ASCII码是65 + return optionIndex === letterIndex; + } + + // 以下是原有逻辑,作为备选判断方式 + if (typeof correctAnswer === "number") { + return optionIndex === correctAnswer; + } else if (typeof correctAnswer === "string") { + // 检查是否以字母前缀开头 (如 A. B. C. 等) + if (/^[A-D]\.?\s/.test(correctAnswer)) { + const letterIndex = correctAnswer.charCodeAt(0) - 65; // 'A' 的 ASCII 码是 65 + return optionIndex === letterIndex; + } + // 直接匹配内容 + const optionLetter = String.fromCharCode(65 + optionIndex); + return ( + correctAnswer.startsWith(optionLetter) || + correctAnswer.toLowerCase().includes(optionLetter.toLowerCase()) + ); + } + return false; +}; + +export default Quiz; diff --git a/move202503/AKAKing23/code/chain_front/src/pages/Rank.tsx b/move202503/AKAKing23/code/chain_front/src/pages/Rank.tsx new file mode 100644 index 00000000..ab631954 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/pages/Rank.tsx @@ -0,0 +1,398 @@ +import React, { useState, useEffect } from "react"; +import { useSearchParams } from "react-router-dom"; +import { + useCurrentAccount, + useSuiClient, + useSignAndExecuteTransaction, + useSignPersonalMessage, +} from "@mysten/dapp-kit"; +import { + SealClient, + getAllowlistedKeyServers, + SessionKey, + EncryptedObject, +} from "@mysten/seal"; +import { Button } from "@/components/ui/button"; +import { Loader2 } from "lucide-react"; +import "../styles/Rank.css"; +import { createQueryBlobsTransaction } from "@/api/walrus"; +import { TESTNET_COUNTER_PACKAGE_ID } from "@/utils/constants"; +import { Transaction } from "@mysten/sui/transactions"; +import { fromHex } from "@mysten/sui/utils"; +interface QuizQuestion { + id?: number; + question: string; + options: string[]; + explanation?: string; +} + +interface EncryptedQuizData { + questions: QuizQuestion[]; + difficulty: string; + timestamp: number; + creator: string; +} + +const Rank: React.FC = () => { + const [searchParams] = useSearchParams(); + const difficulty = searchParams.get("difficulty") || "primary"; + const suiClient = useSuiClient(); + const currentAccount = useCurrentAccount(); + const { mutate: signAndExecuteTransaction } = useSignAndExecuteTransaction(); + const { mutate: signPersonalMessage } = useSignPersonalMessage(); + + const [loading, setLoading] = useState(true); + const [decrypting, setDecrypting] = useState(false); + const [quizData, setQuizData] = useState(null); + const [walrusBlobId, setWalrusBlobId] = useState(""); + const [suiWalrusUrl, setSuiWalrusUrl] = useState(""); + const [error, setError] = useState(null); + + // 创建Seal客户端,使用类型断言处理版本兼容性问题 + // @ts-expect-error - 处理SuiClient版本兼容性问题 + const sealClient = new SealClient({ + suiClient, + serverObjectIds: getAllowlistedKeyServers("testnet"), + verifyKeyServers: false, + }); + + // 从链上查询指定难度的题目Blob列表 + const fetchQuizBlobsByDifficulty = async () => { + if (!currentAccount) return; + setError(null); + setLoading(true); + try { + // 创建查询交易 + const tx = createQueryBlobsTransaction( + difficulty, + TESTNET_COUNTER_PACKAGE_ID + ); + console.log(tx); + // 使用signAndExecuteTransaction钩子代替直接调用suiClient + signAndExecuteTransaction( + { transaction: tx as any }, // 使用类型断言解决类型兼容性问题 + { + onSuccess: (result) => { + console.log("查询交易执行成功:", result); + // 从交易结果中提取事件 + // @ts-expect-error - 处理返回值结构不兼容问题 + const events = result.events || []; + // 查找BlobPublished事件 + const blobEvents = events.filter( + (event: any) => + event.type?.includes("BlobPublished") && + event.parsedJson?.difficulty === difficulty + ); + if (blobEvents.length > 0) { + // 获取最近的一个事件 + const latestEvent = blobEvents[blobEvents.length - 1]; + const blobId = latestEvent.parsedJson?.blob_id; + const eventTx = latestEvent.id?.txDigest; + if (blobId) { + // 存储到localStorage + const encryptedKey = `encrypted_${difficulty}_${currentAccount.address}`; + localStorage.setItem(encryptedKey, blobId); + // 构建Sui对象URL + const suiUrl = `https://suiscan.xyz/testnet/object/${eventTx}`; + const encryptedSuiUrl = `encryptedSuiUrl_${difficulty}_${currentAccount.address}`; + localStorage.setItem(encryptedSuiUrl, suiUrl); + // 更新状态 + setWalrusBlobId(blobId); + setSuiWalrusUrl(suiUrl); + setError(null); + } else { + setError("无法从事件中提取blobId"); + } + } else { + setError(`未找到${difficulty}难度的题目数据,请确认已完成答题`); + } + setLoading(false); + }, + onError: (error) => { + console.error("查询题目Blob失败:", error); + setError( + `查询链上数据失败: ${ + error instanceof Error ? error.message : String(error) + }` + ); + setLoading(false); + }, + } + ); + } catch (err) { + console.error("创建查询交易失败:", err); + setError( + `创建查询交易失败: ${err instanceof Error ? err.message : String(err)}` + ); + setLoading(false); + } + }; + + useEffect(() => { + // 从localStorage获取已存储的加密题目信息 + const fetchEncryptedQuizInfo = async () => { + setLoading(true); + setTimeout(async () => { + if (!currentAccount) { + setLoading(false); + return; + } + + const aggregators = [ + "aggregator1", + "aggregator2", + "aggregator3", + "aggregator4", + "aggregator5", + "aggregator6", + ]; + const encryptedKey = `encrypted_${difficulty}_${currentAccount.address}`; + console.log(encryptedKey, "encryptedKey--"); + + const storedBlobId = localStorage.getItem(encryptedKey); + if (!storedBlobId) { + setLoading(false); + return; + } + + try { + // 设置blobId和URL + setWalrusBlobId(storedBlobId); + const storedSuiUrl = localStorage.getItem( + `encryptedSuiUrl_${difficulty}_${currentAccount.address}` + ); + if (storedSuiUrl) { + setSuiWalrusUrl(storedSuiUrl); + } + + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), 10000); + const randomAggregator = + aggregators[Math.floor(Math.random() * aggregators.length)]; + const aggregatorUrl = `/${randomAggregator}/v1/blobs/${storedBlobId}`; + const response = await fetch(aggregatorUrl, { + signal: controller.signal, + }); + clearTimeout(timeout); + if (!response.ok) { + setLoading(false); + return; + } + const encryptedData = await response.arrayBuffer(); + console.log(encryptedData, "encryptedData---"); + const ids = EncryptedObject.parse(new Uint8Array(encryptedData)).id; + console.log(ids, "ids---"); + + + // 生成交易字节 + const tx = new Transaction(); + tx.moveCall({ + target: `${TESTNET_COUNTER_PACKAGE_ID}::allowlist::seal_approve`, + arguments: [ + // 使用与加密时相同的策略ID,确保与Quiz.tsx中使用的policyObject一致 + // 从localStorage获取用户地址并转换为字节数组 + // tx.pure.vector( + // "u8", + // Array.from(new TextEncoder().encode(currentAccount.address)) + // ), + + // // 从本地存储获取白名单对象ID,如果不存在则使用默认值 + // tx.object(localStorage.getItem("allowlist_object_id") || "0x0"), + // tx.pure.address(currentAccount.address), + + tx.pure.vector('u8', fromHex(ids)), + tx.object(localStorage.getItem("allowlist_object_id") || "0x0"), + tx.pure.address(currentAccount.address), + + ], + }); + + // 添加明确的Gas预算 + tx.setGasBudget(10000000); + + // type MoveCallConstructor = (tx: Transaction, id: string) => void; + const txBytes = await tx.build({ + client: suiClient, + onlyTransactionKind: true, + }); + + // 创建会话密钥 + const sessionKey = new SessionKey({ + address: currentAccount.address as string, + packageId: TESTNET_COUNTER_PACKAGE_ID, + ttlMin: 10, + }); + + // 获取个人消息签名 + const signatureResult = await new Promise((resolve) => { + signPersonalMessage( + { + message: sessionKey.getPersonalMessage(), + }, + { + onSuccess: (result) => { + console.log("签名成功:", result); + resolve(result); + }, + onError: (error) => { + console.error("签名失败:", error); + resolve(null); + }, + } + ); + }); + + // 如果获取签名失败,则返回 + if (!signatureResult) { + console.error("无法获取个人消息签名"); + setLoading(false); + return; + } + + // 使用签名更新会话密钥 + sessionKey.setPersonalMessageSignature( + (signatureResult as any).signature + ); + + // 解密数据 + try { + const decryptedResult = await sealClient.decrypt({ + data: new Uint8Array(encryptedData), + sessionKey, + txBytes, + }); + console.log(decryptedResult, "decryptedResult"); + + // 转换为文本并解析 + const textDecoder = new TextDecoder(); + // @ts-expect-error - 处理数据格式兼容性问题 + const jsonString = textDecoder.decode(decryptedResult); + console.log(jsonString, "jsonString---"); + + // 尝试解析JSON + try { + const jsonData = JSON.parse(jsonString); + console.log(jsonData, "成功解析JSON数据"); + // 设置解密后的数据 + setQuizData(jsonData); + } catch (jsonError) { + console.error( + "JSON解析失败:", + jsonError, + "原始字符串:", + jsonString + ); + setError("解析JSON数据失败"); + } + } catch (decryptError) { + console.error("解密失败:", decryptError); + setError( + `解密失败: ${ + decryptError instanceof Error + ? decryptError.message + : String(decryptError) + }` + ); + } + } catch (err) { + console.error( + `Blob ${storedBlobId} cannot be retrieved from Walrus`, + err + ); + setError( + `无法从Walrus获取Blob数据: ${ + err instanceof Error ? err.message : String(err) + }` + ); + } finally { + setLoading(false); + } + }, 1500); + }; + + fetchEncryptedQuizInfo(); + }, [currentAccount, difficulty, suiClient]); + + if (loading) { + return ( +
+ +

正在获取{difficulty}难度加密题目信息...

+
+ ); + } + + return ( +
+

{difficulty}难度题目排行榜

+ + {error &&
{error}
} + + + + {walrusBlobId && ( +
+

已找到加密题目信息

+

BlobId: {walrusBlobId}

+

难度级别: {difficulty}

+ + {suiWalrusUrl && ( + + 查看Sui对象 + + )} +
+ )} + + {quizData && ( +
+

成功解密题目数据

+

创建者: {quizData.creator}

+

题目难度: {quizData.difficulty}

+

创建时间: {new Date(quizData.timestamp).toLocaleString()}

+

题目数量: {quizData.questions.length}

+ +
+

题目列表

+ {quizData.questions.map((question, index) => ( +
+

+ 题目 {index + 1}: {question.question} +

+
    + {question.options.map((option, optIndex) => ( +
  • {option}
  • + ))} +
+ {question.explanation && ( +

解析: {question.explanation}

+ )} +
+ ))} +
+
+ )} +
+ ); +}; + +export default Rank; diff --git a/move202503/AKAKing23/code/chain_front/src/pages/Wallet.tsx b/move202503/AKAKing23/code/chain_front/src/pages/Wallet.tsx new file mode 100644 index 00000000..685be557 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/pages/Wallet.tsx @@ -0,0 +1,54 @@ +import React from 'react'; +import { + ConnectButton, + useCurrentAccount, + useSuiClientQuery +} from '@mysten/dapp-kit'; +import { formatAddress } from '@mysten/sui/utils'; + +const Wallet: React.FC = () => { + const currentAccount = useCurrentAccount(); + + // 获取钱包余额 + const { data: balance, isPending } = useSuiClientQuery( + 'getBalance', + { + owner: currentAccount?.address || '', + }, + { + enabled: !!currentAccount, + } + ); + + return ( +
+

我的钱包

+ +
+

钱包连接

+ +
+ + {currentAccount ? ( +
+

钱包信息

+

地址: {formatAddress(currentAccount.address)}

+

余额: {isPending ? '加载中...' : `${balance?.totalBalance || 0} SUI`}

+
+ ) : ( +
+

请连接您的钱包以查看详细信息

+
+ )} + +
+

使用说明

+

1. 点击"连接钱包"按钮连接您的Sui钱包

+

2. 连接成功后,将显示您的钱包地址和SUI余额

+

3. 您可以在Sui钱包中查看更多详细信息和执行交易

+
+
+ ); +}; + +export default Wallet; \ No newline at end of file diff --git a/move202503/AKAKing23/code/chain_front/src/pages/ZkProof.tsx b/move202503/AKAKing23/code/chain_front/src/pages/ZkProof.tsx new file mode 100644 index 00000000..0f64c593 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/pages/ZkProof.tsx @@ -0,0 +1,622 @@ +// @ts-nocheck +import { useState, useEffect } from "react"; +import { + useCurrentAccount, + useSignAndExecuteTransaction, + useSuiClient, +} from "@mysten/dapp-kit"; +import { + generateAbilityProof, + getVerifierId, + getVerificationKey, +} from "../utils/zkProof"; +import { + createVerifyZkProofParams, + createAddVerificationKeyParams, +} from "../api/sui"; +import { Loader2 } from "lucide-react"; +import { + // TESTNET_ZK_VERIFIER_ID, + TESTNET_COUNTER_PACKAGE_ID, +} from "@/utils/constants"; + +// 样式定义 +const styles = { + container: { + maxWidth: "850px", + margin: "0 auto", + padding: "2rem", + borderRadius: "12px", + backgroundColor: "rgba(0, 0, 0, 0.8)", + backdropFilter: "blur(10px)", + boxShadow: "0 8px 32px rgba(0, 0, 0, 0.3)", + color: "#fff", + position: "relative" as const, + zIndex: 999, + }, + title: { + fontSize: "2rem", + marginBottom: "1.5rem", + color: "#fff", + textAlign: "center" as const, + }, + section: { + marginBottom: "2rem", + }, + sectionTitle: { + fontSize: "1.5rem", + marginBottom: "1rem", + color: "#f0f0f0", + }, + description: { + lineHeight: "1.6", + marginBottom: "1.5rem", + color: "#ddd", + }, + inputGroup: { + marginBottom: "1rem", + }, + label: { + display: "block", + marginBottom: "0.5rem", + color: "#eee", + }, + select: { + padding: "0.75rem", + borderRadius: "8px", + width: "100%", + backgroundColor: "rgba(255, 255, 255, 0.1)", + border: "1px solid rgba(255, 255, 255, 0.2)", + color: "#fff", + marginBottom: "1rem", + }, + button: { + padding: "0.75rem 1.5rem", + borderRadius: "8px", + backgroundColor: "#3b82f6", + color: "#fff", + border: "none", + cursor: "pointer", + fontWeight: "bold", + transition: "background-color 0.2s", + }, + verifyButton: { + backgroundColor: "#10b981", + }, + card: { + padding: "1.5rem", + borderRadius: "8px", + backgroundColor: "rgba(0, 0, 0, 0.2)", + marginBottom: "1.5rem", + }, + infoText: { + color: "#bbb", + fontSize: "0.9rem", + marginBottom: "0.5rem", + }, + proofContainer: { + backgroundColor: "rgba(0, 0, 0, 0.3)", + padding: "1rem", + borderRadius: "6px", + overflowX: "auto" as const, + maxHeight: "200px", + fontSize: "0.8rem", + }, + statusSuccess: { + color: "#10b981", + fontWeight: "bold", + }, + statusPending: { + color: "#f59e0b", + fontWeight: "bold", + }, + table: { + width: "100%", + borderCollapse: "collapse" as const, + backgroundColor: "rgba(0, 0, 0, 0.3)", + borderRadius: "6px", + }, + tableHeader: { + padding: "0.75rem", + textAlign: "left" as const, + borderBottom: "1px solid rgba(255, 255, 255, 0.1)", + color: "#fff", + }, + tableCell: { + padding: "0.75rem", + borderBottom: "1px solid rgba(255, 255, 255, 0.1)", + color: "#ddd", + }, +}; + +// 验证记录类型定义 +interface VerificationRecord { + user: string; + circuitName: string; + isVerified: boolean; + requiredLevel: number; + timestamp: string; + transactionDigest: string; +} + +const ZkProof: React.FC = () => { + const currentAccount = useCurrentAccount(); + const { mutate: signAndExecute } = useSignAndExecuteTransaction(); + const suiClient = useSuiClient(); + const [userSbtLevel, setUserSbtLevel] = useState(1); // 默认为中级 + const [requiredLevel, setRequiredLevel] = useState(1); + const [isGenerating, setIsGenerating] = useState(false); + const [isVerifying, setIsVerifying] = useState(false); + const [isAddingKey, setIsAddingKey] = useState(false); + const [proof, setProof] = useState(""); + const [publicInputs, setPublicInputs] = useState(""); + const [verificationResult, setVerificationResult] = useState( + null + ); + const [showAdminPanel, setShowAdminPanel] = useState(false); + const [verificationRecords, setVerificationRecords] = useState< + VerificationRecord[] + >([]); + const [isLoadingRecords, setIsLoadingRecords] = useState(false); + const [sbtId, setSbtId] = useState(BigInt("0")); // 初始化为0 + const [isLoadingSbt, setIsLoadingSbt] = useState(false); + + // 获取用户拥有的SBT + const fetchUserSbt = async () => { + if (!currentAccount || !suiClient) return; + + setIsLoadingSbt(true); + try { + // 查询用户拥有的对象,筛选出SBT类型的对象 + const ownedObjects = await suiClient.getOwnedObjects({ + owner: currentAccount.address, + filter: { + StructType: `${TESTNET_COUNTER_PACKAGE_ID}::sbt::SoulboundToken`, + }, + options: { + showContent: true, + showType: true, + }, + }); + + if (ownedObjects.data && ownedObjects.data.length > 0) { + // 获取第一个SBT对象的ID + const userSbtId = ownedObjects.data[0].data?.objectId; + if (userSbtId) { + console.log("获取到用户SBT ID:", userSbtId); + // 将对象ID转换为BigInt(移除0x前缀并转为十进制BigInt) + const sbtIdBigInt = BigInt(parseInt(userSbtId.replace("0x", ""), 16)); + setSbtId(sbtIdBigInt); + return; + } + } + + console.log("用户没有SBT,使用模拟ID"); + // 如果没有找到SBT,使用模拟ID + setSbtId(BigInt("123456789")); + } catch (error) { + console.error("获取用户SBT失败:", error); + // 出错时使用模拟ID + setSbtId(BigInt("123456789")); + } finally { + setIsLoadingSbt(false); + } + }; + + // 组件挂载时获取用户SBT + useEffect(() => { + if (currentAccount) { + fetchUserSbt(); + } + }, [currentAccount]); + + // 模拟从验证者获取挑战值 + const getChallenge = () => { + return BigInt(Math.floor(Math.random() * 1000000000)); + }; + + // 获取验证记录 + const fetchVerificationRecords = async () => { + if (!suiClient) return; + + setIsLoadingRecords(true); + try { + // 查询VerificationResult事件 + const events = await suiClient.queryEvents({ + query: { + MoveEventType: `${TESTNET_COUNTER_PACKAGE_ID}::zk_verifier::VerificationResult`, + }, + limit: 50, // 获取最近的50条记录 + }); + + // 处理事件数据 + const records: VerificationRecord[] = events.data.map((event) => { + const fields = event.parsedJson as { + user: string; + circuit_name: string; + is_verified: boolean; + required_level: number; + }; + + return { + user: fields.user, + circuitName: fields.circuit_name, + isVerified: fields.is_verified, + requiredLevel: fields.required_level, + timestamp: new Date(Number(event.timestampMs)).toLocaleString(), + transactionDigest: event.id.txDigest, + }; + }); + // records.splice(0, 2); + setVerificationRecords(records); + } catch (error) { + console.error("获取验证记录失败:", error); + alert("获取验证记录失败: " + (error as Error).message); + } finally { + setIsLoadingRecords(false); + } + }; + + // 当管理员面板显示时获取验证记录 + useEffect(() => { + if (showAdminPanel) { + fetchVerificationRecords(); + } + }, [showAdminPanel]); + + const handleGenerateProof = async () => { + if (!currentAccount) { + alert(`请先连接钱包!`); + return; + } + + setIsGenerating(true); + try { + const challenge = getChallenge(); + const result = await generateAbilityProof( + userSbtLevel, + sbtId, // 使用从链上查询到的实际SBT ID + requiredLevel, + challenge + ); + console.log(result, "result---"); + setProof(result.proof); + setPublicInputs(result.publicInputs); + setTimeout(() => { + alert(`零知识证明生成成功!`); + setIsGenerating(false); + }, 3000); + } catch (error) { + console.error("生成证明失败:", error); + alert("生成证明失败: " + (error as Error).message); + setIsGenerating(false); + } finally { + // setIsGenerating(false); + } + console.log(isGenerating, "isGenerating---"); + }; + + const handleVerifyProof = async () => { + if (!proof || !publicInputs || !currentAccount) { + alert(`请先生成证明或连接钱包!`); + return; + } + + setIsVerifying(true); + + try { + // 获取验证器对象ID + const verifierId = await getVerifierId(); + // const circuitName = "ability" + new Date(); // 电路名称 后续可改为企业/社区名称 + const circuitName = "MoveAbilityTest"; // 电路名称 后续可改为企业/社区名称 + + // 创建并执行交易 + const txParams = createVerifyZkProofParams( + verifierId, + circuitName, + proof, + publicInputs, + requiredLevel + ); + + signAndExecute(txParams, { + onSuccess: (result) => { + console.log("交易成功:", result); + setVerificationResult(true); + alert("证明验证成功!"); + setIsVerifying(false); + // 如果管理员面板打开,刷新验证记录 + if (showAdminPanel) { + fetchVerificationRecords(); + } + }, + onError: (error) => { + console.error("交易失败:", error); + setVerificationResult(false); + alert("证明验证失败: " + error.message); + setIsVerifying(false); + }, + }); + } catch (error) { + console.error("验证证明失败:", error); + alert("验证证明失败: " + (error as Error).message); + setVerificationResult(false); + setIsVerifying(false); + } + }; + + // 处理添加验证密钥 + const handleAddVerificationKey = async () => { + if (!currentAccount) { + alert(`请先连接钱包!`); + return; + } + + setIsAddingKey(true); + + try { + // 获取验证器ID + const verifierId = await getVerifierId(); + // const circuitName = "ability" + new Date().getTime(); // 电路名称 + const circuitName = "MoveAbilityTest"; // 电路名称 + + // 获取验证密钥 + const verificationKey = await getVerificationKey(); + + // 创建添加验证密钥的交易 + const txParams = createAddVerificationKeyParams( + verifierId, + circuitName, + verificationKey + ); + + // 执行交易 + signAndExecute(txParams, { + onSuccess: (result) => { + console.log("添加验证密钥成功:", result); + alert("添加验证密钥成功!"); + setIsAddingKey(false); + }, + onError: (error) => { + console.error("添加验证密钥失败:", error); + alert("添加验证密钥失败: " + error.message); + setIsAddingKey(false); + }, + }); + } catch (error) { + console.error("添加验证密钥失败:", error); + alert("添加验证密钥失败: " + (error as Error).message); + setIsAddingKey(false); + } + }; + + // 格式化地址显示 + const formatAddress = (address: string) => { + return ( + address.substring(0, 6) + "..." + address.substring(address.length - 4) + ); + }; + + return ( +
+

企业、社区认证

+ {/* 管理员面板切换按钮 */} + {currentAccount && ( +
+ +
+ )} + + {/* 管理员面板 */} + {showAdminPanel && ( +
+

管理员面板

+
+
+

+ 管理员功能:查看用户认证记录和添加验证密钥 +

+ +
+ + +

用户认证记录

+ {isLoadingRecords ? ( +
+ +

加载记录中...

+
+ ) : verificationRecords.length > 0 ? ( +
+ + + + + + + + + + + + + {verificationRecords.map((record, index) => ( + + + + + + + + + ))} + +
用户地址电路名称验证结果要求等级时间交易ID
+ {formatAddress(record.user)} + {record.circuitName} + {record.isVerified ? "验证成功" : "验证失败"} + + {record.requiredLevel == 1 + ? "初级" + : record.requiredLevel == 2 + ? "中级" + : "高级"} + {record.timestamp} + + {formatAddress(record.transactionDigest)} + +
+
+ ) : ( +

暂无认证记录

+ )} +
+
+ )} +
+

+ 向企业证明你拥有特定等级的能力凭证,而不必透露你的实际SBT内容或精确分数。 +

+
+ +
+

能力证明

+

+ 选择你的实际SBT等级和你想要证明的能力等级,然后生成零知识证明。 +

+ +
+ {isLoadingSbt ? ( +
+ +

正在加载SBT信息...

+
+ ) : ( + <> +
+ + +
+ +
+ + +
+ + + + )} +
+
+ + {proof && ( +
+

验证证明

+
+

生成的证明(简化显示):

+
+ {proof.substring(0, 100)}... +
+ +

公共输入:

+
{publicInputs}
+ +

+ 验证状态:{" "} + {verificationResult === null ? ( + 等待验证 + ) : verificationResult ? ( + 验证成功 + ) : ( + 验证失败 + )} +

+ + +
+
+ )} +
+ ); +}; + +export default ZkProof; diff --git a/move202503/AKAKing23/code/chain_front/src/router.tsx b/move202503/AKAKing23/code/chain_front/src/router.tsx new file mode 100644 index 00000000..c2559d7c --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/router.tsx @@ -0,0 +1,57 @@ +import { createBrowserRouter } from 'react-router-dom'; +import Layout from './components/Layout'; +import Home from './pages/Home'; +import About from './pages/About'; +import Courses from './pages/Courses'; +import Dashboard from './pages/Dashboard'; +import NotFound from './pages/NotFound'; +import Wallet from './pages/Wallet'; +import Quiz from './pages/Quiz'; +import ZkProof from './pages/ZkProof'; +import Rank from './pages/Rank'; +const router = createBrowserRouter([ + { + path: '/', + element: , + children: [ + { + index: true, + element: + }, + { + path: 'about', + element: + }, + { + path: 'courses', + element: + }, + { + path: 'dashboard', + element: + }, + { + path: 'wallet', + element: + }, + { + path: 'quiz', + element: + }, + { + path: 'zkproof', + element: + }, + { + path: 'rank', + element: + }, + { + path: '*', + element: + } + ] + } +]); + +export default router; \ No newline at end of file diff --git a/move202503/AKAKing23/code/chain_front/src/styles/Quiz.css b/move202503/AKAKing23/code/chain_front/src/styles/Quiz.css new file mode 100644 index 00000000..a8910f06 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/styles/Quiz.css @@ -0,0 +1,352 @@ +/* 问答页面的主容器 */ +.quiz-container { + max-width: 800px; + margin: 0 auto; + padding: 2rem; + background-color: #ffffff; + border-radius: 12px; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12); + animation: fadeIn 0.5s ease-in-out; + position: relative; + z-index: 999; +} + +/* 加载动画容器 */ +.quiz-loading { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 70vh; + text-align: center; +} + +/* 加载旋转动画 */ +.loading-spinner { + width: 80px; + height: 80px; + border: 8px solid rgba(0, 0, 0, 0.1); + border-radius: 50%; + border-top-color: #3498db; + animation: spin 1s linear infinite, pulse 2s ease-in-out infinite; + margin-bottom: 2rem; +} + +/* 加载文字动画 */ +.loading-text { + font-size: 1.8rem; + color: #333; + animation: bounce 2s ease infinite; +} + +/* 进度条 */ +.quiz-progress { + height: 8px; + background-color: #f0f0f0; + border-radius: 4px; + margin-bottom: 2rem; + overflow: hidden; +} + +.progress-bar { + height: 100%; + background: linear-gradient(90deg, #3498db, #2ecc71); + border-radius: 4px; + transition: width 0.3s ease; +} + +/* 问题标题样式 */ +.quiz-header { + margin-bottom: 2rem; + text-align: center; +} + +.quiz-header h2 { + color: #2c3e50; + margin-bottom: 0.5rem; +} + +.quiz-question h3 { + font-size: 1.5rem; + margin-bottom: 1.5rem; + color: #34495e; +} + +/* 选项样式 */ +.quiz-options { + display: flex; + flex-direction: column; + gap: 1rem; + margin-bottom: 2rem; +} + +.quiz-option { + display: flex; + align-items: center; + padding: 1rem; + border: 2px solid #e0e0e0; + border-radius: 8px; + cursor: pointer; + transition: all 0.2s ease; +} + +.quiz-option:hover { + border-color: #3498db; + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(52, 152, 219, 0.15); +} + +.quiz-option.selected { + border-color: #3498db; + background-color: rgba(52, 152, 219, 0.1); +} + +.quiz-option.correct { + border-color: #2ecc71; + background-color: rgba(46, 204, 113, 0.1); +} + +.quiz-option.incorrect { + border-color: #e74c3c; + background-color: rgba(231, 76, 60, 0.1); +} + +.option-letter { + display: flex; + align-items: center; + justify-content: center; + width: 36px; + height: 36px; + background-color: #f5f5f5; + border-radius: 50%; + margin-right: 1rem; + font-weight: bold; + color: #555; +} + +.option-text { + flex: 1; +} + +/* 按钮样式 */ +.quiz-actions { + display: flex; + justify-content: center; + gap: 1rem; +} + +.quiz-actions button { + background-color: #3498db; + color: white; + border: none; + padding: 0.75rem 1.5rem; + border-radius: 6px; + font-size: 1rem; + cursor: pointer; + transition: all 0.2s ease; +} + +.quiz-actions button:hover { + background-color: #2980b9; + transform: translateY(-2px); +} + +/* 完成页面样式 */ +.quiz-completed { + max-width: 600px; + margin: 3rem auto; + padding: 2rem; + background-color: #ffffff; + border-radius: 12px; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12); + text-align: center; + animation: fadeIn 0.5s ease-in-out; +} + +.quiz-completed h2 { + color: #2c3e50; + margin-bottom: 1rem; +} + +.quiz-completed p { + font-size: 1.5rem; + margin-bottom: 2rem; + color: #34495e; +} + +.home-link { + display: inline-block; + background-color: #f5f5f5; + color: #333; + padding: 0.75rem 1.5rem; + border-radius: 6px; + text-decoration: none; + transition: all 0.2s ease; +} + +.home-link:hover { + background-color: #e0e0e0; +} + +/* 动画效果 */ +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +/* 答案解析样式 */ +.answer-explanation { + margin-top: 20px; + margin-bottom: 20px; + padding: 15px; + border-radius: 8px; + background-color: #f8f9fa; + border-left: 4px solid #4caf50; +} + +.answer-explanation p { + margin: 8px 0; +} + +.correct-answer { + font-weight: bold; + color: #4caf50; + font-size: 1.1em; + margin-bottom: 10px; +} + +.explanation-text { + margin: 20px 0; + color: #666; +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} + +@keyframes pulse { + 0% { + transform: scale(1); + } + 50% { + transform: scale(1.1); + } + 100% { + transform: scale(1); + } +} + +@keyframes bounce { + 0%, + 20%, + 50%, + 80%, + 100% { + transform: translateY(0); + } + 40% { + transform: translateY(-10px); + } + 60% { + transform: translateY(-5px); + } +} + +/* 响应式设计 */ +@media (max-width: 768px) { + .quiz-container { + padding: 1.5rem; + margin: 1rem; + } + + .quiz-option { + padding: 0.75rem; + } + + .loading-spinner { + width: 60px; + height: 60px; + border-width: 6px; + } + + .loading-text { + font-size: 1.5rem; + } +} +.token-balance { + display: flex; + align-items: center; + padding: 10px; + justify-content: end; +} +.reflesh-button { + background: #000; + color: #fff; + margin-left: 10px; + font-size: 12px; +} + +/* 成就部分样式 */ +.achievement-section { + background: linear-gradient(to right, #f6f7f9, #e9f7fe); + border-radius: 10px; + padding: 20px; + margin: 20px 0 30px; + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.05); + border: 1px solid #e0e7ff; + animation: glow 2s infinite alternate; +} + +.achievement-section h3 { + color: #3a539b; + margin-bottom: 15px; + font-size: 1.4rem; +} + +.achievement-text { + color: #4a6fa5; + font-size: 1.1rem; + margin: 10px 0; +} + +.mint-sbt-button { + background: linear-gradient(135deg, #3498db, #1d6fa5); + color: white; + border: none; + padding: 12px 24px; + border-radius: 30px; + font-size: 1rem; + font-weight: bold; + cursor: pointer; + transition: all 0.3s ease; + margin: 15px auto; + display: inline-block; + box-shadow: 0 4px 10px rgba(52, 152, 219, 0.3); +} + +.mint-sbt-button:hover { + transform: translateY(-3px); + box-shadow: 0 7px 15px rgba(52, 152, 219, 0.4); + background: linear-gradient(135deg, #2980b9, #164866); +} + +.mint-sbt-button:active { + transform: translateY(1px); +} + +@keyframes glow { + from { + box-shadow: 0 0 5px rgba(66, 139, 202, 0.2); + } + to { + box-shadow: 0 0 15px rgba(66, 139, 202, 0.5); + } +} diff --git a/move202503/AKAKing23/code/chain_front/src/styles/Rank.css b/move202503/AKAKing23/code/chain_front/src/styles/Rank.css new file mode 100644 index 00000000..0dbe27f7 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/styles/Rank.css @@ -0,0 +1,126 @@ +.rank-container { + max-width: 1000px; + margin: 0 auto; + padding: 20px; + background-color: #f7f9fc; + border-radius: 8px; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); +} + +.rank-title { + text-align: center; + margin-bottom: 20px; + color: #2e3a59; + font-size: 24px; +} + +.rank-loading { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + min-height: 300px; + gap: 16px; +} + +.rank-error { + background-color: #ffecef; + color: #e53e3e; + padding: 12px 16px; + border-radius: 4px; + margin-bottom: 20px; + border-left: 4px solid #e53e3e; +} + +.encrypted-info { + background-color: #edf6ff; + padding: 16px; + border-radius: 6px; + margin-bottom: 20px; + border: 1px solid #cce5ff; +} + +.encrypted-info h2 { + margin-top: 0; + font-size: 18px; + color: #2c5282; +} + +.sui-link { + display: inline-block; + margin-top: 10px; + color: #3182ce; + text-decoration: underline; +} + +.decrypt-button { + margin-top: 16px; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + gap: 8px; +} + +.quiz-data { + background-color: white; + padding: 20px; + border-radius: 6px; + border: 1px solid #e2e8f0; + margin-top: 20px; +} + +.quiz-data h2 { + margin-top: 0; + font-size: 20px; + color: #2d3748; + border-bottom: 1px solid #e2e8f0; + padding-bottom: 10px; +} + +.questions-list { + margin-top: 20px; +} + +.questions-list h3 { + font-size: 18px; + color: #2d3748; + margin-bottom: 16px; +} + +.question-item { + background-color: #f8fafc; + padding: 16px; + border-radius: 6px; + margin-bottom: 16px; + border: 1px solid #e2e8f0; +} + +.question-item h4 { + margin-top: 0; + margin-bottom: 12px; + font-size: 16px; + color: #1a365d; +} + +.options-list { + list-style-type: none; + padding-left: 0; + margin-bottom: 16px; +} + +.options-list li { + padding: 8px 12px; + background-color: #f1f5f9; + border-radius: 4px; + margin-bottom: 8px; +} + +.explanation { + background-color: #f0fff4; + padding: 12px; + border-radius: 4px; + border-left: 4px solid #48bb78; + margin-top: 16px; + font-style: italic; +} \ No newline at end of file diff --git a/move202503/AKAKing23/code/chain_front/src/styles/layout.css b/move202503/AKAKing23/code/chain_front/src/styles/layout.css new file mode 100644 index 00000000..dca6e672 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/styles/layout.css @@ -0,0 +1,293 @@ +/* 整体应用容器 */ +.app-container { + display: flex; + flex-direction: column; + min-height: 100vh; + width: 100%; + font-family: Krub, sans-serif; +} + +/* 头部导航 */ +.app-header { + /* background-color: #ffffff; */ + background-color: transparent; + padding: 1rem 2rem; + display: flex; + justify-content: space-between; + align-items: center; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + z-index: 999; +} + +.logo a { + font-size: 1.5rem; + font-weight: bold; + color: #646cff; + text-decoration: none; +} + +.main-nav ul { + display: flex; + list-style: none; + gap: 2rem; + margin: 0; + padding: 0; +} +.main-nav button { + background: linear-gradient(90deg, #4361ee, #3a0ca3, #e98bb5); + color: #fff !important; +} +.main-nav div { + color: #fff !important; +} + +.main-nav a { + color: #fff; + text-decoration: none; + padding: 0.5rem 0; + transition: color 0.3s; +} + +.main-nav a:hover { + color: #646cff; +} + +/* 主内容区域 */ +.app-main { + flex: 1; + padding: 2rem; + max-width: 1200px; + width: 100%; + margin: 0 auto; +} + +/* 页脚 */ +.app-footer { + background-color: #1a1a1a; + color: #888; + padding: 1rem 2rem; + text-align: center; +} + +/* 页面组件通用样式 */ +.home-page, +.about-page, +.courses-page, +.dashboard-page, +.not-found-page { + margin-bottom: 2rem; +} + +h1 { + margin-bottom: 1.5rem; + color: #213547; +} + +.navigation-links, +.back-link { + margin-top: 2rem; +} + +.navigation-links { + display: flex; + gap: 1rem; +} + +.nav-link, +.home-link, +.course-link { + display: inline-block; + padding: 0.5rem 1rem; + background-color: #646cff; + color: white; + text-decoration: none; + border-radius: 4px; + transition: background-color 0.3s; +} + +.nav-link:hover, +.home-link:hover, +.course-link:hover { + background-color: #535bf2; +} + +/* 课程列表样式 */ +.courses-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); + gap: 1.5rem; +} + +.course-card { + border: 1px solid #ddd; + border-radius: 8px; + padding: 1.5rem; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); + transition: transform 0.3s, box-shadow 0.3s; +} + +.course-card:hover { + transform: translateY(-5px); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); +} + +.course-level { + display: inline-block; + margin: 0.5rem 0; + padding: 0.25rem 0.5rem; + background-color: #f0f0f0; + border-radius: 4px; + font-size: 0.875rem; +} + +/* 仪表板样式 */ +.user-info, +.enrolled-courses, +.certificates { + margin-bottom: 2rem; + padding: 1.5rem; + border: 1px solid #ddd; + border-radius: 8px; + background-color: #fff; +} + +.course-item, +.certificate-item { + margin-bottom: 1rem; + padding-bottom: 1rem; + border-bottom: 1px solid #eee; +} + +.progress-bar { + height: 10px; + background-color: #e0e0e0; + border-radius: 5px; + margin: 0.5rem 0; + overflow: hidden; +} + +.progress { + height: 100%; + background-color: #646cff; +} + +/* 媒体查询 - 响应式设计 */ +@media (max-width: 768px) { + .app-header { + /* flex-direction: column; */ + padding: 1rem; + } + + .main-nav ul { + margin-top: 1rem; + gap: 1rem; + } + + .courses-grid { + grid-template-columns: 1fr; + } +} +@keyframes slideUp { + from { + opacity: 0; + transform: translateY(0); /* 从下往上 */ + } + to { + opacity: 1; + transform: translateY(100px); /* 最终位置 */ + } +} +/* 渐变色背景标题 */ +.gradient-bg-title { + margin: 0 auto; + animation: slideUp 1s ease-out forwards; /* 动画效果 */ +} +.gradient-bg-title h2 { + font-size: 3rem; + font-weight: 800; + width: fit-content; + margin-bottom: 1.5rem; + background: linear-gradient(90deg, #4361ee, #3a0ca3, #e98bb5); + -webkit-background-clip: text; + background-clip: text; + color: transparent; + text-align: center; + margin: 0 auto; +} +.gradient-bg-title p { + width: 70%; + text-align: center; + font-size: 1.2rem; + color: #666; + margin: 10px auto; +} +@media (max-width: 768px) { + .gradient-bg-title h2 { + font-size: 2.3rem; + } + .gradient-bg-title p { + width: 75%; + font-size: 1rem; + } +} +.lignt-zk-btn { + position: relative; + display: inline-block; + /* width: 220px; + height: 80px; */ + padding: 14px 22px; + color: rgb(255, 255, 255); + font-size: 1rem; + margin-right: 10px; + font-family: sans-serif; + text-decoration: none; + text-transform: uppercase; + text-align: center; + border-radius: 12px; + background: linear-gradient( + 90deg, + rgb(226, 20, 233), + rgb(39, 122, 218), + rgb(74, 230, 121), + rgb(201, 214, 13), + rgb(16, 172, 219) + ); + background-size: 400%; + z-index: 1; + text-shadow: 0 0 5px white, 0 0 2px white; +} +.lignt-zk-btn:hover { + animation: ligntMove 5s linear alternate infinite; +} + +@keyframes ligntMove { + 0% { + background-position: 0%; + } + 100% { + background-position: 100%; + } +} +.lignt-zk-btn::before { + content: ""; + position: absolute; + top: -10px; + left: -10px; + /* width: 240px; + height: 100px; */ + padding: 16px 24px; + background: linear-gradient( + 90deg, + rgb(226, 20, 233), + rgb(39, 122, 218), + rgb(74, 230, 121), + rgb(243, 169, 10), + rgb(16, 172, 219) + ); + background-size: 400%; + opacity: 0; + z-index: -1; + border-radius: 45px; + transition: 0.6s; +} + diff --git a/move202503/AKAKing23/code/chain_front/src/utils/constants.ts b/move202503/AKAKing23/code/chain_front/src/utils/constants.ts new file mode 100644 index 00000000..7ee08771 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/utils/constants.ts @@ -0,0 +1,10 @@ +export const DEVNET_COUNTER_PACKAGE_ID = "0xTODO"; +export const TESTNET_COUNTER_PACKAGE_ID = "0xca85ff8d356ddaa0cb68696b11b8b7cc77d1c5bda3effd7a54a69dcb2b4b2465"; +export const MAINNET_COUNTER_PACKAGE_ID = "0xTODO"; +// export const TESTNET_QUIZMANAGER_ID = "0x4642beb75afddaea13dcef10905582a0ec8052affbd84d2478ccbd9bb46b5ffe"; +export const TESTNET_QUIZMANAGER_ID = "0x45508866f3c16ca3548df5b835b9a44d42831d50e192c3cbd14f71dd89e46cf4"; +export const TESTNET_REGISTRY_ID = "0xe5f4edc8dbd30db08cdc5593a2473c5afd1282bd21aefa0d4bbb53ff5f647cd0"; + +// SBT发行者凭证ID,需要在部署SBT合约后获取 +export const TESTNET_SBT_ISSUER_CAP_ID = "0x9cd71c070250556e6a76e2987f2b238f99010c0349024d6d7dcfa0cce4afed53"; // +export const TESTNET_ZK_VERIFIER_ID="0x4e1fc9165d974af1aa6bd6f6a66920ca1f9f952d2eae1fa4537707706012ec3c" diff --git a/move202503/AKAKing23/code/chain_front/src/utils/decry.ts b/move202503/AKAKing23/code/chain_front/src/utils/decry.ts new file mode 100644 index 00000000..b7fc007e --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/utils/decry.ts @@ -0,0 +1,120 @@ +import { SealClient, SessionKey, NoAccessError, EncryptedObject } from '@mysten/seal'; +import { SuiClient } from '@mysten/sui/client'; +import { Transaction } from '@mysten/sui/transactions'; +import React from 'react'; + +export type MoveCallConstructor = (tx: Transaction, id: string) => void; + +export const downloadAndDecrypt = async ( + blobIds: string[], + sessionKey: SessionKey, + suiClient: SuiClient, + sealClient: SealClient, + moveCallConstructor: (tx: Transaction, id: string) => void, + setError: (error: string | null) => void, + setDecryptedFileUrls: (urls: string[]) => void, + setIsDialogOpen: (open: boolean) => void, + setReloadKey: (updater: (prev: number) => number) => void, +) => { + const aggregators = ['aggregator1', 'aggregator2', 'aggregator3', 'aggregator4', 'aggregator5', 'aggregator6']; + // First, download all files in parallel (ignore errors) + const downloadResults = await Promise.all( + blobIds.map(async (blobId) => { + try { + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), 10000); + const randomAggregator = aggregators[Math.floor(Math.random() * aggregators.length)]; + const aggregatorUrl = `/${randomAggregator}/v1/blobs/${blobId}`; + const response = await fetch(aggregatorUrl, { signal: controller.signal }); + clearTimeout(timeout); + if (!response.ok) { + return null; + } + return await response.arrayBuffer(); + } catch (err) { + console.error(`Blob ${blobId} cannot be retrieved from Walrus`, err); + return null; + } + }), + ); + + // Filter out failed downloads + const validDownloads = downloadResults.filter((result): result is ArrayBuffer => result !== null); + console.log('validDownloads count', validDownloads.length); + + if (validDownloads.length === 0) { + const errorMsg = + 'Cannot retrieve files from this Walrus aggregator, try again (a randomly selected aggregator will be used). Files uploaded more than 1 epoch ago have been deleted from Walrus.'; + console.error(errorMsg); + setError(errorMsg); + return; + } + + // Fetch keys in batches of <=10 + for (let i = 0; i < validDownloads.length; i += 10) { + const batch = validDownloads.slice(i, i + 10); + const ids = batch.map((enc) => EncryptedObject.parse(new Uint8Array(enc)).id); + const tx = new Transaction(); + ids.forEach((id) => moveCallConstructor(tx, id)); + const txBytes = await tx.build({ client: suiClient, onlyTransactionKind: true }); + try { + await sealClient.fetchKeys({ ids, txBytes, sessionKey, threshold: 2 }); + } catch (err) { + console.log(err); + const errorMsg = + err instanceof NoAccessError + ? 'No access to decryption keys' + : 'Unable to decrypt files, try again'; + console.error(errorMsg, err); + setError(errorMsg); + return; + } + } + + // Then, decrypt files sequentially + const decryptedFileUrls: string[] = []; + for (const encryptedData of validDownloads) { + const fullId = EncryptedObject.parse(new Uint8Array(encryptedData)).id; + const tx = new Transaction(); + moveCallConstructor(tx, fullId); + const txBytes = await tx.build({ client: suiClient, onlyTransactionKind: true }); + try { + // Note that all keys are fetched above, so this only local decryption is done + const decryptedFile = await sealClient.decrypt({ + data: new Uint8Array(encryptedData), + sessionKey, + txBytes, + }); + const blob = new Blob([decryptedFile], { type: 'image/jpg' }); + decryptedFileUrls.push(URL.createObjectURL(blob)); + } catch (err) { + console.log(err); + const errorMsg = + err instanceof NoAccessError + ? 'No access to decryption keys' + : 'Unable to decrypt files, try again'; + console.error(errorMsg, err); + setError(errorMsg); + return; + } + } + + if (decryptedFileUrls.length > 0) { + setDecryptedFileUrls(decryptedFileUrls); + setIsDialogOpen(true); + setReloadKey((prev) => prev + 1); + } +}; + +export const getObjectExplorerLink = (id: string): React.ReactElement => { + return React.createElement( + 'a', + { + href: `https://testnet.suivision.xyz/object/${id}`, + target: '_blank', + rel: 'noopener noreferrer', + style: { textDecoration: 'underline' }, + }, + id.slice(0, 10) + '...', + ); +}; diff --git a/move202503/AKAKing23/code/chain_front/src/utils/networkConfig.ts b/move202503/AKAKing23/code/chain_front/src/utils/networkConfig.ts new file mode 100644 index 00000000..7b6f8b73 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/utils/networkConfig.ts @@ -0,0 +1,31 @@ +import { getFullnodeUrl } from "@mysten/sui/client"; +import { + DEVNET_COUNTER_PACKAGE_ID, + TESTNET_COUNTER_PACKAGE_ID, + MAINNET_COUNTER_PACKAGE_ID, +} from "./constants.ts"; +import { createNetworkConfig } from "@mysten/dapp-kit"; + +const { networkConfig, useNetworkVariable, useNetworkVariables } = + createNetworkConfig({ + devnet: { + url: getFullnodeUrl("devnet"), + variables: { + counterPackageId: DEVNET_COUNTER_PACKAGE_ID, + }, + }, + testnet: { + url: getFullnodeUrl("testnet"), + variables: { + counterPackageId: TESTNET_COUNTER_PACKAGE_ID, + }, + }, + mainnet: { + url: getFullnodeUrl("mainnet"), + variables: { + counterPackageId: MAINNET_COUNTER_PACKAGE_ID, + }, + }, + }); + +export { useNetworkVariable, useNetworkVariables, networkConfig }; diff --git a/move202503/AKAKing23/code/chain_front/src/utils/zkProof.ts b/move202503/AKAKing23/code/chain_front/src/utils/zkProof.ts new file mode 100644 index 00000000..64f86564 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/utils/zkProof.ts @@ -0,0 +1,149 @@ +/** + * 零知识证明生成工具 + * 用于在浏览器环境中生成证明 + */ + +// @ts-expect-error snarkjs没有类型定义 +import { groth16 } from "snarkjs"; +import { TESTNET_ZK_VERIFIER_ID } from "@/utils/constants"; +/** + * 证明结果类型 + */ +export interface ProofResult { + proof: string; + publicInputs: string; + requiredLevel: number; +} + +/** + * 生成能力证明 + * @param {number} userSbtLevel - 用户实际SBT等级 (初级=1, 中级=2, 高级=3) + * @param {bigint} sbtId - 用户SBT的ID + * @param {number} requiredLevel - 要求的最低等级 + * @param {bigint} challenge - 验证者提供的挑战值 + * @returns {Promise} - 包含证明和公共输入的对象 + */ +export async function generateAbilityProof( + userSbtLevel: number, + sbtId: bigint, + requiredLevel: number, + challenge: bigint +): Promise { + try { + // 准备输入 + const input = { + userSbtLevel: userSbtLevel, + sbtId: sbtId.toString(), + requiredLevel: requiredLevel, + challenge: challenge.toString(), + }; + + console.log("Generating proof with inputs:", input); + + // 加载电路的WASM和zkey文件 + // 注意:这些文件路径需要根据实际部署情况调整 + const { proof, publicSignals } = await groth16.fullProve( + input, + "/circuits/ability.wasm", + "/circuits/ability_proof.zkey" + ); + + // 格式化输出 + const formattedProof = JSON.stringify(proof); + const formattedPublicInputs = JSON.stringify(publicSignals); + + console.log( + "Proof generated successfully:", + formattedProof.substring(0, 100) + "..." + ); + + return { + proof: formattedProof, + publicInputs: formattedPublicInputs, + requiredLevel: requiredLevel, + }; + } catch (error: unknown) { + console.error("Error generating proof:", error); + if (error instanceof Error) { + throw new Error( + "Failed to generate zero-knowledge proof: " + error.message + ); + } else { + throw new Error("Failed to generate zero-knowledge proof: Unknown error"); + } + } +} + +/** + * 在浏览器中验证零知识证明(用于本地测试) + * @param {string} proofJson - 证明JSON字符串 + * @param {string} publicInputsJson - 公共输入JSON字符串 + * @param {string} vkJson - 验证密钥JSON字符串 + * @returns {Promise} - 验证结果 + */ +export async function verifyProofLocally( + proofJson: string, + publicInputsJson: string, + vkJson: string +): Promise { + try { + const proof = JSON.parse(proofJson); + const publicInputs = JSON.parse(publicInputsJson); + const vk = JSON.parse(vkJson); + + // 使用snarkjs验证证明 + const isValid = await groth16.verify(vk, publicInputs, proof); + + console.log("Proof verification result:", isValid); + return isValid; + } catch (error: unknown) { + console.error("Error verifying proof locally:", error); + if (error instanceof Error) { + throw new Error("Failed to verify proof: " + error.message); + } else { + throw new Error("Failed to verify proof: Unknown error"); + } + } +} + +/** + * 默认的验证器对象ID + * 实际使用时应该从环境配置或API获取 + */ +export const DEFAULT_VERIFIER_ID = TESTNET_ZK_VERIFIER_ID || ""; + +/** + * 获取验证器对象ID + * 在实际应用中,这个函数应该从链上或API获取验证器对象ID + * @returns {Promise} 验证器对象ID + */ +export async function getVerifierId(): Promise { + // 如果有环境变量,则使用环境变量 + if (DEFAULT_VERIFIER_ID) { + return DEFAULT_VERIFIER_ID; + } + + return ""; +} + +/** + * 获取验证密钥 + * 从公共目录获取验证密钥JSON内容 + * @returns {Promise} 验证密钥JSON字符串 + */ +export async function getVerificationKey(): Promise { + try { + const response = await fetch("/circuits/verification_key.json"); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + return await response.text(); + } catch (error) { + console.error("获取验证密钥失败:", error); + if (error instanceof Error) { + throw new Error("获取验证密钥失败: " + error.message); + } else { + throw new Error("获取验证密钥失败: 未知错误"); + } + } +} diff --git a/move202503/AKAKing23/code/chain_front/src/vite-env.d.ts b/move202503/AKAKing23/code/chain_front/src/vite-env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/move202503/AKAKing23/code/chain_front/tsconfig.app.json b/move202503/AKAKing23/code/chain_front/tsconfig.app.json new file mode 100644 index 00000000..06d4e8f3 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/tsconfig.app.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + }, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/move202503/AKAKing23/code/chain_front/tsconfig.json b/move202503/AKAKing23/code/chain_front/tsconfig.json new file mode 100644 index 00000000..fec8c8e5 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/tsconfig.json @@ -0,0 +1,13 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ], + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/move202503/AKAKing23/code/chain_front/tsconfig.node.json b/move202503/AKAKing23/code/chain_front/tsconfig.node.json new file mode 100644 index 00000000..db0becc8 --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/move202503/AKAKing23/code/chain_front/vite.config.ts b/move202503/AKAKing23/code/chain_front/vite.config.ts new file mode 100644 index 00000000..ba84574c --- /dev/null +++ b/move202503/AKAKing23/code/chain_front/vite.config.ts @@ -0,0 +1,112 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +// import vitePluginsAutoI18n, { BaiduTranslator } from "vite-auto-i18n-plugin"; +import path from "path"; +import tailwindcss from "@tailwindcss/vite"; + +// const i18nPlugin = vitePluginsAutoI18n({ +// globalPath: "./lang", // 存放翻译文件的目录 +// namespace: "lang", // 命名空间 +// distPath: "./dist/assets", +// distKey: "index", +// targetLangList: ["en", "ko", "ja"], // 目标语言列表,英文,韩文,日文 +// originLang: "zh-cn", +// // 选择翻译器,有道、谷歌或百度 +// // 百度翻译 +// translator: new BaiduTranslator({ +// appId: "20250414002332588", +// appKey: "eLXJG_amVDe1YDPSDmm7", +// }), +// }); + +// https://vite.dev/config/ +export default defineConfig({ + // plugins: [react(), i18nPlugin, tailwindcss()], + plugins: [react(), tailwindcss()], + resolve: { + alias: { + "@": path.resolve(__dirname, "./src"), + }, + }, + server: { + proxy: { + "/api": { + target: "http://localhost:3001", // 假设你的后端服务运行在3001端口 + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api/, ""), // 如果后端路径不包含/api前缀则取消注释 + }, + "/aggregator1/v1": { + target: "https://aggregator.walrus-testnet.walrus.space", + changeOrigin: true, + secure: false, + rewrite: (path) => path.replace(/^\/aggregator1/, ""), + }, + "/aggregator2/v1": { + target: "https://wal-aggregator-testnet.staketab.org", + changeOrigin: true, + secure: false, + rewrite: (path) => path.replace(/^\/aggregator2/, ""), + }, + "/aggregator3/v1": { + target: "https://walrus-testnet-aggregator.redundex.com", + changeOrigin: true, + secure: false, + rewrite: (path) => path.replace(/^\/aggregator3/, ""), + }, + "/aggregator4/v1": { + target: "https://walrus-testnet-aggregator.nodes.guru", + changeOrigin: true, + secure: false, + rewrite: (path) => path.replace(/^\/aggregator4/, ""), + }, + "/aggregator5/v1": { + target: "https://aggregator.walrus.banansen.dev", + changeOrigin: true, + secure: false, + rewrite: (path) => path.replace(/^\/aggregator5/, ""), + }, + "/aggregator6/v1": { + target: "https://walrus-testnet-aggregator.everstake.one", + changeOrigin: true, + secure: false, + rewrite: (path) => path.replace(/^\/aggregator6/, ""), + }, + "/publisher1/v1": { + target: "https://publisher.walrus-testnet.walrus.space", + changeOrigin: true, + secure: false, + rewrite: (path) => path.replace(/^\/publisher1/, ""), + }, + "/publisher2/v1": { + target: "https://wal-publisher-testnet.staketab.org", + changeOrigin: true, + secure: false, + rewrite: (path) => path.replace(/^\/publisher2/, ""), + }, + "/publisher3/v1": { + target: "https://walrus-testnet-publisher.redundex.com", + changeOrigin: true, + secure: false, + rewrite: (path) => path.replace(/^\/publisher3/, ""), + }, + "/publisher4/v1": { + target: "https://walrus-testnet-publisher.nodes.guru", + changeOrigin: true, + secure: false, + rewrite: (path) => path.replace(/^\/publisher4/, ""), + }, + "/publisher5/v1": { + target: "https://publisher.walrus.banansen.dev", + changeOrigin: true, + secure: false, + rewrite: (path) => path.replace(/^\/publisher5/, ""), + }, + "/publisher6/v1": { + target: "https://walrus-testnet-publisher.everstake.one", + changeOrigin: true, + secure: false, + rewrite: (path) => path.replace(/^\/publisher6/, ""), + }, + }, + }, +}); diff --git a/move202503/AKAKing23/code/zk_proof_system/.gitignore b/move202503/AKAKing23/code/zk_proof_system/.gitignore new file mode 100644 index 00000000..a547bf36 --- /dev/null +++ b/move202503/AKAKing23/code/zk_proof_system/.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/move202503/AKAKing23/code/zk_proof_system/circuit/ability.circom b/move202503/AKAKing23/code/zk_proof_system/circuit/ability.circom new file mode 100644 index 00000000..7c9bb963 --- /dev/null +++ b/move202503/AKAKing23/code/zk_proof_system/circuit/ability.circom @@ -0,0 +1,48 @@ +pragma circom 2.0.0; + +/* + * 能力证明电路 + * 这个电路允许用户证明他们拥有特定等级的SBT,而不暴露具体的SBT内容 + * 比如,用户可以证明他们的测验分数超过某个门槛,而不需要透露具体分数 + */ + +// 包含标准库 +include "../node_modules/circomlib/circuits/comparators.circom"; +include "../node_modules/circomlib/circuits/gates.circom"; + +// 主电路:证明用户的SBT等级超过特定门槛 +template AbilityProof() { + // 私有输入:实际SBT等级(初级=1, 中级=2, 高级=3) + signal input userSbtLevel; + + // 私有输入:用户拥有的SBT ID (作为随机数使证明不可重用) + signal input sbtId; + + // 公共输入:要求的最低等级 + signal input requiredLevel; + + // 公共输入:验证者提供的挑战值(防止重放攻击) + signal input challenge; + + // 公共输出:是否满足条件 + signal output qualified; + + // 验证用户SBT等级是否大于等于要求等级 + component greaterOrEqual = GreaterEqThan(8); // 8位足够表示SBT等级 + greaterOrEqual.in[0] <== userSbtLevel; + greaterOrEqual.in[1] <== requiredLevel; + + // 验证结果 + qualified <== greaterOrEqual.out; + + // 验证SBT ID与挑战值结合(防止重放攻击) + signal combinedHash; + combinedHash <== sbtId + challenge; + + // 确保combinedHash不为零 + signal nonZero; + nonZero <== combinedHash * combinedHash; +} + +// 主要组件 +component main {public [requiredLevel, challenge]} = AbilityProof(); \ No newline at end of file diff --git a/move202503/AKAKing23/code/zk_proof_system/js/src/generate_proof.js b/move202503/AKAKing23/code/zk_proof_system/js/src/generate_proof.js new file mode 100644 index 00000000..ba1c8098 --- /dev/null +++ b/move202503/AKAKing23/code/zk_proof_system/js/src/generate_proof.js @@ -0,0 +1,75 @@ +/** + * 零知识证明生成工具 + * 用于在浏览器环境中生成证明 + */ + +import { groth16 } from 'snarkjs'; + +/** + * 生成能力证明 + * @param {number} userSbtLevel - 用户实际SBT等级 (初级=1, 中级=2, 高级=3) + * @param {bigint} sbtId - 用户SBT的ID + * @param {number} requiredLevel - 要求的最低等级 + * @param {bigint} challenge - 验证者提供的挑战值 + * @returns {Promise} - 包含证明和公共输入的对象 + */ +export async function generateAbilityProof(userSbtLevel, sbtId, requiredLevel, challenge) { + try { + // 准备输入 + const input = { + userSbtLevel: userSbtLevel, + sbtId: sbtId.toString(), + requiredLevel: requiredLevel, + challenge: challenge.toString() + }; + + console.log('Generating proof with inputs:', input); + + // 加载电路的WASM和zkey文件 + // 注意:这些文件路径需要根据实际部署情况调整 + const { proof, publicSignals } = await groth16.fullProve( + input, + '/circuits/ability_proof.wasm', + '/circuits/ability_proof.zkey' + ); + + // 格式化输出 + const formattedProof = JSON.stringify(proof); + const formattedPublicInputs = JSON.stringify(publicSignals); + + console.log('Proof generated successfully:', formattedProof.substring(0, 100) + '...'); + + return { + proof: formattedProof, + publicInputs: formattedPublicInputs, + requiredLevel: requiredLevel + }; + } catch (error) { + console.error('Error generating proof:', error); + throw new Error('Failed to generate zero-knowledge proof: ' + error.message); + } +} + +/** + * 在浏览器中验证零知识证明(用于本地测试) + * @param {string} proofJson - 证明JSON字符串 + * @param {string} publicInputsJson - 公共输入JSON字符串 + * @param {string} vkJson - 验证密钥JSON字符串 + * @returns {Promise} - 验证结果 + */ +export async function verifyProofLocally(proofJson, publicInputsJson, vkJson) { + try { + const proof = JSON.parse(proofJson); + const publicInputs = JSON.parse(publicInputsJson); + const vk = JSON.parse(vkJson); + + // 使用snarkjs验证证明 + const isValid = await groth16.verify(vk, publicInputs, proof); + + console.log('Proof verification result:', isValid); + return isValid; + } catch (error) { + console.error('Error verifying proof locally:', error); + throw new Error('Failed to verify proof: ' + error.message); + } +} \ No newline at end of file diff --git a/move202503/AKAKing23/code/zk_proof_system/package-lock.json b/move202503/AKAKing23/code/zk_proof_system/package-lock.json new file mode 100644 index 00000000..58d0f077 --- /dev/null +++ b/move202503/AKAKing23/code/zk_proof_system/package-lock.json @@ -0,0 +1,551 @@ +{ + "name": "zk_proof_system", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "circomlib": "^2.0.5", + "snarkjs": "^0.7.5" + } + }, + "node_modules/@iden3/bigarray": { + "version": "0.0.2", + "resolved": "https://registry.npmmirror.com/@iden3/bigarray/-/bigarray-0.0.2.tgz", + "integrity": "sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g==", + "license": "GPL-3.0" + }, + "node_modules/@iden3/binfileutils": { + "version": "0.0.12", + "resolved": "https://registry.npmmirror.com/@iden3/binfileutils/-/binfileutils-0.0.12.tgz", + "integrity": "sha512-naAmzuDufRIcoNfQ1d99d7hGHufLA3wZSibtr4dMe6ZeiOPV1KwOZWTJ1YVz4HbaWlpDuzVU72dS4ATQS4PXBQ==", + "license": "GPL-3.0", + "dependencies": { + "fastfile": "0.0.20", + "ffjavascript": "^0.3.0" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmmirror.com/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmmirror.com/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "license": "Apache-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/bfj": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/bfj/-/bfj-7.1.0.tgz", + "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", + "license": "MIT", + "dependencies": { + "bluebird": "^3.7.2", + "check-types": "^11.2.3", + "hoopy": "^0.1.4", + "jsonpath": "^1.1.1", + "tryer": "^1.0.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/blake2b-wasm": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz", + "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==", + "license": "MIT", + "dependencies": { + "b4a": "^1.0.1", + "nanoassert": "^2.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-types": { + "version": "11.2.3", + "resolved": "https://registry.npmmirror.com/check-types/-/check-types-11.2.3.tgz", + "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==", + "license": "MIT" + }, + "node_modules/circom_runtime": { + "version": "0.1.28", + "resolved": "https://registry.npmmirror.com/circom_runtime/-/circom_runtime-0.1.28.tgz", + "integrity": "sha512-ACagpQ7zBRLKDl5xRZ4KpmYIcZDUjOiNRuxvXLqhnnlLSVY1Dbvh73TI853nqoR0oEbihtWmMSjgc5f+pXf/jQ==", + "license": "Apache-2.0", + "dependencies": { + "ffjavascript": "0.3.1" + }, + "bin": { + "calcwit": "calcwit.js" + } + }, + "node_modules/circomlib": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/circomlib/-/circomlib-2.0.5.tgz", + "integrity": "sha512-O7NQ8OS+J4eshBuoy36z/TwQU0YHw8W3zxZcs4hVwpEll3e4hDm3mgkIPqItN8FDeLEKZFK3YeT/+k8TiLF3/A==", + "license": "GPL-3.0" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmmirror.com/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmmirror.com/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "license": "MIT" + }, + "node_modules/fastfile": { + "version": "0.0.20", + "resolved": "https://registry.npmmirror.com/fastfile/-/fastfile-0.0.20.tgz", + "integrity": "sha512-r5ZDbgImvVWCP0lA/cGNgQcZqR+aYdFx3u+CtJqUE510pBUVGMn4ulL/iRTI4tACTYsNJ736uzFxEBXesPAktA==", + "license": "GPL-3.0" + }, + "node_modules/ffjavascript": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/ffjavascript/-/ffjavascript-0.3.1.tgz", + "integrity": "sha512-4PbK1WYodQtuF47D4pRI5KUg3Q392vuP5WjE1THSnceHdXwU3ijaoS0OqxTzLknCtz4Z2TtABzkBdBdMn3B/Aw==", + "license": "GPL-3.0", + "dependencies": { + "wasmbuilder": "0.0.16", + "wasmcurves": "0.2.2", + "web-worker": "1.2.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmmirror.com/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmmirror.com/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "license": "MIT" + }, + "node_modules/jsonpath": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "license": "MIT", + "dependencies": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/logplease": { + "version": "1.2.15", + "resolved": "https://registry.npmmirror.com/logplease/-/logplease-1.2.15.tgz", + "integrity": "sha512-jLlHnlsPSJjpwUfcNyUxXCl33AYg2cHhIf9QhGL2T4iPT0XPB+xP1LRKFPgIg1M/sg9kAJvy94w9CzBNrfnstA==", + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nanoassert": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/nanoassert/-/nanoassert-2.0.0.tgz", + "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==", + "license": "ISC" + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/r1csfile": { + "version": "0.0.48", + "resolved": "https://registry.npmmirror.com/r1csfile/-/r1csfile-0.0.48.tgz", + "integrity": "sha512-kHRkKUJNaor31l05f2+RFzvcH5XSa7OfEfd/l4hzjte6NL6fjRkSMfZ4BjySW9wmfdwPOtq3mXurzPvPGEf5Tw==", + "license": "GPL-3.0", + "dependencies": { + "@iden3/bigarray": "0.0.2", + "@iden3/binfileutils": "0.0.12", + "fastfile": "0.0.20", + "ffjavascript": "0.3.0" + } + }, + "node_modules/r1csfile/node_modules/ffjavascript": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/ffjavascript/-/ffjavascript-0.3.0.tgz", + "integrity": "sha512-l7sR5kmU3gRwDy8g0Z2tYBXy5ttmafRPFOqY7S6af5cq51JqJWt5eQ/lSR/rs2wQNbDYaYlQr5O+OSUf/oMLoQ==", + "license": "GPL-3.0", + "dependencies": { + "wasmbuilder": "0.0.16", + "wasmcurves": "0.2.2", + "web-worker": "1.2.0" + } + }, + "node_modules/snarkjs": { + "version": "0.7.5", + "resolved": "https://registry.npmmirror.com/snarkjs/-/snarkjs-0.7.5.tgz", + "integrity": "sha512-h+3c4rXZKLhLuHk4LHydZCk/h5GcNvk5GjVKRRkHmfb6Ntf8gHOA9zea3g656iclRuhqQ3iKDWFgiD9ypLrKiA==", + "license": "GPL-3.0", + "dependencies": { + "@iden3/binfileutils": "0.0.12", + "bfj": "^7.0.2", + "blake2b-wasm": "^2.4.0", + "circom_runtime": "0.1.28", + "ejs": "^3.1.6", + "fastfile": "0.0.20", + "ffjavascript": "0.3.1", + "js-sha3": "^0.8.0", + "logplease": "^1.2.15", + "r1csfile": "0.0.48" + }, + "bin": { + "snarkjs": "build/cli.cjs" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "license": "MIT", + "dependencies": { + "escodegen": "^1.8.1" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "license": "MIT" + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmmirror.com/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "license": "MIT" + }, + "node_modules/wasmbuilder": { + "version": "0.0.16", + "resolved": "https://registry.npmmirror.com/wasmbuilder/-/wasmbuilder-0.0.16.tgz", + "integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==", + "license": "GPL-3.0" + }, + "node_modules/wasmcurves": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/wasmcurves/-/wasmcurves-0.2.2.tgz", + "integrity": "sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ==", + "license": "GPL-3.0", + "dependencies": { + "wasmbuilder": "0.0.16" + } + }, + "node_modules/web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==", + "license": "Apache-2.0" + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + } + } +} diff --git a/move202503/AKAKing23/code/zk_proof_system/package.json b/move202503/AKAKing23/code/zk_proof_system/package.json new file mode 100644 index 00000000..97743355 --- /dev/null +++ b/move202503/AKAKing23/code/zk_proof_system/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "circomlib": "^2.0.5", + "snarkjs": "^0.7.5" + } +}