diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..703b577
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,5 @@
+# 支付 API 地址。不填则自动根据 window.location.host 判断:本地用 /api,线上用 https://api.dsx2020.com
+# VITE_PAYMENT_API_URL=/api
+
+# 微信内支付渠道:xorpay | zpay
+VITE_WECHAT_PAY_PROVIDER=xorpay
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9a5aced
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,139 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+lerna-debug.log*
+
+# Diagnostic reports (https://nodejs.org/api/report.html)
+report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+*.lcov
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# Snowpack dependency directory (https://snowpack.dev/)
+web_modules/
+
+# TypeScript cache
+*.tsbuildinfo
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional stylelint cache
+.stylelintcache
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variable files
+.env
+.env.*
+!.env.example
+
+# parcel-bundler cache (https://parceljs.org/)
+.cache
+.parcel-cache
+
+# Next.js build output
+.next
+out
+
+# Nuxt.js build / generate output
+.nuxt
+dist
+
+# Gatsby files
+.cache/
+# Comment in the public line in if your project uses Gatsby and not Next.js
+# https://nextjs.org/blog/next-9-1#public-directory-support
+# public
+
+# vuepress build output
+.vuepress/dist
+
+# vuepress v2.x temp and cache directory
+.temp
+.cache
+
+# Sveltekit cache directory
+.svelte-kit/
+
+# vitepress build output
+**/.vitepress/dist
+
+# vitepress cache directory
+**/.vitepress/cache
+
+# Docusaurus cache and generated files
+.docusaurus
+
+# Serverless directories
+.serverless/
+
+# FuseBox cache
+.fusebox/
+
+# DynamoDB Local files
+.dynamodb/
+
+# Firebase cache directory
+.firebase/
+
+# TernJS port file
+.tern-port
+
+# Stores VSCode versions used for testing VSCode extensions
+.vscode-test
+
+# yarn v3
+.pnp.*
+.yarn/*
+!.yarn/patches
+!.yarn/plugins
+!.yarn/releases
+!.yarn/sdks
+!.yarn/versions
+
+# Vite logs files
+vite.config.js.timestamp-*
+vite.config.ts.timestamp-*
diff --git a/README.md b/README.md
index 1bf38ed..91c72c8 100644
--- a/README.md
+++ b/README.md
@@ -1,92 +1 @@
-# wxH5
-
-
-
-## Getting started
-
-To make it easy for you to get started with GitLab, here's a list of recommended next steps.
-
-Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
-
-## Add your files
-
-- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files
-- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command:
-
-```
-cd existing_repo
-git remote add origin http://gitlab.yidooplanet.com/gitlab-instance-0a899031/wxh5.git
-git branch -M main
-git push -uf origin main
-```
-
-## Integrate with your tools
-
-- [ ] [Set up project integrations](http://gitlab.yidooplanet.com/gitlab-instance-0a899031/wxh5/-/settings/integrations)
-
-## Collaborate with your team
-
-- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/)
-- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
-- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically)
-- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/)
-- [ ] [Automatically merge when pipeline succeeds](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html)
-
-## Test and Deploy
-
-Use the built-in continuous integration in GitLab.
-
-- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html)
-- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing(SAST)](https://docs.gitlab.com/ee/user/application_security/sast/)
-- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html)
-- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/)
-- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html)
-
-***
-
-# Editing this README
-
-When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thank you to [makeareadme.com](https://www.makeareadme.com/) for this template.
-
-## Suggestions for a good README
-Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
-
-## Name
-Choose a self-explaining name for your project.
-
-## Description
-Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
-
-## Badges
-On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
-
-## Visuals
-Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
-
-## Installation
-Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
-
-## Usage
-Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
-
-## Support
-Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
-
-## Roadmap
-If you have ideas for releases in the future, it is a good idea to list them in the README.
-
-## Contributing
-State if you are open to contributions and what your requirements are for accepting them.
-
-For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
-
-You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
-
-## Authors and acknowledgment
-Show your appreciation to those who have contributed to the project.
-
-## License
-For open source projects, say how it is licensed.
-
-## Project status
-If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.
+# mySite
\ No newline at end of file
diff --git a/README_KNOWLEDGE.md b/README_KNOWLEDGE.md
new file mode 100644
index 0000000..fb645e6
--- /dev/null
+++ b/README_KNOWLEDGE.md
@@ -0,0 +1,80 @@
+# 知识付费平台说明
+
+## Markdown 内容结构
+
+内容统一放在 `public/markdown/` 目录,支持**文件引用**和**字符串**两种方式:
+
+```
+public/markdown/
+├── README.md # 说明
+├── course/ # 课程配套文章
+│ ├── 1/1.md, 2.md, 3.md
+│ └── 2/1.md, 2.md
+└── ebook/ # 电子书章节
+ ├── 1/1.md, 2.md, 3.md
+ └── 2/1.md, 2.md
+```
+
+**引用格式**(数据库 `article_markdown` / `content` 字段):
+- `@file:course/1/1` → 加载 `course/1/1.md`
+- `@file:ebook/2/3` → 加载 `ebook/2/3.md`
+- 直接写 Markdown 字符串 → 内联渲染
+
+**配置**:`src/markdown/config.js` 中维护 `MARKDOWN` 映射,新增章节时在此添加。
+
+## 功能概览
+
+- **首页(游客模式)**:无需登录即可浏览电子书专栏和课程专栏
+- **电子书**:支持 Markdown 内容,免费章节可读,VIP 章节需开通
+- **课程**:视频支持本地文件或 CDN 链接,免费试看 + VIP 全看
+- **VIP**:月卡/年卡/终身卡,开通后可解锁全部内容
+- **暗黑模式**:右上角灯泡切换
+
+## Supabase 数据表
+
+在 Supabase SQL Editor 中执行 `supabase/migrations/001_knowledge_tables.sql` 创建表结构。
+
+### 表说明
+
+| 表名 | 说明 |
+|------|------|
+| wxgzh_ebooks | 电子书专栏 |
+| wxgzh_ebook_chapters | 电子书章节(content 存 Markdown) |
+| wxgzh_courses | 课程专栏 |
+| wxgzh_course_chapters | 课程章节(video_url 支持 /path 或 https://) |
+| wxgzh_vip_users | VIP 用户(user_id, expire_at) |
+
+### 添加 VIP 用户
+
+```sql
+INSERT INTO wxgzh_vip_users (user_id, expire_at)
+VALUES ('用户UUID', '2026-12-31 23:59:59+00');
+```
+
+## 视频 URL 格式
+
+- **CDN**:`https://your-cdn.com/video.mp4`
+- **本地**:`/videos/lesson1.mp4`(放在 `public/videos/` 下)
+
+## 支付接入
+
+已接入 payjsapi 后端,支持 **PC / 手机浏览器 / 微信内** 三种场景,**zpay / xorpay** 两种渠道。
+
+### 场景与渠道
+
+| 场景 | 渠道 | 行为 |
+|------|------|------|
+| PC 浏览器 | zpay | 展示微信扫码二维码,轮询支付状态 |
+| 手机浏览器 | zpay | 新窗口打开支付页 |
+| 微信内 | xorpay(默认) | 当前页表单提交,收银台支付 |
+
+### 配置
+
+- **wxH5**:在 `.env` 中设置 `VITE_PAYMENT_API_URL`(payjsapi 地址,默认 `http://127.0.0.1:8700`)
+- **payjsapi**:需为 wxH5 配置 `SUPABASE_URL`、`SUPABASE_SERVICE_KEY`,支付成功后同步 Supabase `wxgzh_vip_users`
+
+### 支付流程
+
+1. 用户登录后点击「开通 VIP」→ 选择套餐 → 发起支付
+2. 返回地址 `/paid`,轮询订单状态,成功后刷新 VIP 状态
+3. payjsapi 异步通知写入 PocketBase + Supabase
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..9dda25f
--- /dev/null
+++ b/index.html
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AI 实战营 - 大模型与智能体实战
+
+
+
+
+
+
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..700ab61
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,2963 @@
+{
+ "name": "printweb",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "printweb",
+ "version": "0.0.0",
+ "dependencies": {
+ "@supabase/supabase-js": "^2.93.3",
+ "animate.css": "^4.1.1",
+ "axios": "^1.13.2",
+ "marked": "^17.0.4",
+ "mitt": "^3.0.1",
+ "mqtt": "^5.14.1",
+ "vant": "^4.9.22",
+ "vue": "^3.5.17",
+ "vue-router": "^5.0.3"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-vue": "^6.0.0",
+ "amfe-flexible": "^2.2.1",
+ "less": "^4.4.0",
+ "postcss-pxtorem": "^6.1.0",
+ "vite": "^7.0.4"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.29.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz",
+ "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz",
+ "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.0"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz",
+ "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
+ "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.28.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz",
+ "integrity": "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.8.tgz",
+ "integrity": "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz",
+ "integrity": "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.8.tgz",
+ "integrity": "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz",
+ "integrity": "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz",
+ "integrity": "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz",
+ "integrity": "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz",
+ "integrity": "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz",
+ "integrity": "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz",
+ "integrity": "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz",
+ "integrity": "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz",
+ "integrity": "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz",
+ "integrity": "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz",
+ "integrity": "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz",
+ "integrity": "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz",
+ "integrity": "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz",
+ "integrity": "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz",
+ "integrity": "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz",
+ "integrity": "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz",
+ "integrity": "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz",
+ "integrity": "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz",
+ "integrity": "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz",
+ "integrity": "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz",
+ "integrity": "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz",
+ "integrity": "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz",
+ "integrity": "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-beta.29",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.29.tgz",
+ "integrity": "sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.2.tgz",
+ "integrity": "sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.2.tgz",
+ "integrity": "sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.2.tgz",
+ "integrity": "sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.2.tgz",
+ "integrity": "sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.2.tgz",
+ "integrity": "sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.2.tgz",
+ "integrity": "sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.2.tgz",
+ "integrity": "sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.2.tgz",
+ "integrity": "sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.2.tgz",
+ "integrity": "sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.2.tgz",
+ "integrity": "sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.2.tgz",
+ "integrity": "sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.2.tgz",
+ "integrity": "sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.2.tgz",
+ "integrity": "sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.2.tgz",
+ "integrity": "sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.2.tgz",
+ "integrity": "sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.2.tgz",
+ "integrity": "sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.2.tgz",
+ "integrity": "sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.2.tgz",
+ "integrity": "sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.2.tgz",
+ "integrity": "sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.2.tgz",
+ "integrity": "sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@supabase/auth-js": {
+ "version": "2.99.0",
+ "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.99.0.tgz",
+ "integrity": "sha512-tHiIST/OEoLmWBE+3X69xRY5srJM/lL86KltmMlIfDo9ePJLo14vQQV9T4NF+P+MoGhCwQL1GTmk51zuAFMXKw==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "2.8.1"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@supabase/functions-js": {
+ "version": "2.99.0",
+ "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.99.0.tgz",
+ "integrity": "sha512-zA9oad6EqGwMLLu2LfP1bXbqKcJGiotAdbdTfZG7YS7619YZQAEgejj9mp+E5vglKE1yMWbKK+S1J3PbuUtgLg==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "2.8.1"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@supabase/postgrest-js": {
+ "version": "2.99.0",
+ "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.99.0.tgz",
+ "integrity": "sha512-8qfOMi2pu9y0IQhUAeFqjrvR49G4ELGevXCWV9qAHXFQ/h2FFh0I8PYjFQj4rHcHSq6hrpozDnS1vbQU8NAQ/A==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "2.8.1"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@supabase/realtime-js": {
+ "version": "2.99.0",
+ "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.99.0.tgz",
+ "integrity": "sha512-7nFTZhNeANR7FvEY6PfWLCfE8dHqcaJd9SuR7IPEZvBPG9K4uEHMivpjZx4NWRSU7Eji7ZbKy2LG+cJ48DhwHg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/phoenix": "^1.6.6",
+ "@types/ws": "^8.18.1",
+ "tslib": "2.8.1",
+ "ws": "^8.18.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@supabase/storage-js": {
+ "version": "2.99.0",
+ "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.99.0.tgz",
+ "integrity": "sha512-mAEEbfsght5EEALejYrwAP9k8sFBGjfMZT8n4SyMXk2iYuWVeRMs1kA/uKg0uDMctWdZ0bL+L4jZzksUJpCjMA==",
+ "license": "MIT",
+ "dependencies": {
+ "iceberg-js": "^0.8.1",
+ "tslib": "2.8.1"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@supabase/supabase-js": {
+ "version": "2.99.0",
+ "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.99.0.tgz",
+ "integrity": "sha512-SP9Sn9tsHDB7N4u2gT13rdeZJewE4xibAxasG7vOz+fYi92+XkMMbWNx0uGK53zKTnAnvTs16isRooyBy4sn5w==",
+ "license": "MIT",
+ "dependencies": {
+ "@supabase/auth-js": "2.99.0",
+ "@supabase/functions-js": "2.99.0",
+ "@supabase/postgrest-js": "2.99.0",
+ "@supabase/realtime-js": "2.99.0",
+ "@supabase/storage-js": "2.99.0"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "25.0.10",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.10.tgz",
+ "integrity": "sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~7.16.0"
+ }
+ },
+ "node_modules/@types/phoenix": {
+ "version": "1.6.7",
+ "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.7.tgz",
+ "integrity": "sha512-oN9ive//QSBkf19rfDv45M7eZPi0eEXylht2OLEXicu5b4KoQ1OzXIw+xDSGWxSxe1JmepRR/ZH283vsu518/Q==",
+ "license": "MIT"
+ },
+ "node_modules/@types/readable-stream": {
+ "version": "4.0.23",
+ "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.23.tgz",
+ "integrity": "sha512-wwXrtQvbMHxCbBgjHaMGEmImFTQxxpfMOR/ZoQnXxB1woqkUbdLGFDgauo00Py9IudiaqSeiBiulSV9i6XIPig==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/ws": {
+ "version": "8.18.1",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
+ "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@vant/popperjs": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@vant/popperjs/-/popperjs-1.3.0.tgz",
+ "integrity": "sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw==",
+ "license": "MIT"
+ },
+ "node_modules/@vant/use": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@vant/use/-/use-1.6.0.tgz",
+ "integrity": "sha512-PHHxeAASgiOpSmMjceweIrv2AxDZIkWXyaczksMoWvKV2YAYEhoizRuk/xFnKF+emUIi46TsQ+rvlm/t2BBCfA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "vue": "^3.0.0"
+ }
+ },
+ "node_modules/@vitejs/plugin-vue": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.1.tgz",
+ "integrity": "sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@rolldown/pluginutils": "1.0.0-beta.29"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0",
+ "vue": "^3.2.25"
+ }
+ },
+ "node_modules/@vue-macros/common": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-3.1.2.tgz",
+ "integrity": "sha512-h9t4ArDdniO9ekYHAD95t9AZcAbb19lEGK+26iAjUODOIJKmObDNBSe4+6ELQAA3vtYiFPPBtHh7+cQCKi3Dng==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-sfc": "^3.5.22",
+ "ast-kit": "^2.1.2",
+ "local-pkg": "^1.1.2",
+ "magic-string-ast": "^1.0.2",
+ "unplugin-utils": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/vue-macros"
+ },
+ "peerDependencies": {
+ "vue": "^2.7.0 || ^3.2.25"
+ },
+ "peerDependenciesMeta": {
+ "vue": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vue-macros/common/node_modules/@vue/compiler-core": {
+ "version": "3.5.30",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.30.tgz",
+ "integrity": "sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.0",
+ "@vue/shared": "3.5.30",
+ "entities": "^7.0.1",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue-macros/common/node_modules/@vue/compiler-dom": {
+ "version": "3.5.30",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.30.tgz",
+ "integrity": "sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-core": "3.5.30",
+ "@vue/shared": "3.5.30"
+ }
+ },
+ "node_modules/@vue-macros/common/node_modules/@vue/compiler-sfc": {
+ "version": "3.5.30",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.30.tgz",
+ "integrity": "sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.0",
+ "@vue/compiler-core": "3.5.30",
+ "@vue/compiler-dom": "3.5.30",
+ "@vue/compiler-ssr": "3.5.30",
+ "@vue/shared": "3.5.30",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.21",
+ "postcss": "^8.5.8",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue-macros/common/node_modules/@vue/compiler-ssr": {
+ "version": "3.5.30",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.30.tgz",
+ "integrity": "sha512-NsYK6OMTnx109PSL2IAyf62JP6EUdk4Dmj6AkWcJGBvN0dQoMYtVekAmdqgTtWQgEJo+Okstbf/1p7qZr5H+bA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.30",
+ "@vue/shared": "3.5.30"
+ }
+ },
+ "node_modules/@vue-macros/common/node_modules/@vue/shared": {
+ "version": "3.5.30",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.30.tgz",
+ "integrity": "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==",
+ "license": "MIT"
+ },
+ "node_modules/@vue-macros/common/node_modules/entities": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz",
+ "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.18.tgz",
+ "integrity": "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.0",
+ "@vue/shared": "3.5.18",
+ "entities": "^4.5.0",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz",
+ "integrity": "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-core": "3.5.18",
+ "@vue/shared": "3.5.18"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz",
+ "integrity": "sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.0",
+ "@vue/compiler-core": "3.5.18",
+ "@vue/compiler-dom": "3.5.18",
+ "@vue/compiler-ssr": "3.5.18",
+ "@vue/shared": "3.5.18",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.17",
+ "postcss": "^8.5.6",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz",
+ "integrity": "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.18",
+ "@vue/shared": "3.5.18"
+ }
+ },
+ "node_modules/@vue/devtools-api": {
+ "version": "8.0.7",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.0.7.tgz",
+ "integrity": "sha512-tc1TXAxclsn55JblLkFVcIRG7MeSJC4fWsPjfM7qu/IcmPUYnQ5Q8vzWwBpyDY24ZjmZTUCCwjRSNbx58IhlAA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-kit": "^8.0.7"
+ }
+ },
+ "node_modules/@vue/devtools-kit": {
+ "version": "8.0.7",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.0.7.tgz",
+ "integrity": "sha512-H6esJGHGl5q0E9iV3m2EoBQHJ+V83WMW83A0/+Fn95eZ2iIvdsq4+UCS6yT/Fdd4cGZSchx/MdWDreM3WqMsDw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-shared": "^8.0.7",
+ "birpc": "^2.6.1",
+ "hookable": "^5.5.3",
+ "perfect-debounce": "^2.0.0"
+ }
+ },
+ "node_modules/@vue/devtools-shared": {
+ "version": "8.0.7",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.0.7.tgz",
+ "integrity": "sha512-CgAb9oJH5NUmbQRdYDj/1zMiaICYSLtm+B1kxcP72LBrifGAjUmt8bx52dDH1gWRPlQgxGPqpAMKavzVirAEhA==",
+ "license": "MIT"
+ },
+ "node_modules/@vue/reactivity": {
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.18.tgz",
+ "integrity": "sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/shared": "3.5.18"
+ }
+ },
+ "node_modules/@vue/runtime-core": {
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.18.tgz",
+ "integrity": "sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/reactivity": "3.5.18",
+ "@vue/shared": "3.5.18"
+ }
+ },
+ "node_modules/@vue/runtime-dom": {
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz",
+ "integrity": "sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/reactivity": "3.5.18",
+ "@vue/runtime-core": "3.5.18",
+ "@vue/shared": "3.5.18",
+ "csstype": "^3.1.3"
+ }
+ },
+ "node_modules/@vue/server-renderer": {
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.18.tgz",
+ "integrity": "sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-ssr": "3.5.18",
+ "@vue/shared": "3.5.18"
+ },
+ "peerDependencies": {
+ "vue": "3.5.18"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz",
+ "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==",
+ "license": "MIT"
+ },
+ "node_modules/abort-controller": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
+ "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+ "license": "MIT",
+ "dependencies": {
+ "event-target-shim": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=6.5"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/amfe-flexible": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/amfe-flexible/-/amfe-flexible-2.2.1.tgz",
+ "integrity": "sha512-L2VfvDzoETBjhRptg5u/IUuzHSuxm22JpSRb404p/TBGeRfwWmmNEbB+TFPIP/sS/+pbM18bCFH9QnMojLuPNw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/animate.css": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/animate.css/-/animate.css-4.1.1.tgz",
+ "integrity": "sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ==",
+ "license": "MIT"
+ },
+ "node_modules/ast-kit": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-2.2.0.tgz",
+ "integrity": "sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.5",
+ "pathe": "^2.0.3"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
+ "node_modules/ast-walker-scope": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.8.3.tgz",
+ "integrity": "sha512-cbdCP0PGOBq0ASG+sjnKIoYkWMKhhz+F/h9pRexUdX2Hd38+WOlBkRKlqkGOSm0YQpcFMQBJeK4WspUAkwsEdg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.4",
+ "ast-kit": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "license": "MIT"
+ },
+ "node_modules/axios": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz",
+ "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.4",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/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/birpc": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz",
+ "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/bl": {
+ "version": "6.1.6",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-6.1.6.tgz",
+ "integrity": "sha512-jLsPgN/YSvPUg9UX0Kd73CXpm2Psg9FxMeCSXnk3WBO3CMT10JMwijubhGfHCnFu6TPn1ei3b975dxv7K2pWVg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/readable-stream": "^4.0.0",
+ "buffer": "^6.0.3",
+ "inherits": "^2.0.4",
+ "readable-stream": "^4.2.0"
+ }
+ },
+ "node_modules/broker-factory": {
+ "version": "3.1.13",
+ "resolved": "https://registry.npmjs.org/broker-factory/-/broker-factory-3.1.13.tgz",
+ "integrity": "sha512-H2VALe31mEtO/SRcNp4cUU5BAm1biwhc/JaF77AigUuni/1YT0FLCJfbUxwIEs9y6Kssjk2fmXgf+Y9ALvmKlw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.28.6",
+ "fast-unique-numbers": "^9.0.26",
+ "tslib": "^2.8.1",
+ "worker-factory": "^7.0.48"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+ "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.2.1"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "license": "MIT"
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/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/chokidar": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
+ "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==",
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 20.19.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/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/commist": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/commist/-/commist-3.2.0.tgz",
+ "integrity": "sha512-4PIMoPniho+LqXmpS5d3NuGYncG6XWlkBSVGiWycL22dd42OYdUGil2CWuzklaJoNxyxUSpO4MKIBU94viWNAw==",
+ "license": "MIT"
+ },
+ "node_modules/concat-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
+ "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
+ "engines": [
+ "node >= 6.0"
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.0.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "node_modules/concat-stream/node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/confbox": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz",
+ "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==",
+ "license": "MIT"
+ },
+ "node_modules/copy-anything": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz",
+ "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-what": "^3.14.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/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/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/errno": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
+ "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "prr": "~1.0.1"
+ },
+ "bin": {
+ "errno": "cli.js"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/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.npmjs.org/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.npmjs.org/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.npmjs.org/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/esbuild": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.8.tgz",
+ "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.25.8",
+ "@esbuild/android-arm": "0.25.8",
+ "@esbuild/android-arm64": "0.25.8",
+ "@esbuild/android-x64": "0.25.8",
+ "@esbuild/darwin-arm64": "0.25.8",
+ "@esbuild/darwin-x64": "0.25.8",
+ "@esbuild/freebsd-arm64": "0.25.8",
+ "@esbuild/freebsd-x64": "0.25.8",
+ "@esbuild/linux-arm": "0.25.8",
+ "@esbuild/linux-arm64": "0.25.8",
+ "@esbuild/linux-ia32": "0.25.8",
+ "@esbuild/linux-loong64": "0.25.8",
+ "@esbuild/linux-mips64el": "0.25.8",
+ "@esbuild/linux-ppc64": "0.25.8",
+ "@esbuild/linux-riscv64": "0.25.8",
+ "@esbuild/linux-s390x": "0.25.8",
+ "@esbuild/linux-x64": "0.25.8",
+ "@esbuild/netbsd-arm64": "0.25.8",
+ "@esbuild/netbsd-x64": "0.25.8",
+ "@esbuild/openbsd-arm64": "0.25.8",
+ "@esbuild/openbsd-x64": "0.25.8",
+ "@esbuild/openharmony-arm64": "0.25.8",
+ "@esbuild/sunos-x64": "0.25.8",
+ "@esbuild/win32-arm64": "0.25.8",
+ "@esbuild/win32-ia32": "0.25.8",
+ "@esbuild/win32-x64": "0.25.8"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "license": "MIT"
+ },
+ "node_modules/event-target-shim": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
+ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/exsolve": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz",
+ "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==",
+ "license": "MIT"
+ },
+ "node_modules/fast-unique-numbers": {
+ "version": "9.0.26",
+ "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-9.0.26.tgz",
+ "integrity": "sha512-3Mtq8p1zQinjGyWfKeuBunbuFoixG72AUkk4VvzbX4ykCW9Q4FzRaNyIlfQhUjnKw2ARVP+/CKnoyr6wfHftig==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.28.6",
+ "tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=18.2.0"
+ }
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.11",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
+ "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
+ "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.5",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
+ "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.2",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "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.npmjs.org/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.npmjs.org/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.npmjs.org/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/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/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/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/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.npmjs.org/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.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/help-me": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz",
+ "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==",
+ "license": "MIT"
+ },
+ "node_modules/hookable": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz",
+ "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
+ "license": "MIT"
+ },
+ "node_modules/iceberg-js": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/iceberg-js/-/iceberg-js-0.8.1.tgz",
+ "integrity": "sha512-1dhVQZXhcHje7798IVM+xoo/1ZdVfzOMIc8/rgVSijRK38EDqOJoGula9N/8ZI5RD8QTxNQtK/Gozpr+qUqRRA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/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/image-size": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
+ "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "bin": {
+ "image-size": "bin/image-size.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/ip-address": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz",
+ "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/is-what": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz",
+ "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/js-sdsl": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz",
+ "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/js-sdsl"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/less": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/less/-/less-4.4.0.tgz",
+ "integrity": "sha512-kdTwsyRuncDfjEs0DlRILWNvxhDG/Zij4YLO4TMJgDLW+8OzpfkdPnRgrsRuY1o+oaxJGWsps5f/RVBgGmmN0w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "copy-anything": "^2.0.1",
+ "parse-node-version": "^1.0.1",
+ "tslib": "^2.3.0"
+ },
+ "bin": {
+ "lessc": "bin/lessc"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "optionalDependencies": {
+ "errno": "^0.1.1",
+ "graceful-fs": "^4.1.2",
+ "image-size": "~0.5.0",
+ "make-dir": "^2.1.0",
+ "mime": "^1.4.1",
+ "needle": "^3.1.0",
+ "source-map": "~0.6.0"
+ }
+ },
+ "node_modules/local-pkg": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz",
+ "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==",
+ "license": "MIT",
+ "dependencies": {
+ "mlly": "^1.7.4",
+ "pkg-types": "^2.3.0",
+ "quansync": "^0.2.11"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "license": "ISC"
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/magic-string-ast": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-1.0.3.tgz",
+ "integrity": "sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==",
+ "license": "MIT",
+ "dependencies": {
+ "magic-string": "^0.30.19"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "pify": "^4.0.1",
+ "semver": "^5.6.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/marked": {
+ "version": "17.0.4",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-17.0.4.tgz",
+ "integrity": "sha512-NOmVMM+KAokHMvjWmC5N/ZOvgmSWuqJB8FoYI019j4ogb/PeRMKoKIjReZ2w3376kkA8dSJIP8uD993Kxc0iRQ==",
+ "license": "MIT",
+ "bin": {
+ "marked": "bin/marked.js"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/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.npmjs.org/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/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/mitt": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
+ "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
+ "license": "MIT"
+ },
+ "node_modules/mlly": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.1.tgz",
+ "integrity": "sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==",
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.16.0",
+ "pathe": "^2.0.3",
+ "pkg-types": "^1.3.1",
+ "ufo": "^1.6.3"
+ }
+ },
+ "node_modules/mlly/node_modules/confbox": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
+ "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
+ "license": "MIT"
+ },
+ "node_modules/mlly/node_modules/pkg-types": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
+ "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "confbox": "^0.1.8",
+ "mlly": "^1.7.4",
+ "pathe": "^2.0.1"
+ }
+ },
+ "node_modules/mqtt": {
+ "version": "5.14.1",
+ "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-5.14.1.tgz",
+ "integrity": "sha512-NxkPxE70Uq3Ph7goefQa7ggSsVzHrayCD0OyxlJgITN/EbzlZN+JEPmaAZdxP1LsIT5FamDyILoQTF72W7Nnbw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/readable-stream": "^4.0.21",
+ "@types/ws": "^8.18.1",
+ "commist": "^3.2.0",
+ "concat-stream": "^2.0.0",
+ "debug": "^4.4.1",
+ "help-me": "^5.0.0",
+ "lru-cache": "^10.4.3",
+ "minimist": "^1.2.8",
+ "mqtt-packet": "^9.0.2",
+ "number-allocator": "^1.0.14",
+ "readable-stream": "^4.7.0",
+ "rfdc": "^1.4.1",
+ "socks": "^2.8.6",
+ "split2": "^4.2.0",
+ "worker-timers": "^8.0.23",
+ "ws": "^8.18.3"
+ },
+ "bin": {
+ "mqtt": "build/bin/mqtt.js",
+ "mqtt_pub": "build/bin/pub.js",
+ "mqtt_sub": "build/bin/sub.js"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/mqtt-packet": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-9.0.2.tgz",
+ "integrity": "sha512-MvIY0B8/qjq7bKxdN1eD+nrljoeaai+qjLJgfRn3TiMuz0pamsIWY2bFODPZMSNmabsLANXsLl4EMoWvlaTZWA==",
+ "license": "MIT",
+ "dependencies": {
+ "bl": "^6.0.8",
+ "debug": "^4.3.4",
+ "process-nextick-args": "^2.0.1"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/muggle-string": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz",
+ "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==",
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/needle": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz",
+ "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "iconv-lite": "^0.6.3",
+ "sax": "^1.2.4"
+ },
+ "bin": {
+ "needle": "bin/needle"
+ },
+ "engines": {
+ "node": ">= 4.4.x"
+ }
+ },
+ "node_modules/number-allocator": {
+ "version": "1.0.14",
+ "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.14.tgz",
+ "integrity": "sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.1",
+ "js-sdsl": "4.3.0"
+ }
+ },
+ "node_modules/parse-node-version": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
+ "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/pathe": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+ "license": "MIT"
+ },
+ "node_modules/perfect-debounce": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz",
+ "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==",
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-types": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz",
+ "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==",
+ "license": "MIT",
+ "dependencies": {
+ "confbox": "^0.2.2",
+ "exsolve": "^1.0.7",
+ "pathe": "^2.0.3"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.8",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz",
+ "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-pxtorem": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-pxtorem/-/postcss-pxtorem-6.1.0.tgz",
+ "integrity": "sha512-ROODSNci9ADal3zUcPHOF/K83TiCgNSPXQFSbwyPHNV8ioHIE4SaC+FPOufd8jsr5jV2uIz29v1Uqy1c4ov42g==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "license": "MIT"
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+ "license": "MIT"
+ },
+ "node_modules/prr": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+ "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/quansync": {
+ "version": "0.2.11",
+ "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz",
+ "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/antfu"
+ },
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/readable-stream": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz",
+ "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==",
+ "license": "MIT",
+ "dependencies": {
+ "abort-controller": "^3.0.0",
+ "buffer": "^6.0.3",
+ "events": "^3.3.0",
+ "process": "^0.11.10",
+ "string_decoder": "^1.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz",
+ "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20.19.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/rfdc": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
+ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+ "license": "MIT"
+ },
+ "node_modules/rollup": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz",
+ "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.8"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.46.2",
+ "@rollup/rollup-android-arm64": "4.46.2",
+ "@rollup/rollup-darwin-arm64": "4.46.2",
+ "@rollup/rollup-darwin-x64": "4.46.2",
+ "@rollup/rollup-freebsd-arm64": "4.46.2",
+ "@rollup/rollup-freebsd-x64": "4.46.2",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.46.2",
+ "@rollup/rollup-linux-arm-musleabihf": "4.46.2",
+ "@rollup/rollup-linux-arm64-gnu": "4.46.2",
+ "@rollup/rollup-linux-arm64-musl": "4.46.2",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.46.2",
+ "@rollup/rollup-linux-ppc64-gnu": "4.46.2",
+ "@rollup/rollup-linux-riscv64-gnu": "4.46.2",
+ "@rollup/rollup-linux-riscv64-musl": "4.46.2",
+ "@rollup/rollup-linux-s390x-gnu": "4.46.2",
+ "@rollup/rollup-linux-x64-gnu": "4.46.2",
+ "@rollup/rollup-linux-x64-musl": "4.46.2",
+ "@rollup/rollup-win32-arm64-msvc": "4.46.2",
+ "@rollup/rollup-win32-ia32-msvc": "4.46.2",
+ "@rollup/rollup-win32-x64-msvc": "4.46.2",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/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/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/sax": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
+ "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true
+ },
+ "node_modules/scule": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz",
+ "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/smart-buffer": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/socks": {
+ "version": "2.8.7",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz",
+ "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==",
+ "license": "MIT",
+ "dependencies": {
+ "ip-address": "^10.0.1",
+ "smart-buffer": "^4.2.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/split2": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+ "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 10.x"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.15",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
+ "node_modules/typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
+ "license": "MIT"
+ },
+ "node_modules/ufo": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz",
+ "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==",
+ "license": "MIT"
+ },
+ "node_modules/undici-types": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
+ "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
+ "license": "MIT"
+ },
+ "node_modules/unplugin": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.0.0.tgz",
+ "integrity": "sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/remapping": "^2.3.5",
+ "picomatch": "^4.0.3",
+ "webpack-virtual-modules": "^0.6.2"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/unplugin-utils": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.1.tgz",
+ "integrity": "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==",
+ "license": "MIT",
+ "dependencies": {
+ "pathe": "^2.0.3",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "license": "MIT"
+ },
+ "node_modules/vant": {
+ "version": "4.9.22",
+ "resolved": "https://registry.npmjs.org/vant/-/vant-4.9.22.tgz",
+ "integrity": "sha512-P2PDSj3oB6l3W1OpVlQpapeLmI6bXMSvPqPdrw5rutslC0Y6tSkrVB/iSD57weD7K92GsjGkvgDK0eZlOsXGqw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vant/popperjs": "^1.3.0",
+ "@vant/use": "^1.6.0",
+ "@vue/shared": "^3.5.25"
+ },
+ "peerDependencies": {
+ "vue": "^3.0.0"
+ }
+ },
+ "node_modules/vant/node_modules/@vue/shared": {
+ "version": "3.5.27",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.27.tgz",
+ "integrity": "sha512-dXr/3CgqXsJkZ0n9F3I4elY8wM9jMJpP3pvRG52r6m0tu/MsAFIe6JpXVGeNMd/D9F4hQynWT8Rfuj0bdm9kFQ==",
+ "license": "MIT"
+ },
+ "node_modules/vite": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.6.tgz",
+ "integrity": "sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.25.0",
+ "fdir": "^6.4.6",
+ "picomatch": "^4.0.3",
+ "postcss": "^8.5.6",
+ "rollup": "^4.40.0",
+ "tinyglobby": "^0.2.14"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "lightningcss": "^1.21.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue": {
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.18.tgz",
+ "integrity": "sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.18",
+ "@vue/compiler-sfc": "3.5.18",
+ "@vue/runtime-dom": "3.5.18",
+ "@vue/server-renderer": "3.5.18",
+ "@vue/shared": "3.5.18"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-router": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-5.0.3.tgz",
+ "integrity": "sha512-nG1c7aAFac7NYj8Hluo68WyWfc41xkEjaR0ViLHCa3oDvTQ/nIuLJlXJX1NUPw/DXzx/8+OKMng045HHQKQKWw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/generator": "^7.28.6",
+ "@vue-macros/common": "^3.1.1",
+ "@vue/devtools-api": "^8.0.6",
+ "ast-walker-scope": "^0.8.3",
+ "chokidar": "^5.0.0",
+ "json5": "^2.2.3",
+ "local-pkg": "^1.1.2",
+ "magic-string": "^0.30.21",
+ "mlly": "^1.8.0",
+ "muggle-string": "^0.4.1",
+ "pathe": "^2.0.3",
+ "picomatch": "^4.0.3",
+ "scule": "^1.3.0",
+ "tinyglobby": "^0.2.15",
+ "unplugin": "^3.0.0",
+ "unplugin-utils": "^0.3.1",
+ "yaml": "^2.8.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "@pinia/colada": ">=0.21.2",
+ "@vue/compiler-sfc": "^3.5.17",
+ "pinia": "^3.0.4",
+ "vue": "^3.5.0"
+ },
+ "peerDependenciesMeta": {
+ "@pinia/colada": {
+ "optional": true
+ },
+ "@vue/compiler-sfc": {
+ "optional": true
+ },
+ "pinia": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-virtual-modules": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
+ "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==",
+ "license": "MIT"
+ },
+ "node_modules/worker-factory": {
+ "version": "7.0.48",
+ "resolved": "https://registry.npmjs.org/worker-factory/-/worker-factory-7.0.48.tgz",
+ "integrity": "sha512-CGmBy3tJvpBPjUvb0t4PrpKubUsfkI1Ohg0/GGFU2RvA9j/tiVYwKU8O7yu7gH06YtzbeJLzdUR29lmZKn5pag==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.28.6",
+ "fast-unique-numbers": "^9.0.26",
+ "tslib": "^2.8.1"
+ }
+ },
+ "node_modules/worker-timers": {
+ "version": "8.0.29",
+ "resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-8.0.29.tgz",
+ "integrity": "sha512-9jk0MWHhWAZ2xlJPXr45oe5UF/opdpfZrY0HtyPizWuJ+ce1M3IYk/4IIdGct3kn9Ncfs+tkZt3w1tU6KW2Fsg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.28.6",
+ "tslib": "^2.8.1",
+ "worker-timers-broker": "^8.0.15",
+ "worker-timers-worker": "^9.0.13"
+ }
+ },
+ "node_modules/worker-timers-broker": {
+ "version": "8.0.15",
+ "resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-8.0.15.tgz",
+ "integrity": "sha512-Te+EiVUMzG5TtHdmaBZvBrZSFNauym6ImDaCAnzQUxvjnw+oGjMT2idmAOgDy30vOZMLejd0bcsc90Axu6XPWA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.28.6",
+ "broker-factory": "^3.1.13",
+ "fast-unique-numbers": "^9.0.26",
+ "tslib": "^2.8.1",
+ "worker-timers-worker": "^9.0.13"
+ }
+ },
+ "node_modules/worker-timers-worker": {
+ "version": "9.0.13",
+ "resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-9.0.13.tgz",
+ "integrity": "sha512-qjn18szGb1kjcmh2traAdki1eiIS5ikFo+L90nfMOvSRpuDw1hAcR1nzkP2+Hkdqz5thIRnfuWx7QSpsEUsA6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.28.6",
+ "tslib": "^2.8.1",
+ "worker-factory": "^7.0.48"
+ }
+ },
+ "node_modules/ws": {
+ "version": "8.19.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz",
+ "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==",
+ "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/yaml": {
+ "version": "2.8.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz",
+ "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==",
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..cdcdd29
--- /dev/null
+++ b/package.json
@@ -0,0 +1,30 @@
+{
+ "name": "printweb",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@supabase/supabase-js": "^2.93.3",
+ "animate.css": "^4.1.1",
+ "axios": "^1.13.2",
+ "marked": "^17.0.4",
+ "mitt": "^3.0.1",
+ "mqtt": "^5.14.1",
+ "vant": "^4.9.22",
+ "vue": "^3.5.17",
+ "vue-router": "^5.0.3"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-vue": "^6.0.0",
+ "amfe-flexible": "^2.2.1",
+ "less": "^4.4.0",
+ "postcss-pxtorem": "^6.1.0",
+ "vite": "^7.0.4"
+ },
+ "packageManager": "pnpm@10.25.0+sha1.2cfb3ab644446565c127f58165cc76368c9c920b"
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..24f60b9
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,1978 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ '@supabase/supabase-js':
+ specifier: ^2.93.3
+ version: 2.99.0
+ animate.css:
+ specifier: ^4.1.1
+ version: 4.1.1
+ axios:
+ specifier: ^1.13.2
+ version: 1.13.6
+ marked:
+ specifier: ^17.0.4
+ version: 17.0.4
+ mitt:
+ specifier: ^3.0.1
+ version: 3.0.1
+ mqtt:
+ specifier: ^5.14.1
+ version: 5.15.0
+ vant:
+ specifier: ^4.9.22
+ version: 4.9.22(vue@3.5.30)
+ vue:
+ specifier: ^3.5.17
+ version: 3.5.30
+ vue-router:
+ specifier: ^5.0.3
+ version: 5.0.3(@vue/compiler-sfc@3.5.30)(vue@3.5.30)
+ devDependencies:
+ '@vitejs/plugin-vue':
+ specifier: ^6.0.0
+ version: 6.0.4(vite@7.3.1(@types/node@25.4.0)(less@4.6.2)(yaml@2.8.2))(vue@3.5.30)
+ amfe-flexible:
+ specifier: ^2.2.1
+ version: 2.2.1
+ less:
+ specifier: ^4.4.0
+ version: 4.6.2
+ postcss-pxtorem:
+ specifier: ^6.1.0
+ version: 6.1.0(postcss@8.5.8)
+ vite:
+ specifier: ^7.0.4
+ version: 7.3.1(@types/node@25.4.0)(less@4.6.2)(yaml@2.8.2)
+
+packages:
+
+ '@babel/generator@7.29.1':
+ resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@7.27.1':
+ resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.28.5':
+ resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.29.0':
+ resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/runtime@7.28.6':
+ resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.29.0':
+ resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==}
+ engines: {node: '>=6.9.0'}
+
+ '@esbuild/aix-ppc64@0.27.3':
+ resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.27.3':
+ resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.27.3':
+ resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.27.3':
+ resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.27.3':
+ resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.27.3':
+ resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.27.3':
+ resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.27.3':
+ resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.27.3':
+ resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.27.3':
+ resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.27.3':
+ resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.27.3':
+ resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.27.3':
+ resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.27.3':
+ resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.27.3':
+ resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.27.3':
+ resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.27.3':
+ resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-arm64@0.27.3':
+ resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.27.3':
+ resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-arm64@0.27.3':
+ resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.27.3':
+ resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openharmony-arm64@0.27.3':
+ resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@esbuild/sunos-x64@0.27.3':
+ resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.27.3':
+ resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.27.3':
+ resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.27.3':
+ resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@jridgewell/gen-mapping@0.3.13':
+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+
+ '@jridgewell/remapping@2.3.5':
+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
+
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/sourcemap-codec@1.5.5':
+ resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+
+ '@rolldown/pluginutils@1.0.0-rc.2':
+ resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==}
+
+ '@rollup/rollup-android-arm-eabi@4.59.0':
+ resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==}
+ cpu: [arm]
+ os: [android]
+
+ '@rollup/rollup-android-arm64@4.59.0':
+ resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==}
+ cpu: [arm64]
+ os: [android]
+
+ '@rollup/rollup-darwin-arm64@4.59.0':
+ resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rollup/rollup-darwin-x64@4.59.0':
+ resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rollup/rollup-freebsd-arm64@4.59.0':
+ resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@rollup/rollup-freebsd-x64@4.59.0':
+ resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.59.0':
+ resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm-musleabihf@4.59.0':
+ resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-gnu@4.59.0':
+ resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-musl@4.59.0':
+ resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-loong64-gnu@4.59.0':
+ resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==}
+ cpu: [loong64]
+ os: [linux]
+
+ '@rollup/rollup-linux-loong64-musl@4.59.0':
+ resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==}
+ cpu: [loong64]
+ os: [linux]
+
+ '@rollup/rollup-linux-ppc64-gnu@4.59.0':
+ resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@rollup/rollup-linux-ppc64-musl@4.59.0':
+ resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@rollup/rollup-linux-riscv64-gnu@4.59.0':
+ resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-riscv64-musl@4.59.0':
+ resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-s390x-gnu@4.59.0':
+ resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-gnu@4.59.0':
+ resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-musl@4.59.0':
+ resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-openbsd-x64@4.59.0':
+ resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@rollup/rollup-openharmony-arm64@4.59.0':
+ resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@rollup/rollup-win32-arm64-msvc@4.59.0':
+ resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rollup/rollup-win32-ia32-msvc@4.59.0':
+ resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-gnu@4.59.0':
+ resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==}
+ cpu: [x64]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-msvc@4.59.0':
+ resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==}
+ cpu: [x64]
+ os: [win32]
+
+ '@supabase/auth-js@2.99.0':
+ resolution: {integrity: sha512-tHiIST/OEoLmWBE+3X69xRY5srJM/lL86KltmMlIfDo9ePJLo14vQQV9T4NF+P+MoGhCwQL1GTmk51zuAFMXKw==}
+ engines: {node: '>=20.0.0'}
+
+ '@supabase/functions-js@2.99.0':
+ resolution: {integrity: sha512-zA9oad6EqGwMLLu2LfP1bXbqKcJGiotAdbdTfZG7YS7619YZQAEgejj9mp+E5vglKE1yMWbKK+S1J3PbuUtgLg==}
+ engines: {node: '>=20.0.0'}
+
+ '@supabase/postgrest-js@2.99.0':
+ resolution: {integrity: sha512-8qfOMi2pu9y0IQhUAeFqjrvR49G4ELGevXCWV9qAHXFQ/h2FFh0I8PYjFQj4rHcHSq6hrpozDnS1vbQU8NAQ/A==}
+ engines: {node: '>=20.0.0'}
+
+ '@supabase/realtime-js@2.99.0':
+ resolution: {integrity: sha512-7nFTZhNeANR7FvEY6PfWLCfE8dHqcaJd9SuR7IPEZvBPG9K4uEHMivpjZx4NWRSU7Eji7ZbKy2LG+cJ48DhwHg==}
+ engines: {node: '>=20.0.0'}
+
+ '@supabase/storage-js@2.99.0':
+ resolution: {integrity: sha512-mAEEbfsght5EEALejYrwAP9k8sFBGjfMZT8n4SyMXk2iYuWVeRMs1kA/uKg0uDMctWdZ0bL+L4jZzksUJpCjMA==}
+ engines: {node: '>=20.0.0'}
+
+ '@supabase/supabase-js@2.99.0':
+ resolution: {integrity: sha512-SP9Sn9tsHDB7N4u2gT13rdeZJewE4xibAxasG7vOz+fYi92+XkMMbWNx0uGK53zKTnAnvTs16isRooyBy4sn5w==}
+ engines: {node: '>=20.0.0'}
+
+ '@types/estree@1.0.8':
+ resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+
+ '@types/node@25.4.0':
+ resolution: {integrity: sha512-9wLpoeWuBlcbBpOY3XmzSTG3oscB6xjBEEtn+pYXTfhyXhIxC5FsBer2KTopBlvKEiW9l13po9fq+SJY/5lkhw==}
+
+ '@types/phoenix@1.6.7':
+ resolution: {integrity: sha512-oN9ive//QSBkf19rfDv45M7eZPi0eEXylht2OLEXicu5b4KoQ1OzXIw+xDSGWxSxe1JmepRR/ZH283vsu518/Q==}
+
+ '@types/readable-stream@4.0.23':
+ resolution: {integrity: sha512-wwXrtQvbMHxCbBgjHaMGEmImFTQxxpfMOR/ZoQnXxB1woqkUbdLGFDgauo00Py9IudiaqSeiBiulSV9i6XIPig==}
+
+ '@types/ws@8.18.1':
+ resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==}
+
+ '@vant/popperjs@1.3.0':
+ resolution: {integrity: sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw==}
+
+ '@vant/use@1.6.0':
+ resolution: {integrity: sha512-PHHxeAASgiOpSmMjceweIrv2AxDZIkWXyaczksMoWvKV2YAYEhoizRuk/xFnKF+emUIi46TsQ+rvlm/t2BBCfA==}
+ peerDependencies:
+ vue: ^3.0.0
+
+ '@vitejs/plugin-vue@6.0.4':
+ resolution: {integrity: sha512-uM5iXipgYIn13UUQCZNdWkYk+sysBeA97d5mHsAoAt1u/wpN3+zxOmsVJWosuzX+IMGRzeYUNytztrYznboIkQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ peerDependencies:
+ vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
+ vue: ^3.2.25
+
+ '@vue-macros/common@3.1.2':
+ resolution: {integrity: sha512-h9t4ArDdniO9ekYHAD95t9AZcAbb19lEGK+26iAjUODOIJKmObDNBSe4+6ELQAA3vtYiFPPBtHh7+cQCKi3Dng==}
+ engines: {node: '>=20.19.0'}
+ peerDependencies:
+ vue: ^2.7.0 || ^3.2.25
+ peerDependenciesMeta:
+ vue:
+ optional: true
+
+ '@vue/compiler-core@3.5.30':
+ resolution: {integrity: sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==}
+
+ '@vue/compiler-dom@3.5.30':
+ resolution: {integrity: sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==}
+
+ '@vue/compiler-sfc@3.5.30':
+ resolution: {integrity: sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A==}
+
+ '@vue/compiler-ssr@3.5.30':
+ resolution: {integrity: sha512-NsYK6OMTnx109PSL2IAyf62JP6EUdk4Dmj6AkWcJGBvN0dQoMYtVekAmdqgTtWQgEJo+Okstbf/1p7qZr5H+bA==}
+
+ '@vue/devtools-api@8.0.7':
+ resolution: {integrity: sha512-tc1TXAxclsn55JblLkFVcIRG7MeSJC4fWsPjfM7qu/IcmPUYnQ5Q8vzWwBpyDY24ZjmZTUCCwjRSNbx58IhlAA==}
+
+ '@vue/devtools-kit@8.0.7':
+ resolution: {integrity: sha512-H6esJGHGl5q0E9iV3m2EoBQHJ+V83WMW83A0/+Fn95eZ2iIvdsq4+UCS6yT/Fdd4cGZSchx/MdWDreM3WqMsDw==}
+
+ '@vue/devtools-shared@8.0.7':
+ resolution: {integrity: sha512-CgAb9oJH5NUmbQRdYDj/1zMiaICYSLtm+B1kxcP72LBrifGAjUmt8bx52dDH1gWRPlQgxGPqpAMKavzVirAEhA==}
+
+ '@vue/reactivity@3.5.30':
+ resolution: {integrity: sha512-179YNgKATuwj9gB+66snskRDOitDiuOZqkYia7mHKJaidOMo/WJxHKF8DuGc4V4XbYTJANlfEKb0yxTQotnx4Q==}
+
+ '@vue/runtime-core@3.5.30':
+ resolution: {integrity: sha512-e0Z+8PQsUTdwV8TtEsLzUM7SzC7lQwYKePydb7K2ZnmS6jjND+WJXkmmfh/swYzRyfP1EY3fpdesyYoymCzYfg==}
+
+ '@vue/runtime-dom@3.5.30':
+ resolution: {integrity: sha512-2UIGakjU4WSQ0T4iwDEW0W7vQj6n7AFn7taqZ9Cvm0Q/RA2FFOziLESrDL4GmtI1wV3jXg5nMoJSYO66egDUBw==}
+
+ '@vue/server-renderer@3.5.30':
+ resolution: {integrity: sha512-v+R34icapydRwbZRD0sXwtHqrQJv38JuMB4JxbOxd8NEpGLny7cncMp53W9UH/zo4j8eDHjQ1dEJXwzFQknjtQ==}
+ peerDependencies:
+ vue: 3.5.30
+
+ '@vue/shared@3.5.30':
+ resolution: {integrity: sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==}
+
+ abort-controller@3.0.0:
+ resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
+ engines: {node: '>=6.5'}
+
+ acorn@8.16.0:
+ resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ amfe-flexible@2.2.1:
+ resolution: {integrity: sha512-L2VfvDzoETBjhRptg5u/IUuzHSuxm22JpSRb404p/TBGeRfwWmmNEbB+TFPIP/sS/+pbM18bCFH9QnMojLuPNw==}
+
+ animate.css@4.1.1:
+ resolution: {integrity: sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ==}
+
+ ast-kit@2.2.0:
+ resolution: {integrity: sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==}
+ engines: {node: '>=20.19.0'}
+
+ ast-walker-scope@0.8.3:
+ resolution: {integrity: sha512-cbdCP0PGOBq0ASG+sjnKIoYkWMKhhz+F/h9pRexUdX2Hd38+WOlBkRKlqkGOSm0YQpcFMQBJeK4WspUAkwsEdg==}
+ engines: {node: '>=20.19.0'}
+
+ asynckit@0.4.0:
+ resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+
+ axios@1.13.6:
+ resolution: {integrity: sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==}
+
+ base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+ birpc@2.9.0:
+ resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==}
+
+ bl@6.1.6:
+ resolution: {integrity: sha512-jLsPgN/YSvPUg9UX0Kd73CXpm2Psg9FxMeCSXnk3WBO3CMT10JMwijubhGfHCnFu6TPn1ei3b975dxv7K2pWVg==}
+
+ broker-factory@3.1.13:
+ resolution: {integrity: sha512-H2VALe31mEtO/SRcNp4cUU5BAm1biwhc/JaF77AigUuni/1YT0FLCJfbUxwIEs9y6Kssjk2fmXgf+Y9ALvmKlw==}
+
+ buffer-from@1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+ 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'}
+
+ chokidar@5.0.0:
+ resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==}
+ engines: {node: '>= 20.19.0'}
+
+ combined-stream@1.0.8:
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+ engines: {node: '>= 0.8'}
+
+ commist@3.2.0:
+ resolution: {integrity: sha512-4PIMoPniho+LqXmpS5d3NuGYncG6XWlkBSVGiWycL22dd42OYdUGil2CWuzklaJoNxyxUSpO4MKIBU94viWNAw==}
+
+ concat-stream@2.0.0:
+ resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==}
+ engines: {'0': node >= 6.0}
+
+ confbox@0.1.8:
+ resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+
+ confbox@0.2.4:
+ resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==}
+
+ copy-anything@3.0.5:
+ resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==}
+ engines: {node: '>=12.13'}
+
+ csstype@3.2.3:
+ resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
+
+ debug@4.4.3:
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ delayed-stream@1.0.0:
+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+ engines: {node: '>=0.4.0'}
+
+ dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+ engines: {node: '>= 0.4'}
+
+ entities@7.0.1:
+ resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==}
+ engines: {node: '>=0.12'}
+
+ errno@0.1.8:
+ resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==}
+ hasBin: true
+
+ 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.27.3:
+ resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ estree-walker@2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+ event-target-shim@5.0.1:
+ resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
+ engines: {node: '>=6'}
+
+ events@3.3.0:
+ resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+ engines: {node: '>=0.8.x'}
+
+ exsolve@1.0.8:
+ resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==}
+
+ fast-unique-numbers@9.0.26:
+ resolution: {integrity: sha512-3Mtq8p1zQinjGyWfKeuBunbuFoixG72AUkk4VvzbX4ykCW9Q4FzRaNyIlfQhUjnKw2ARVP+/CKnoyr6wfHftig==}
+ engines: {node: '>=18.2.0'}
+
+ fdir@6.5.0:
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
+ follow-redirects@1.15.11:
+ resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ debug: '*'
+ peerDependenciesMeta:
+ debug:
+ optional: true
+
+ form-data@4.0.5:
+ resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==}
+ engines: {node: '>= 6'}
+
+ 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==}
+
+ get-intrinsic@1.3.0:
+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+ engines: {node: '>= 0.4'}
+
+ get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+ engines: {node: '>= 0.4'}
+
+ gopd@1.2.0:
+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+ engines: {node: '>= 0.4'}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ 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'}
+
+ help-me@5.0.0:
+ resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==}
+
+ hookable@5.5.3:
+ resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
+
+ iceberg-js@0.8.1:
+ resolution: {integrity: sha512-1dhVQZXhcHje7798IVM+xoo/1ZdVfzOMIc8/rgVSijRK38EDqOJoGula9N/8ZI5RD8QTxNQtK/Gozpr+qUqRRA==}
+ engines: {node: '>=20.0.0'}
+
+ iconv-lite@0.6.3:
+ resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+ engines: {node: '>=0.10.0'}
+
+ ieee754@1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+
+ image-size@0.5.5:
+ resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==}
+ engines: {node: '>=0.10.0'}
+ hasBin: true
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ ip-address@10.1.0:
+ resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==}
+ engines: {node: '>= 12'}
+
+ is-what@4.1.16:
+ resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==}
+ engines: {node: '>=12.13'}
+
+ js-sdsl@4.3.0:
+ resolution: {integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==}
+
+ jsesc@3.1.0:
+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ less@4.6.2:
+ resolution: {integrity: sha512-/f26k/Z8VOtdkmubElnfZGtNoOlnZN6E1g9WkPkRmsz/FNVaaArbwCIMflPdH//RJeowfuTPmdZSp9zyEYQ1gQ==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ local-pkg@1.1.2:
+ resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==}
+ engines: {node: '>=14'}
+
+ lru-cache@10.4.3:
+ resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
+
+ magic-string-ast@1.0.3:
+ resolution: {integrity: sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==}
+ engines: {node: '>=20.19.0'}
+
+ magic-string@0.30.21:
+ resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+
+ make-dir@2.1.0:
+ resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==}
+ engines: {node: '>=6'}
+
+ marked@17.0.4:
+ resolution: {integrity: sha512-NOmVMM+KAokHMvjWmC5N/ZOvgmSWuqJB8FoYI019j4ogb/PeRMKoKIjReZ2w3376kkA8dSJIP8uD993Kxc0iRQ==}
+ engines: {node: '>= 20'}
+ hasBin: true
+
+ math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+ engines: {node: '>= 0.4'}
+
+ 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'}
+
+ mime@1.6.0:
+ resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+ mitt@3.0.1:
+ resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
+
+ mlly@1.8.1:
+ resolution: {integrity: sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==}
+
+ mqtt-packet@9.0.2:
+ resolution: {integrity: sha512-MvIY0B8/qjq7bKxdN1eD+nrljoeaai+qjLJgfRn3TiMuz0pamsIWY2bFODPZMSNmabsLANXsLl4EMoWvlaTZWA==}
+
+ mqtt@5.15.0:
+ resolution: {integrity: sha512-KC+wAssYk83Qu5bT8YDzDYgUJxPhbLeVsDvpY2QvL28PnXYJzC2WkKruyMUgBAZaQ7h9lo9k2g4neRNUUxzgMw==}
+ engines: {node: '>=16.0.0'}
+ hasBin: true
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ muggle-string@0.4.1:
+ resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
+
+ nanoid@3.3.11:
+ resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ needle@3.3.1:
+ resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==}
+ engines: {node: '>= 4.4.x'}
+ hasBin: true
+
+ number-allocator@1.0.14:
+ resolution: {integrity: sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==}
+
+ parse-node-version@1.0.1:
+ resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==}
+ engines: {node: '>= 0.10'}
+
+ pathe@2.0.3:
+ resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+
+ perfect-debounce@2.1.0:
+ resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==}
+
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+ picomatch@4.0.3:
+ resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
+ engines: {node: '>=12'}
+
+ pify@4.0.1:
+ resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
+ engines: {node: '>=6'}
+
+ pkg-types@1.3.1:
+ resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
+
+ pkg-types@2.3.0:
+ resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==}
+
+ postcss-pxtorem@6.1.0:
+ resolution: {integrity: sha512-ROODSNci9ADal3zUcPHOF/K83TiCgNSPXQFSbwyPHNV8ioHIE4SaC+FPOufd8jsr5jV2uIz29v1Uqy1c4ov42g==}
+ peerDependencies:
+ postcss: ^8.0.0
+
+ postcss@8.5.8:
+ resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ process-nextick-args@2.0.1:
+ resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+
+ process@0.11.10:
+ resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
+ engines: {node: '>= 0.6.0'}
+
+ proxy-from-env@1.1.0:
+ resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+
+ prr@1.0.1:
+ resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
+
+ quansync@0.2.11:
+ resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==}
+
+ readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+
+ readable-stream@4.7.0:
+ resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ readdirp@5.0.0:
+ resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==}
+ engines: {node: '>= 20.19.0'}
+
+ rfdc@1.4.1:
+ resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
+
+ rollup@4.59.0:
+ resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+ sax@1.5.0:
+ resolution: {integrity: sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==}
+ engines: {node: '>=11.0.0'}
+
+ scule@1.3.0:
+ resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==}
+
+ semver@5.7.2:
+ resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
+ hasBin: true
+
+ smart-buffer@4.2.0:
+ resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==}
+ engines: {node: '>= 6.0.0', npm: '>= 3.0.0'}
+
+ socks@2.8.7:
+ resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==}
+ engines: {node: '>= 10.0.0', npm: '>= 3.0.0'}
+
+ 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'}
+
+ split2@4.2.0:
+ resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
+ engines: {node: '>= 10.x'}
+
+ string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
+ tinyglobby@0.2.15:
+ resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
+ engines: {node: '>=12.0.0'}
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ typedarray@0.0.6:
+ resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
+
+ ufo@1.6.3:
+ resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==}
+
+ undici-types@7.18.2:
+ resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==}
+
+ unplugin-utils@0.3.1:
+ resolution: {integrity: sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==}
+ engines: {node: '>=20.19.0'}
+
+ unplugin@3.0.0:
+ resolution: {integrity: sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+ vant@4.9.22:
+ resolution: {integrity: sha512-P2PDSj3oB6l3W1OpVlQpapeLmI6bXMSvPqPdrw5rutslC0Y6tSkrVB/iSD57weD7K92GsjGkvgDK0eZlOsXGqw==}
+ peerDependencies:
+ vue: ^3.0.0
+
+ vite@7.3.1:
+ resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^20.19.0 || >=22.12.0
+ jiti: '>=1.21.0'
+ less: ^4.0.0
+ lightningcss: ^1.21.0
+ sass: ^1.70.0
+ sass-embedded: ^1.70.0
+ stylus: '>=0.54.8'
+ sugarss: ^5.0.0
+ terser: ^5.16.0
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ jiti:
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+
+ vue-router@5.0.3:
+ resolution: {integrity: sha512-nG1c7aAFac7NYj8Hluo68WyWfc41xkEjaR0ViLHCa3oDvTQ/nIuLJlXJX1NUPw/DXzx/8+OKMng045HHQKQKWw==}
+ peerDependencies:
+ '@pinia/colada': '>=0.21.2'
+ '@vue/compiler-sfc': ^3.5.17
+ pinia: ^3.0.4
+ vue: ^3.5.0
+ peerDependenciesMeta:
+ '@pinia/colada':
+ optional: true
+ '@vue/compiler-sfc':
+ optional: true
+ pinia:
+ optional: true
+
+ vue@3.5.30:
+ resolution: {integrity: sha512-hTHLc6VNZyzzEH/l7PFGjpcTvUgiaPK5mdLkbjrTeWSRcEfxFrv56g/XckIYlE9ckuobsdwqd5mk2g1sBkMewg==}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ webpack-virtual-modules@0.6.2:
+ resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
+
+ worker-factory@7.0.48:
+ resolution: {integrity: sha512-CGmBy3tJvpBPjUvb0t4PrpKubUsfkI1Ohg0/GGFU2RvA9j/tiVYwKU8O7yu7gH06YtzbeJLzdUR29lmZKn5pag==}
+
+ worker-timers-broker@8.0.15:
+ resolution: {integrity: sha512-Te+EiVUMzG5TtHdmaBZvBrZSFNauym6ImDaCAnzQUxvjnw+oGjMT2idmAOgDy30vOZMLejd0bcsc90Axu6XPWA==}
+
+ worker-timers-worker@9.0.13:
+ resolution: {integrity: sha512-qjn18szGb1kjcmh2traAdki1eiIS5ikFo+L90nfMOvSRpuDw1hAcR1nzkP2+Hkdqz5thIRnfuWx7QSpsEUsA6Q==}
+
+ worker-timers@8.0.30:
+ resolution: {integrity: sha512-8P7YoMHWN0Tz7mg+9oEhuZdjBIn2z6gfjlJqFcHiDd9no/oLnMGCARCDkV1LR3ccQus62ZdtIp7t3aTKrMLHOg==}
+
+ ws@8.19.0:
+ resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==}
+ 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
+
+ yaml@2.8.2:
+ resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==}
+ engines: {node: '>= 14.6'}
+ hasBin: true
+
+snapshots:
+
+ '@babel/generator@7.29.1':
+ dependencies:
+ '@babel/parser': 7.29.0
+ '@babel/types': 7.29.0
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ jsesc: 3.1.0
+
+ '@babel/helper-string-parser@7.27.1': {}
+
+ '@babel/helper-validator-identifier@7.28.5': {}
+
+ '@babel/parser@7.29.0':
+ dependencies:
+ '@babel/types': 7.29.0
+
+ '@babel/runtime@7.28.6': {}
+
+ '@babel/types@7.29.0':
+ dependencies:
+ '@babel/helper-string-parser': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+
+ '@esbuild/aix-ppc64@0.27.3':
+ optional: true
+
+ '@esbuild/android-arm64@0.27.3':
+ optional: true
+
+ '@esbuild/android-arm@0.27.3':
+ optional: true
+
+ '@esbuild/android-x64@0.27.3':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.27.3':
+ optional: true
+
+ '@esbuild/darwin-x64@0.27.3':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.27.3':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.27.3':
+ optional: true
+
+ '@esbuild/linux-arm64@0.27.3':
+ optional: true
+
+ '@esbuild/linux-arm@0.27.3':
+ optional: true
+
+ '@esbuild/linux-ia32@0.27.3':
+ optional: true
+
+ '@esbuild/linux-loong64@0.27.3':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.27.3':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.27.3':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.27.3':
+ optional: true
+
+ '@esbuild/linux-s390x@0.27.3':
+ optional: true
+
+ '@esbuild/linux-x64@0.27.3':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.27.3':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.27.3':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.27.3':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.27.3':
+ optional: true
+
+ '@esbuild/openharmony-arm64@0.27.3':
+ optional: true
+
+ '@esbuild/sunos-x64@0.27.3':
+ optional: true
+
+ '@esbuild/win32-arm64@0.27.3':
+ optional: true
+
+ '@esbuild/win32-ia32@0.27.3':
+ optional: true
+
+ '@esbuild/win32-x64@0.27.3':
+ optional: true
+
+ '@jridgewell/gen-mapping@0.3.13':
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/remapping@2.3.5':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/sourcemap-codec@1.5.5': {}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ '@rolldown/pluginutils@1.0.0-rc.2': {}
+
+ '@rollup/rollup-android-arm-eabi@4.59.0':
+ optional: true
+
+ '@rollup/rollup-android-arm64@4.59.0':
+ optional: true
+
+ '@rollup/rollup-darwin-arm64@4.59.0':
+ optional: true
+
+ '@rollup/rollup-darwin-x64@4.59.0':
+ optional: true
+
+ '@rollup/rollup-freebsd-arm64@4.59.0':
+ optional: true
+
+ '@rollup/rollup-freebsd-x64@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-arm-musleabihf@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-gnu@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-musl@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-loong64-gnu@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-loong64-musl@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-ppc64-gnu@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-ppc64-musl@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-gnu@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-musl@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-s390x-gnu@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-x64-gnu@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-x64-musl@4.59.0':
+ optional: true
+
+ '@rollup/rollup-openbsd-x64@4.59.0':
+ optional: true
+
+ '@rollup/rollup-openharmony-arm64@4.59.0':
+ optional: true
+
+ '@rollup/rollup-win32-arm64-msvc@4.59.0':
+ optional: true
+
+ '@rollup/rollup-win32-ia32-msvc@4.59.0':
+ optional: true
+
+ '@rollup/rollup-win32-x64-gnu@4.59.0':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.59.0':
+ optional: true
+
+ '@supabase/auth-js@2.99.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@supabase/functions-js@2.99.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@supabase/postgrest-js@2.99.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@supabase/realtime-js@2.99.0':
+ dependencies:
+ '@types/phoenix': 1.6.7
+ '@types/ws': 8.18.1
+ tslib: 2.8.1
+ ws: 8.19.0
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+
+ '@supabase/storage-js@2.99.0':
+ dependencies:
+ iceberg-js: 0.8.1
+ tslib: 2.8.1
+
+ '@supabase/supabase-js@2.99.0':
+ dependencies:
+ '@supabase/auth-js': 2.99.0
+ '@supabase/functions-js': 2.99.0
+ '@supabase/postgrest-js': 2.99.0
+ '@supabase/realtime-js': 2.99.0
+ '@supabase/storage-js': 2.99.0
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+
+ '@types/estree@1.0.8': {}
+
+ '@types/node@25.4.0':
+ dependencies:
+ undici-types: 7.18.2
+
+ '@types/phoenix@1.6.7': {}
+
+ '@types/readable-stream@4.0.23':
+ dependencies:
+ '@types/node': 25.4.0
+
+ '@types/ws@8.18.1':
+ dependencies:
+ '@types/node': 25.4.0
+
+ '@vant/popperjs@1.3.0': {}
+
+ '@vant/use@1.6.0(vue@3.5.30)':
+ dependencies:
+ vue: 3.5.30
+
+ '@vitejs/plugin-vue@6.0.4(vite@7.3.1(@types/node@25.4.0)(less@4.6.2)(yaml@2.8.2))(vue@3.5.30)':
+ dependencies:
+ '@rolldown/pluginutils': 1.0.0-rc.2
+ vite: 7.3.1(@types/node@25.4.0)(less@4.6.2)(yaml@2.8.2)
+ vue: 3.5.30
+
+ '@vue-macros/common@3.1.2(vue@3.5.30)':
+ dependencies:
+ '@vue/compiler-sfc': 3.5.30
+ ast-kit: 2.2.0
+ local-pkg: 1.1.2
+ magic-string-ast: 1.0.3
+ unplugin-utils: 0.3.1
+ optionalDependencies:
+ vue: 3.5.30
+
+ '@vue/compiler-core@3.5.30':
+ dependencies:
+ '@babel/parser': 7.29.0
+ '@vue/shared': 3.5.30
+ entities: 7.0.1
+ estree-walker: 2.0.2
+ source-map-js: 1.2.1
+
+ '@vue/compiler-dom@3.5.30':
+ dependencies:
+ '@vue/compiler-core': 3.5.30
+ '@vue/shared': 3.5.30
+
+ '@vue/compiler-sfc@3.5.30':
+ dependencies:
+ '@babel/parser': 7.29.0
+ '@vue/compiler-core': 3.5.30
+ '@vue/compiler-dom': 3.5.30
+ '@vue/compiler-ssr': 3.5.30
+ '@vue/shared': 3.5.30
+ estree-walker: 2.0.2
+ magic-string: 0.30.21
+ postcss: 8.5.8
+ source-map-js: 1.2.1
+
+ '@vue/compiler-ssr@3.5.30':
+ dependencies:
+ '@vue/compiler-dom': 3.5.30
+ '@vue/shared': 3.5.30
+
+ '@vue/devtools-api@8.0.7':
+ dependencies:
+ '@vue/devtools-kit': 8.0.7
+
+ '@vue/devtools-kit@8.0.7':
+ dependencies:
+ '@vue/devtools-shared': 8.0.7
+ birpc: 2.9.0
+ hookable: 5.5.3
+ perfect-debounce: 2.1.0
+
+ '@vue/devtools-shared@8.0.7': {}
+
+ '@vue/reactivity@3.5.30':
+ dependencies:
+ '@vue/shared': 3.5.30
+
+ '@vue/runtime-core@3.5.30':
+ dependencies:
+ '@vue/reactivity': 3.5.30
+ '@vue/shared': 3.5.30
+
+ '@vue/runtime-dom@3.5.30':
+ dependencies:
+ '@vue/reactivity': 3.5.30
+ '@vue/runtime-core': 3.5.30
+ '@vue/shared': 3.5.30
+ csstype: 3.2.3
+
+ '@vue/server-renderer@3.5.30(vue@3.5.30)':
+ dependencies:
+ '@vue/compiler-ssr': 3.5.30
+ '@vue/shared': 3.5.30
+ vue: 3.5.30
+
+ '@vue/shared@3.5.30': {}
+
+ abort-controller@3.0.0:
+ dependencies:
+ event-target-shim: 5.0.1
+
+ acorn@8.16.0: {}
+
+ amfe-flexible@2.2.1: {}
+
+ animate.css@4.1.1: {}
+
+ ast-kit@2.2.0:
+ dependencies:
+ '@babel/parser': 7.29.0
+ pathe: 2.0.3
+
+ ast-walker-scope@0.8.3:
+ dependencies:
+ '@babel/parser': 7.29.0
+ ast-kit: 2.2.0
+
+ asynckit@0.4.0: {}
+
+ axios@1.13.6:
+ dependencies:
+ follow-redirects: 1.15.11
+ form-data: 4.0.5
+ proxy-from-env: 1.1.0
+ transitivePeerDependencies:
+ - debug
+
+ base64-js@1.5.1: {}
+
+ birpc@2.9.0: {}
+
+ bl@6.1.6:
+ dependencies:
+ '@types/readable-stream': 4.0.23
+ buffer: 6.0.3
+ inherits: 2.0.4
+ readable-stream: 4.7.0
+
+ broker-factory@3.1.13:
+ dependencies:
+ '@babel/runtime': 7.28.6
+ fast-unique-numbers: 9.0.26
+ tslib: 2.8.1
+ worker-factory: 7.0.48
+
+ buffer-from@1.1.2: {}
+
+ 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
+
+ chokidar@5.0.0:
+ dependencies:
+ readdirp: 5.0.0
+
+ combined-stream@1.0.8:
+ dependencies:
+ delayed-stream: 1.0.0
+
+ commist@3.2.0: {}
+
+ concat-stream@2.0.0:
+ dependencies:
+ buffer-from: 1.1.2
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+ typedarray: 0.0.6
+
+ confbox@0.1.8: {}
+
+ confbox@0.2.4: {}
+
+ copy-anything@3.0.5:
+ dependencies:
+ is-what: 4.1.16
+
+ csstype@3.2.3: {}
+
+ debug@4.4.3:
+ dependencies:
+ ms: 2.1.3
+
+ delayed-stream@1.0.0: {}
+
+ dunder-proto@1.0.1:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ entities@7.0.1: {}
+
+ errno@0.1.8:
+ dependencies:
+ prr: 1.0.1
+ optional: true
+
+ 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.27.3:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.27.3
+ '@esbuild/android-arm': 0.27.3
+ '@esbuild/android-arm64': 0.27.3
+ '@esbuild/android-x64': 0.27.3
+ '@esbuild/darwin-arm64': 0.27.3
+ '@esbuild/darwin-x64': 0.27.3
+ '@esbuild/freebsd-arm64': 0.27.3
+ '@esbuild/freebsd-x64': 0.27.3
+ '@esbuild/linux-arm': 0.27.3
+ '@esbuild/linux-arm64': 0.27.3
+ '@esbuild/linux-ia32': 0.27.3
+ '@esbuild/linux-loong64': 0.27.3
+ '@esbuild/linux-mips64el': 0.27.3
+ '@esbuild/linux-ppc64': 0.27.3
+ '@esbuild/linux-riscv64': 0.27.3
+ '@esbuild/linux-s390x': 0.27.3
+ '@esbuild/linux-x64': 0.27.3
+ '@esbuild/netbsd-arm64': 0.27.3
+ '@esbuild/netbsd-x64': 0.27.3
+ '@esbuild/openbsd-arm64': 0.27.3
+ '@esbuild/openbsd-x64': 0.27.3
+ '@esbuild/openharmony-arm64': 0.27.3
+ '@esbuild/sunos-x64': 0.27.3
+ '@esbuild/win32-arm64': 0.27.3
+ '@esbuild/win32-ia32': 0.27.3
+ '@esbuild/win32-x64': 0.27.3
+
+ estree-walker@2.0.2: {}
+
+ event-target-shim@5.0.1: {}
+
+ events@3.3.0: {}
+
+ exsolve@1.0.8: {}
+
+ fast-unique-numbers@9.0.26:
+ dependencies:
+ '@babel/runtime': 7.28.6
+ tslib: 2.8.1
+
+ fdir@6.5.0(picomatch@4.0.3):
+ optionalDependencies:
+ picomatch: 4.0.3
+
+ follow-redirects@1.15.11: {}
+
+ form-data@4.0.5:
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ es-set-tostringtag: 2.1.0
+ hasown: 2.0.2
+ mime-types: 2.1.35
+
+ fsevents@2.3.3:
+ optional: true
+
+ function-bind@1.1.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-proto@1.0.1:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.1
+
+ gopd@1.2.0: {}
+
+ graceful-fs@4.2.11:
+ optional: true
+
+ 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
+
+ help-me@5.0.0: {}
+
+ hookable@5.5.3: {}
+
+ iceberg-js@0.8.1: {}
+
+ iconv-lite@0.6.3:
+ dependencies:
+ safer-buffer: 2.1.2
+ optional: true
+
+ ieee754@1.2.1: {}
+
+ image-size@0.5.5:
+ optional: true
+
+ inherits@2.0.4: {}
+
+ ip-address@10.1.0: {}
+
+ is-what@4.1.16: {}
+
+ js-sdsl@4.3.0: {}
+
+ jsesc@3.1.0: {}
+
+ json5@2.2.3: {}
+
+ less@4.6.2:
+ dependencies:
+ copy-anything: 3.0.5
+ parse-node-version: 1.0.1
+ optionalDependencies:
+ errno: 0.1.8
+ graceful-fs: 4.2.11
+ image-size: 0.5.5
+ make-dir: 2.1.0
+ mime: 1.6.0
+ needle: 3.3.1
+ source-map: 0.6.1
+
+ local-pkg@1.1.2:
+ dependencies:
+ mlly: 1.8.1
+ pkg-types: 2.3.0
+ quansync: 0.2.11
+
+ lru-cache@10.4.3: {}
+
+ magic-string-ast@1.0.3:
+ dependencies:
+ magic-string: 0.30.21
+
+ magic-string@0.30.21:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ make-dir@2.1.0:
+ dependencies:
+ pify: 4.0.1
+ semver: 5.7.2
+ optional: true
+
+ marked@17.0.4: {}
+
+ math-intrinsics@1.1.0: {}
+
+ mime-db@1.52.0: {}
+
+ mime-types@2.1.35:
+ dependencies:
+ mime-db: 1.52.0
+
+ mime@1.6.0:
+ optional: true
+
+ minimist@1.2.8: {}
+
+ mitt@3.0.1: {}
+
+ mlly@1.8.1:
+ dependencies:
+ acorn: 8.16.0
+ pathe: 2.0.3
+ pkg-types: 1.3.1
+ ufo: 1.6.3
+
+ mqtt-packet@9.0.2:
+ dependencies:
+ bl: 6.1.6
+ debug: 4.4.3
+ process-nextick-args: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ mqtt@5.15.0:
+ dependencies:
+ '@types/readable-stream': 4.0.23
+ '@types/ws': 8.18.1
+ commist: 3.2.0
+ concat-stream: 2.0.0
+ debug: 4.4.3
+ help-me: 5.0.0
+ lru-cache: 10.4.3
+ minimist: 1.2.8
+ mqtt-packet: 9.0.2
+ number-allocator: 1.0.14
+ readable-stream: 4.7.0
+ rfdc: 1.4.1
+ socks: 2.8.7
+ split2: 4.2.0
+ worker-timers: 8.0.30
+ ws: 8.19.0
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
+ ms@2.1.3: {}
+
+ muggle-string@0.4.1: {}
+
+ nanoid@3.3.11: {}
+
+ needle@3.3.1:
+ dependencies:
+ iconv-lite: 0.6.3
+ sax: 1.5.0
+ optional: true
+
+ number-allocator@1.0.14:
+ dependencies:
+ debug: 4.4.3
+ js-sdsl: 4.3.0
+ transitivePeerDependencies:
+ - supports-color
+
+ parse-node-version@1.0.1: {}
+
+ pathe@2.0.3: {}
+
+ perfect-debounce@2.1.0: {}
+
+ picocolors@1.1.1: {}
+
+ picomatch@4.0.3: {}
+
+ pify@4.0.1:
+ optional: true
+
+ pkg-types@1.3.1:
+ dependencies:
+ confbox: 0.1.8
+ mlly: 1.8.1
+ pathe: 2.0.3
+
+ pkg-types@2.3.0:
+ dependencies:
+ confbox: 0.2.4
+ exsolve: 1.0.8
+ pathe: 2.0.3
+
+ postcss-pxtorem@6.1.0(postcss@8.5.8):
+ dependencies:
+ postcss: 8.5.8
+
+ postcss@8.5.8:
+ dependencies:
+ nanoid: 3.3.11
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ process-nextick-args@2.0.1: {}
+
+ process@0.11.10: {}
+
+ proxy-from-env@1.1.0: {}
+
+ prr@1.0.1:
+ optional: true
+
+ quansync@0.2.11: {}
+
+ readable-stream@3.6.2:
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+
+ readable-stream@4.7.0:
+ dependencies:
+ abort-controller: 3.0.0
+ buffer: 6.0.3
+ events: 3.3.0
+ process: 0.11.10
+ string_decoder: 1.3.0
+
+ readdirp@5.0.0: {}
+
+ rfdc@1.4.1: {}
+
+ rollup@4.59.0:
+ dependencies:
+ '@types/estree': 1.0.8
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.59.0
+ '@rollup/rollup-android-arm64': 4.59.0
+ '@rollup/rollup-darwin-arm64': 4.59.0
+ '@rollup/rollup-darwin-x64': 4.59.0
+ '@rollup/rollup-freebsd-arm64': 4.59.0
+ '@rollup/rollup-freebsd-x64': 4.59.0
+ '@rollup/rollup-linux-arm-gnueabihf': 4.59.0
+ '@rollup/rollup-linux-arm-musleabihf': 4.59.0
+ '@rollup/rollup-linux-arm64-gnu': 4.59.0
+ '@rollup/rollup-linux-arm64-musl': 4.59.0
+ '@rollup/rollup-linux-loong64-gnu': 4.59.0
+ '@rollup/rollup-linux-loong64-musl': 4.59.0
+ '@rollup/rollup-linux-ppc64-gnu': 4.59.0
+ '@rollup/rollup-linux-ppc64-musl': 4.59.0
+ '@rollup/rollup-linux-riscv64-gnu': 4.59.0
+ '@rollup/rollup-linux-riscv64-musl': 4.59.0
+ '@rollup/rollup-linux-s390x-gnu': 4.59.0
+ '@rollup/rollup-linux-x64-gnu': 4.59.0
+ '@rollup/rollup-linux-x64-musl': 4.59.0
+ '@rollup/rollup-openbsd-x64': 4.59.0
+ '@rollup/rollup-openharmony-arm64': 4.59.0
+ '@rollup/rollup-win32-arm64-msvc': 4.59.0
+ '@rollup/rollup-win32-ia32-msvc': 4.59.0
+ '@rollup/rollup-win32-x64-gnu': 4.59.0
+ '@rollup/rollup-win32-x64-msvc': 4.59.0
+ fsevents: 2.3.3
+
+ safe-buffer@5.2.1: {}
+
+ safer-buffer@2.1.2:
+ optional: true
+
+ sax@1.5.0:
+ optional: true
+
+ scule@1.3.0: {}
+
+ semver@5.7.2:
+ optional: true
+
+ smart-buffer@4.2.0: {}
+
+ socks@2.8.7:
+ dependencies:
+ ip-address: 10.1.0
+ smart-buffer: 4.2.0
+
+ source-map-js@1.2.1: {}
+
+ source-map@0.6.1:
+ optional: true
+
+ split2@4.2.0: {}
+
+ string_decoder@1.3.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ tinyglobby@0.2.15:
+ dependencies:
+ fdir: 6.5.0(picomatch@4.0.3)
+ picomatch: 4.0.3
+
+ tslib@2.8.1: {}
+
+ typedarray@0.0.6: {}
+
+ ufo@1.6.3: {}
+
+ undici-types@7.18.2: {}
+
+ unplugin-utils@0.3.1:
+ dependencies:
+ pathe: 2.0.3
+ picomatch: 4.0.3
+
+ unplugin@3.0.0:
+ dependencies:
+ '@jridgewell/remapping': 2.3.5
+ picomatch: 4.0.3
+ webpack-virtual-modules: 0.6.2
+
+ util-deprecate@1.0.2: {}
+
+ vant@4.9.22(vue@3.5.30):
+ dependencies:
+ '@vant/popperjs': 1.3.0
+ '@vant/use': 1.6.0(vue@3.5.30)
+ '@vue/shared': 3.5.30
+ vue: 3.5.30
+
+ vite@7.3.1(@types/node@25.4.0)(less@4.6.2)(yaml@2.8.2):
+ dependencies:
+ esbuild: 0.27.3
+ fdir: 6.5.0(picomatch@4.0.3)
+ picomatch: 4.0.3
+ postcss: 8.5.8
+ rollup: 4.59.0
+ tinyglobby: 0.2.15
+ optionalDependencies:
+ '@types/node': 25.4.0
+ fsevents: 2.3.3
+ less: 4.6.2
+ yaml: 2.8.2
+
+ vue-router@5.0.3(@vue/compiler-sfc@3.5.30)(vue@3.5.30):
+ dependencies:
+ '@babel/generator': 7.29.1
+ '@vue-macros/common': 3.1.2(vue@3.5.30)
+ '@vue/devtools-api': 8.0.7
+ ast-walker-scope: 0.8.3
+ chokidar: 5.0.0
+ json5: 2.2.3
+ local-pkg: 1.1.2
+ magic-string: 0.30.21
+ mlly: 1.8.1
+ muggle-string: 0.4.1
+ pathe: 2.0.3
+ picomatch: 4.0.3
+ scule: 1.3.0
+ tinyglobby: 0.2.15
+ unplugin: 3.0.0
+ unplugin-utils: 0.3.1
+ vue: 3.5.30
+ yaml: 2.8.2
+ optionalDependencies:
+ '@vue/compiler-sfc': 3.5.30
+
+ vue@3.5.30:
+ dependencies:
+ '@vue/compiler-dom': 3.5.30
+ '@vue/compiler-sfc': 3.5.30
+ '@vue/runtime-dom': 3.5.30
+ '@vue/server-renderer': 3.5.30(vue@3.5.30)
+ '@vue/shared': 3.5.30
+
+ webpack-virtual-modules@0.6.2: {}
+
+ worker-factory@7.0.48:
+ dependencies:
+ '@babel/runtime': 7.28.6
+ fast-unique-numbers: 9.0.26
+ tslib: 2.8.1
+
+ worker-timers-broker@8.0.15:
+ dependencies:
+ '@babel/runtime': 7.28.6
+ broker-factory: 3.1.13
+ fast-unique-numbers: 9.0.26
+ tslib: 2.8.1
+ worker-timers-worker: 9.0.13
+
+ worker-timers-worker@9.0.13:
+ dependencies:
+ '@babel/runtime': 7.28.6
+ tslib: 2.8.1
+ worker-factory: 7.0.48
+
+ worker-timers@8.0.30:
+ dependencies:
+ '@babel/runtime': 7.28.6
+ tslib: 2.8.1
+ worker-timers-broker: 8.0.15
+ worker-timers-worker: 9.0.13
+
+ ws@8.19.0: {}
+
+ yaml@2.8.2: {}
diff --git a/public/markdown/README.md b/public/markdown/README.md
new file mode 100644
index 0000000..3e1da5c
--- /dev/null
+++ b/public/markdown/README.md
@@ -0,0 +1,36 @@
+# Markdown 内容目录
+
+## 目录结构
+
+```
+public/markdown/
+├── course/ # 课程配套文章
+│ ├── 1/ # 课程 ID
+│ │ ├── 1.md # 章节 ID
+│ │ ├── 2.md
+│ │ └── 3.md
+│ └── 2/
+│ ├── 1.md
+│ └── 2.md
+└── ebook/ # 电子书章节
+ ├── 1/
+ │ ├── 1.md
+ │ ├── 2.md
+ │ └── 3.md
+ └── 2/
+ ├── 1.md
+ └── 2.md
+```
+
+## 引用方式
+
+**数据库 / mock 中的 `article_markdown` 或 `content` 字段:**
+
+| 格式 | 说明 |
+|------|------|
+| `@file:course/1/1` | 加载 `/markdown/course/1/1.md` |
+| `@file:ebook/2/3` | 加载 `/markdown/ebook/2/3.md` |
+| `# 标题\n\n内容...` | 直接使用字符串 Markdown |
+
+- 文件路径:`@file:{type}/{id}/{chapterId}`,扩展名 `.md` 可省略
+- 字符串:非 `@file:` 开头的任意 Markdown 文本
diff --git a/public/markdown/course/1/1.md b/public/markdown/course/1/1.md
new file mode 100644
index 0000000..9ab8162
--- /dev/null
+++ b/public/markdown/course/1/1.md
@@ -0,0 +1,22 @@
+# 项目初始化
+
+## 本节要点
+
+- 使用 Vite 创建项目
+- 配置基础依赖
+- 目录结构说明
+
+## 核心命令
+
+```bash
+npm create vite@latest my-app -- --template vue
+cd my-app && npm install
+```
+
+## 目录说明
+
+| 目录 | 说明 |
+|------|------|
+| src | 源码目录 |
+| public | 静态资源 |
+| dist | 构建输出 |
diff --git a/public/markdown/course/2/1.md b/public/markdown/course/2/1.md
new file mode 100644
index 0000000..a311672
--- /dev/null
+++ b/public/markdown/course/2/1.md
@@ -0,0 +1,9 @@
+# 类型进阶
+
+## 泛型基础
+
+```ts
+function identity(arg: T): T {
+ return arg
+}
+```
diff --git a/public/markdown/ebook/1/1.md b/public/markdown/ebook/1/1.md
new file mode 100644
index 0000000..a3ba80a
--- /dev/null
+++ b/public/markdown/ebook/1/1.md
@@ -0,0 +1,13 @@
+# 环境搭建
+
+## 安装 Node.js
+
+请确保已安装 Node.js 18+。
+
+```bash
+node -v
+```
+
+## 创建项目
+
+使用 Vite 创建 Vue 3 项目。
diff --git a/public/markdown/ebook/2/1.md b/public/markdown/ebook/2/1.md
new file mode 100644
index 0000000..ac77f59
--- /dev/null
+++ b/public/markdown/ebook/2/1.md
@@ -0,0 +1,3 @@
+# Vite
+
+下一代前端构建工具。
diff --git a/public/robots.txt b/public/robots.txt
new file mode 100644
index 0000000..c04f075
--- /dev/null
+++ b/public/robots.txt
@@ -0,0 +1,5 @@
+User-agent: *
+Allow: /
+Disallow: /login
+Disallow: /vip
+Disallow: /paid
diff --git a/src/App.vue b/src/App.vue
new file mode 100644
index 0000000..72e9e89
--- /dev/null
+++ b/src/App.vue
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/api/payment.js b/src/api/payment.js
new file mode 100644
index 0000000..4c80cc0
--- /dev/null
+++ b/src/api/payment.js
@@ -0,0 +1,204 @@
+import axios from 'axios'
+import { getPaymentApiUrl, PAYMENT_CONFIG, getPlanAmount } from '@/config/payment.js'
+import { getPayEnv, getDeviceFromEnv } from '@/composables/usePayEnv.js'
+
+const API = axios.create({
+ baseURL: getPaymentApiUrl().replace(/\/$/, ''),
+ timeout: 20000,
+ headers: { 'Content-Type': 'application/json' },
+})
+
+export const PAY_PREFIX = '/wxh5'
+
+const SUCCESS_STATES = new Set([
+ 'paid',
+ 'success',
+ 'succeeded',
+ 'completed',
+ 'complete',
+ 'finished',
+ 'trade_success',
+ 'payment_success',
+ 'pay_success',
+ 'successed',
+])
+
+const FAIL_STATES = new Set([
+ 'failed',
+ 'fail',
+ 'closed',
+ 'cancel',
+ 'cancelled',
+ 'canceled',
+ 'expired',
+ 'timeout',
+ 'aborted',
+])
+
+const PENDING_STATES = new Set([
+ 'pending',
+ 'processing',
+ 'created',
+ 'unpaid',
+ 'notpaid',
+ 'waiting',
+ 'paying',
+])
+
+function normalizeState(value) {
+ return String(value || '')
+ .trim()
+ .toLowerCase()
+ .replace(/[\s-]+/g, '_')
+}
+
+function pickStatusPayload(data) {
+ if (!data || typeof data !== 'object') return {}
+ return data.data && typeof data.data === 'object'
+ ? { ...data, ...data.data }
+ : data
+}
+
+function parsePaidFromPayload(payload) {
+ const data = pickStatusPayload(payload)
+ const booleanCandidates = [
+ data.paid,
+ data.is_paid,
+ data.success,
+ data.trade_success,
+ data.payment_success,
+ ]
+
+ if (booleanCandidates.some((item) => item === true)) {
+ return { paid: true, failed: false, statusText: 'paid', raw: data }
+ }
+
+ if (data.paid_at || data.pay_time || data.payment_time || data.success_time) {
+ return { paid: true, failed: false, statusText: 'paid', raw: data }
+ }
+
+ const stateCandidates = [
+ data.status,
+ data.order_status,
+ data.pay_status,
+ data.trade_state,
+ data.tradeStatus,
+ data.state,
+ data.result,
+ ]
+ .map(normalizeState)
+ .filter(Boolean)
+
+ if (stateCandidates.some((state) => SUCCESS_STATES.has(state))) {
+ return { paid: true, failed: false, statusText: stateCandidates[0] || 'paid', raw: data }
+ }
+ if (stateCandidates.some((state) => FAIL_STATES.has(state))) {
+ return { paid: false, failed: true, statusText: stateCandidates[0] || 'failed', raw: data }
+ }
+ if (stateCandidates.some((state) => PENDING_STATES.has(state))) {
+ return { paid: false, failed: false, statusText: stateCandidates[0] || 'pending', raw: data }
+ }
+
+ return { paid: false, failed: false, statusText: stateCandidates[0] || '', raw: data }
+}
+
+export async function createPayOrder({ userId, plan = 'year', returnUrl, channel = 'wxpay', provider }) {
+ const device = getDeviceFromEnv(getPayEnv())
+ const env = getPayEnv()
+ const totalFee = getPlanAmount(plan)
+ const finalProvider = env === 'wechat' ? PAYMENT_CONFIG.wechatProvider : (provider || 'zpay')
+
+ const payload = {
+ user_id: userId,
+ total_fee: totalFee,
+ type: 'vip',
+ plan,
+ channel,
+ return_url: returnUrl,
+ device,
+ provider: finalProvider,
+ }
+
+ const { data } = await API.post(`${PAY_PREFIX}/payh5`, payload)
+ if (data?.status !== 'ok') {
+ throw new Error(data?.detail || data?.msg || '创建订单失败')
+ }
+
+ const orderId = data.order_id || data.params?.order_id || data.params?.out_trade_no || ''
+ return {
+ ok: true,
+ params: data.xorpay_params || data.params,
+ payUrl: data.xorpay_url || data.pay_url,
+ order_id: orderId,
+ provider: data.provider || finalProvider,
+ }
+}
+
+export async function createPayRedirect({ userId, plan = 'year', returnUrl, channel = 'wxpay' }) {
+ const device = getDeviceFromEnv(getPayEnv())
+ const totalFee = getPlanAmount(plan)
+
+ const payload = {
+ user_id: userId,
+ total_fee: totalFee,
+ type: 'vip',
+ plan,
+ channel,
+ return_url: returnUrl,
+ device,
+ provider: 'zpay',
+ prefer_json: '1',
+ }
+
+ const baseUrl = getPaymentApiUrl().replace(/\/$/, '')
+ const res = await fetch(`${baseUrl}${PAY_PREFIX}/payh5/redirect`, {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(payload),
+ })
+
+ const data = await res.json().catch(() => ({}))
+ if (data?.redirect_url) {
+ return { ok: true, redirect_url: data.redirect_url, order_id: data.order_id || '', provider: 'zpay' }
+ }
+ if (data?.qrcode_mode && data?.img) {
+ return {
+ ok: true,
+ qrcode_mode: true,
+ order_id: data.order_id,
+ img: data.img,
+ return_url: data.return_url || returnUrl,
+ channel: data.channel || channel,
+ provider: 'zpay',
+ }
+ }
+ if (data?.use_form) {
+ return { ok: true, use_form: true, order_id: data.order_id, provider: 'zpay' }
+ }
+
+ throw new Error(data?.detail || data?.msg || '支付跳转失败')
+}
+
+export async function queryOrderStatus(orderId) {
+ const { data } = await API.get(`${PAY_PREFIX}/order_status`, {
+ params: { order_id: orderId },
+ })
+ return {
+ ok: true,
+ orderId,
+ ...parsePaidFromPayload(data),
+ }
+}
+
+export async function queryPurchaseAccount({ orderId, providerTradeNo, userId }) {
+ const params = {}
+ if (orderId) params.order_id = orderId
+ if (providerTradeNo) params.provider_trade_no = providerTradeNo
+ if (userId) params.user_id = userId
+
+ const { data } = await API.get(`${PAY_PREFIX}/account_lookup`, { params })
+ return {
+ ok: true,
+ data: data?.data || {},
+ }
+}
diff --git a/src/components/AppHeader.vue b/src/components/AppHeader.vue
new file mode 100644
index 0000000..326dacd
--- /dev/null
+++ b/src/components/AppHeader.vue
@@ -0,0 +1,361 @@
+
+
+
+
+
+
+
diff --git a/src/components/MarkdownViewer.vue b/src/components/MarkdownViewer.vue
new file mode 100644
index 0000000..cc9612a
--- /dev/null
+++ b/src/components/MarkdownViewer.vue
@@ -0,0 +1,538 @@
+
+
+
+
+
加载中...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 目录
+
+ {{ item.text }}
+
+
+
+
+
+
+
+
+
diff --git a/src/components/PayQrModal.vue b/src/components/PayQrModal.vue
new file mode 100644
index 0000000..952391d
--- /dev/null
+++ b/src/components/PayQrModal.vue
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+
+
+
+
+
+ 二维码加载中...
+
+
+
+
+
+ 支付完成后将自动跳转,请勿关闭此页面
+
+
+ 稍后支付
+
+
+
+
+
+
+
+
diff --git a/src/components/VipGate.vue b/src/components/VipGate.vue
new file mode 100644
index 0000000..6435cc8
--- /dev/null
+++ b/src/components/VipGate.vue
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
{{ gateCopy.title }}
+
{{ gateCopy.description }}
+
+
+
+ {{ gateCopy.actionText }}
+
+
+
+
+ 去登录
+
+ 稍后再看
+
+
+
+
+
+
+
+
+
diff --git a/src/components/layout/ContentCard.vue b/src/components/layout/ContentCard.vue
new file mode 100644
index 0000000..7d42a41
--- /dev/null
+++ b/src/components/layout/ContentCard.vue
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/layout/PageLayout.vue b/src/components/layout/PageLayout.vue
new file mode 100644
index 0000000..bbfd55d
--- /dev/null
+++ b/src/components/layout/PageLayout.vue
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/layout/SectionCard.vue b/src/components/layout/SectionCard.vue
new file mode 100644
index 0000000..921575e
--- /dev/null
+++ b/src/components/layout/SectionCard.vue
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
diff --git a/src/components/layout/index.js b/src/components/layout/index.js
new file mode 100644
index 0000000..b8b5d5a
--- /dev/null
+++ b/src/components/layout/index.js
@@ -0,0 +1,3 @@
+export { default as PageLayout } from './PageLayout.vue'
+export { default as SectionCard } from './SectionCard.vue'
+export { default as ContentCard } from './ContentCard.vue'
diff --git a/src/composables/useAuth.js b/src/composables/useAuth.js
new file mode 100644
index 0000000..dbc12d5
--- /dev/null
+++ b/src/composables/useAuth.js
@@ -0,0 +1,98 @@
+import { computed, onMounted, ref } from 'vue'
+import { supabase } from '@/supabase.js'
+
+const user = ref(null)
+const isSvip = ref(false)
+const authReady = ref(false)
+const isVip = computed(() => !!user.value)
+let authInitPromise = null
+let authListenerBound = false
+
+async function checkSvip(userId) {
+ if (!userId) return false
+
+ const { data } = await supabase
+ .from('wxgzh_vip_users')
+ .select('expire_at')
+ .eq('user_id', userId)
+ .single()
+
+ if (!data) return false
+ return new Date(data.expire_at) > new Date()
+}
+
+async function syncUserState(nextUser) {
+ user.value = nextUser ?? null
+
+ if (nextUser) {
+ isSvip.value = await checkSvip(nextUser.id)
+ } else {
+ isSvip.value = false
+ }
+}
+
+async function initAuth() {
+ if (!authInitPromise) {
+ authInitPromise = (async () => {
+ try {
+ const { data } = await supabase.auth.getUser()
+ await syncUserState(data?.user ?? null)
+
+ if (!authListenerBound) {
+ authListenerBound = true
+ supabase.auth.onAuthStateChange(async (_event, session) => {
+ await syncUserState(session?.user ?? null)
+ authReady.value = true
+ })
+ }
+ } catch {
+ await syncUserState(null)
+ } finally {
+ authReady.value = true
+ }
+ })()
+ }
+
+ return authInitPromise
+}
+
+export function useAuth() {
+ onMounted(() => {
+ void initAuth()
+ })
+
+ const clearUser = () => {
+ user.value = null
+ isSvip.value = false
+ }
+
+ const refreshMembership = async () => {
+ if (user.value) {
+ isSvip.value = await checkSvip(user.value.id)
+ } else {
+ isSvip.value = false
+ }
+ }
+
+ const logout = async () => {
+ clearUser()
+ await supabase.auth.signOut()
+ }
+
+ const ensureAuthReady = async () => {
+ await initAuth()
+ return user.value
+ }
+
+ return {
+ user,
+ isVip,
+ isSvip,
+ isLoggedIn: isVip,
+ authReady,
+ ensureAuthReady,
+ logout,
+ clearUser,
+ refreshMembership,
+ }
+}
diff --git a/src/composables/useDarkMode.js b/src/composables/useDarkMode.js
new file mode 100644
index 0000000..92ac5cd
--- /dev/null
+++ b/src/composables/useDarkMode.js
@@ -0,0 +1,34 @@
+import { ref, watch, onMounted } from 'vue'
+
+const DARK_MODE_KEY = 'wxh5-dark-mode'
+
+export function useDarkMode() {
+ const isDark = ref(false)
+
+ const applyTheme = (dark) => {
+ if (dark) {
+ document.documentElement.classList.add('dark')
+ document.documentElement.setAttribute('data-theme', 'dark')
+ } else {
+ document.documentElement.classList.remove('dark')
+ document.documentElement.setAttribute('data-theme', 'light')
+ }
+ }
+
+ const toggleDarkMode = () => {
+ isDark.value = !isDark.value
+ localStorage.setItem(DARK_MODE_KEY, isDark.value ? '1' : '0')
+ applyTheme(isDark.value)
+ }
+
+ onMounted(() => {
+ const saved = localStorage.getItem(DARK_MODE_KEY)
+ const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches
+ isDark.value = saved !== null ? saved === '1' : prefersDark
+ applyTheme(isDark.value)
+ })
+
+ watch(isDark, applyTheme)
+
+ return { isDark, toggleDarkMode }
+}
diff --git a/src/composables/useKnowledge.js b/src/composables/useKnowledge.js
new file mode 100644
index 0000000..d3cd477
--- /dev/null
+++ b/src/composables/useKnowledge.js
@@ -0,0 +1,37 @@
+import {
+ mockCourses,
+ mockCourseChapters,
+ mockEbooks,
+ mockEbookChapters,
+} from '@/data/mockData.js'
+
+export async function fetchEbooks() {
+ return [...mockEbooks]
+}
+
+export async function fetchEbookChapters(ebookId) {
+ return [...(mockEbookChapters[ebookId] || [])]
+}
+
+export async function fetchCourses() {
+ return [...mockCourses]
+}
+
+export async function fetchCourseChapters(courseId) {
+ return [...(mockCourseChapters[courseId] || [])]
+}
+
+export async function fetchEbookChapter(ebookId, chapterId) {
+ const chapters = mockEbookChapters[ebookId] || []
+ return chapters.find((item) => String(item.id) === String(chapterId)) || null
+}
+
+export async function fetchCourseChapter(courseId, chapterId) {
+ const chapters = mockCourseChapters[courseId] || []
+ return chapters.find((item) => String(item.id) === String(chapterId)) || null
+}
+
+export async function fetchCourse(courseId) {
+ const list = await fetchCourses()
+ return list.find((item) => String(item.id) === String(courseId)) || null
+}
diff --git a/src/composables/usePageRobots.js b/src/composables/usePageRobots.js
new file mode 100644
index 0000000..23b7340
--- /dev/null
+++ b/src/composables/usePageRobots.js
@@ -0,0 +1,17 @@
+import { onBeforeUnmount, unref, watch } from 'vue'
+import { DEFAULT_ROBOTS_CONTENT, setRobotsMeta } from '@/utils/seo.js'
+
+export function usePageRobots(contentSource) {
+ const stop = watch(
+ () => unref(contentSource) || DEFAULT_ROBOTS_CONTENT,
+ (content) => {
+ setRobotsMeta(content)
+ },
+ { immediate: true }
+ )
+
+ onBeforeUnmount(() => {
+ stop()
+ setRobotsMeta(DEFAULT_ROBOTS_CONTENT)
+ })
+}
diff --git a/src/composables/usePay.js b/src/composables/usePay.js
new file mode 100644
index 0000000..fe18b3c
--- /dev/null
+++ b/src/composables/usePay.js
@@ -0,0 +1,187 @@
+import { ref } from 'vue'
+import { closeToast, showToast } from 'vant'
+import { PAYMENT_CONFIG } from '@/config/payment.js'
+import { getPayEnv, getDeviceFromEnv } from '@/composables/usePayEnv.js'
+import { createPayOrder, createPayRedirect, queryOrderStatus } from '@/api/payment.js'
+import { createPaymentState, savePaymentState, updatePaymentState } from '@/utils/purchaseAccount.js'
+
+const POLL_INTERVAL = 1000
+const MAX_POLLS = 300
+const COOKIE_NAME = 'wxh5_pay_order'
+const COOKIE_MAX_AGE = 900
+
+function setPayOrderCookie(orderId) {
+ if (typeof document === 'undefined') return
+ document.cookie = `${COOKIE_NAME}=${encodeURIComponent(`${orderId}|${Date.now()}`)}; path=/; max-age=${COOKIE_MAX_AGE}`
+}
+
+function submitPayForm(payUrl, params, target = '_self') {
+ const form = document.createElement('form')
+ form.method = 'POST'
+ form.action = payUrl
+ form.target = target
+ form.style.display = 'none'
+
+ for (const [key, value] of Object.entries(params || {})) {
+ if (value == null) continue
+ const input = document.createElement('input')
+ input.type = 'hidden'
+ input.name = key
+ input.value = String(value)
+ form.appendChild(input)
+ }
+
+ document.body.appendChild(form)
+ form.submit()
+ if (target === '_blank') {
+ document.body.removeChild(form)
+ }
+}
+
+export function usePay() {
+ const payPendingOrderId = ref(null)
+ const isPaying = ref(false)
+
+ const doPay = async ({ userId, plan = 'year', returnUrl, onOrderCreated }) => {
+ if (isPaying.value) return null
+ isPaying.value = true
+ closeToast()
+
+ const payEnv = getPayEnv()
+ const device = getDeviceFromEnv(payEnv)
+ const finalReturnUrl = returnUrl || `${window.location.origin}/paid`
+ const channel = 'wxpay'
+
+ const rememberOrder = (orderId, provider) => {
+ if (!orderId) return
+ savePaymentState(createPaymentState({
+ orderId,
+ userId,
+ plan,
+ channel,
+ provider,
+ payEnv,
+ device,
+ returnUrl: finalReturnUrl,
+ sourcePath: `${window.location.pathname}${window.location.search}`,
+ status: 'pending',
+ }))
+ }
+
+ try {
+ if (payEnv === 'wechat') {
+ const res = await createPayOrder({
+ userId,
+ plan,
+ returnUrl: finalReturnUrl,
+ channel,
+ provider: 'xorpay',
+ })
+
+ if (!res.ok || !res.params || !res.payUrl) {
+ throw new Error(res.error || '支付发起失败')
+ }
+
+ payPendingOrderId.value = res.order_id
+ setPayOrderCookie(res.order_id)
+ rememberOrder(res.order_id, res.provider || 'xorpay')
+ onOrderCreated?.(res.order_id)
+ submitPayForm(res.payUrl, res.params, '_self')
+ return res.order_id
+ }
+
+ if (device === 'pc') {
+ const res = await createPayRedirect({
+ userId,
+ plan,
+ returnUrl: finalReturnUrl,
+ channel,
+ })
+
+ if (res.qrcode_mode && res.img) {
+ payPendingOrderId.value = res.order_id
+ setPayOrderCookie(res.order_id)
+ rememberOrder(res.order_id, res.provider || 'zpay')
+ onOrderCreated?.(res.order_id)
+ return {
+ qrcode_mode: true,
+ order_id: res.order_id,
+ img: res.img,
+ return_url: res.return_url,
+ }
+ }
+
+ if (res.redirect_url) {
+ payPendingOrderId.value = res.order_id
+ setPayOrderCookie(res.order_id)
+ rememberOrder(res.order_id, res.provider || 'zpay')
+ onOrderCreated?.(res.order_id)
+ window.open(res.redirect_url, '_blank')
+ return res.order_id
+ }
+ }
+
+ const res = await createPayOrder({
+ userId,
+ plan,
+ returnUrl: finalReturnUrl,
+ channel,
+ provider: 'zpay',
+ })
+
+ if (!res.ok || !res.params) {
+ throw new Error(res.error || '支付发起失败')
+ }
+
+ payPendingOrderId.value = res.order_id
+ setPayOrderCookie(res.order_id)
+ rememberOrder(res.order_id, res.provider || 'zpay')
+ onOrderCreated?.(res.order_id)
+ submitPayForm(res.payUrl || PAYMENT_CONFIG.zpaySubmitUrl, res.params, device === 'h5' ? '_blank' : '_self')
+ return res.order_id
+ } catch (error) {
+ showToast(error?.message || '支付发起失败')
+ return null
+ } finally {
+ isPaying.value = false
+ }
+ }
+
+ const pollPayStatus = (orderId, onPaid, onTimeout) => {
+ let count = 0
+ const timer = setInterval(async () => {
+ count += 1
+ if (count > MAX_POLLS) {
+ clearInterval(timer)
+ payPendingOrderId.value = null
+ onTimeout?.()
+ return
+ }
+
+ try {
+ const { paid } = await queryOrderStatus(orderId)
+ updatePaymentState({
+ orderId,
+ status: paid ? 'paid' : 'pending',
+ lastCheckedAt: Date.now(),
+ })
+ if (paid) {
+ clearInterval(timer)
+ payPendingOrderId.value = null
+ onPaid?.(orderId)
+ }
+ } catch {
+ // ignore polling errors
+ }
+ }, POLL_INTERVAL)
+
+ return () => clearInterval(timer)
+ }
+
+ return {
+ doPay,
+ pollPayStatus,
+ payPendingOrderId,
+ isPaying,
+ }
+}
diff --git a/src/composables/usePayEnv.js b/src/composables/usePayEnv.js
new file mode 100644
index 0000000..9c49996
--- /dev/null
+++ b/src/composables/usePayEnv.js
@@ -0,0 +1,35 @@
+/**
+ * 支付环境检测:PC / H5 / 微信浏览器
+ * 微信内使用 xorpay 收银台(JSAPI),非微信 PC 显示二维码
+ */
+
+export function isWeChat() {
+ if (typeof navigator === 'undefined') return false
+ const ua = navigator.userAgent || ''
+ // 微信内置浏览器、小程序 webview
+ if (/MicroMessenger/i.test(ua)) return true
+ // 本地调试:URL 强制指定 ?pay_env=wechat 时按微信处理
+ if (typeof window !== 'undefined') {
+ const p = new URLSearchParams(window.location.search)
+ if (p.get('pay_env') === 'wechat') return true
+ }
+ return false
+}
+
+export function isMobile() {
+ if (typeof navigator === 'undefined') return false
+ return /AppleWebKit.*Mobile|Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
+ navigator.userAgent
+ )
+}
+
+export function getPayEnv() {
+ if (isWeChat()) return 'wechat'
+ if (isMobile()) return 'h5'
+ return 'pc'
+}
+
+export function getDeviceFromEnv(env) {
+ if (env === 'wechat') return 'wechat'
+ return env === 'pc' ? 'pc' : 'h5'
+}
diff --git a/src/composables/usePurchaseRecovery.js b/src/composables/usePurchaseRecovery.js
new file mode 100644
index 0000000..9cb3b50
--- /dev/null
+++ b/src/composables/usePurchaseRecovery.js
@@ -0,0 +1,98 @@
+import { onMounted, onUnmounted } from 'vue'
+import { useRoute, useRouter } from 'vue-router'
+import { showToast } from 'vant'
+import { queryOrderStatus } from '@/api/payment.js'
+import { useAuth } from '@/composables/useAuth.js'
+import {
+ createPendingPurchaseProfile,
+ getLatestPurchaseOrderId,
+ getOrderIdFromPayCookie,
+ getPaidAccountDisplay,
+ getPaymentState,
+ getPendingPurchaseProfile,
+ savePendingPurchaseProfile,
+} from '@/utils/purchaseAccount.js'
+
+export function usePurchaseRecovery() {
+ const router = useRouter()
+ const route = useRoute()
+ const { user, ensureAuthReady } = useAuth()
+ let recovering = false
+
+ async function recoverPurchase() {
+ if (recovering || route.path === '/paid') return
+
+ await ensureAuthReady()
+ if (user.value) return
+
+ const paidDisplay = getPaidAccountDisplay()
+ if (paidDisplay?.orderId && paidDisplay.acknowledged !== true) {
+ recovering = true
+ showToast('检测到待领取账号,正在恢复支付结果页')
+ await router.replace({
+ path: '/paid',
+ query: { order_id: paidDisplay.orderId, recovery: '1' },
+ })
+ recovering = false
+ return
+ }
+
+ const pending = getPendingPurchaseProfile()
+ const paymentState = getPaymentState()
+ const fallbackOrderId = pending?.orderId || paymentState?.orderId || getOrderIdFromPayCookie() || getLatestPurchaseOrderId()
+ if (!fallbackOrderId) return
+
+ if (!pending?.orderId) {
+ savePendingPurchaseProfile(createPendingPurchaseProfile({
+ guestId: `recover_${fallbackOrderId}`,
+ orderId: fallbackOrderId,
+ redirect: paymentState?.sourcePath || '/',
+ source: paymentState?.payEnv === 'wechat' ? 'wechat-recovery' : 'purchase-recovery',
+ status: 'pending',
+ payEnv: paymentState?.payEnv || '',
+ provider: paymentState?.provider || '',
+ channel: paymentState?.channel || 'wxpay',
+ plan: paymentState?.plan || 'year',
+ returnUrl: paymentState?.returnUrl || '',
+ sourcePath: paymentState?.sourcePath || '/',
+ }))
+ }
+
+ recovering = true
+ try {
+ const { paid } = await queryOrderStatus(fallbackOrderId)
+ if (paid) {
+ showToast('检测到已支付订单,正在恢复账号结果')
+ await router.replace({
+ path: '/paid',
+ query: { order_id: fallbackOrderId, recovery: '1' },
+ })
+ }
+ } catch {
+ // ignore recovery errors
+ } finally {
+ recovering = false
+ }
+ }
+
+ function handleVisible() {
+ if (document.visibilityState === 'visible') {
+ recoverPurchase()
+ }
+ }
+
+ function handlePageShow() {
+ recoverPurchase()
+ }
+
+ onMounted(() => {
+ recoverPurchase()
+ document.addEventListener('visibilitychange', handleVisible)
+ window.addEventListener('pageshow', handlePageShow)
+ })
+
+ onUnmounted(() => {
+ document.removeEventListener('visibilitychange', handleVisible)
+ window.removeEventListener('pageshow', handlePageShow)
+ })
+}
diff --git a/src/composables/useVideoProgress.js b/src/composables/useVideoProgress.js
new file mode 100644
index 0000000..45c5306
--- /dev/null
+++ b/src/composables/useVideoProgress.js
@@ -0,0 +1,55 @@
+/**
+ * 视频观看进度 composable(参考 nomadlms VideoPlayer)
+ * 支持 localStorage 保存、续播提示
+ * @param {import('vue').Ref|string} videoIdRef - 视频唯一 ID,如 course-1-1
+ */
+const STORAGE_PREFIX = 'wxh5-video-'
+const SAVE_INTERVAL = 5000
+const MIN_PROGRESS_TO_SHOW = 10
+
+function getId(videoIdRef) {
+ return typeof videoIdRef?.value === 'string' ? videoIdRef.value : videoIdRef
+}
+
+export function useVideoProgress(videoIdRef) {
+ function getStoredProgress() {
+ const id = getId(videoIdRef)
+ if (typeof window === 'undefined' || !id) return 0
+ try {
+ const raw = localStorage.getItem(`${STORAGE_PREFIX}${id}`)
+ if (!raw) return 0
+ const data = JSON.parse(raw)
+ return typeof data?.time === 'number' ? data.time : 0
+ } catch {
+ return 0
+ }
+ }
+
+ function saveProgress(time) {
+ const id = getId(videoIdRef)
+ if (typeof window === 'undefined' || !id) return
+ try {
+ localStorage.setItem(`${STORAGE_PREFIX}${id}`, JSON.stringify({ time }))
+ } catch {
+ /* ignore */
+ }
+ }
+
+ function clearProgress() {
+ const id = getId(videoIdRef)
+ if (typeof window === 'undefined' || !id) return
+ try {
+ localStorage.removeItem(`${STORAGE_PREFIX}${id}`)
+ } catch {
+ /* ignore */
+ }
+ }
+
+ return {
+ getStoredProgress,
+ saveProgress,
+ clearProgress,
+ SAVE_INTERVAL,
+ MIN_PROGRESS_TO_SHOW,
+ }
+}
diff --git a/src/config/app.js b/src/config/app.js
new file mode 100644
index 0000000..7620a29
--- /dev/null
+++ b/src/config/app.js
@@ -0,0 +1,10 @@
+/**
+ * 应用全局配置
+ */
+export const APP_NAME = 'AI 实战营'
+export const APP_TITLE = 'AI 实战营 - 大模型与智能体实战'
+
+export const NAV_ITEMS = [
+ { path: '/', label: '首页' },
+ { path: '/vip', label: '会员' },
+]
diff --git a/src/config/markdown.js b/src/config/markdown.js
new file mode 100644
index 0000000..36e48cb
--- /dev/null
+++ b/src/config/markdown.js
@@ -0,0 +1,25 @@
+/**
+ * Markdown 渲染配置
+ * 使用 marked 库,支持 GFM、任务列表、表格等
+ */
+import { marked } from 'marked'
+
+// 配置 marked
+marked.setOptions({
+ gfm: true,
+ breaks: true,
+ headerIds: true,
+ mangle: false,
+})
+
+/**
+ * 将 Markdown 字符串转为 HTML
+ * @param {string} markdown - 原始 Markdown 文本
+ * @returns {string} 渲染后的 HTML
+ */
+export function renderMarkdown(markdown) {
+ if (!markdown || typeof markdown !== 'string') return ''
+ return marked.parse(markdown)
+}
+
+export { marked }
diff --git a/src/config/payment.js b/src/config/payment.js
new file mode 100644
index 0000000..06bff73
--- /dev/null
+++ b/src/config/payment.js
@@ -0,0 +1,29 @@
+function isLocalHost() {
+ if (typeof window === 'undefined') return true
+ const host = window.location.host
+ return /localhost|127\.0\.0\.1|^192\.168\.|^10\.\d+\.\d+\.\d+/.test(host)
+}
+
+export function getPaymentApiUrl() {
+ if (import.meta.env.VITE_PAYMENT_API_URL) {
+ return import.meta.env.VITE_PAYMENT_API_URL.replace(/\/$/, '')
+ }
+ return isLocalHost() ? '/api' : 'https://api.dsx2020.com'
+}
+
+export const PAYMENT_CONFIG = {
+ get apiUrl() {
+ return getPaymentApiUrl()
+ },
+ wechatProvider: import.meta.env.VITE_WECHAT_PAY_PROVIDER || 'xorpay',
+ zpaySubmitUrl: 'https://zpayz.cn/submit.php',
+ plans: {
+ month: { amount: 100, label: '月卡', price: 1, unit: '/月' },
+ year: { amount: 100, label: '年卡', price: 1, unit: '/年', recommend: true },
+ lifetime: { amount: 100, label: '终身卡', price: 1, unit: '买断' },
+ },
+}
+
+export function getPlanAmount(plan) {
+ return PAYMENT_CONFIG.plans[plan]?.amount ?? PAYMENT_CONFIG.plans.year.amount
+}
diff --git a/src/config/routes.js b/src/config/routes.js
new file mode 100644
index 0000000..1877815
--- /dev/null
+++ b/src/config/routes.js
@@ -0,0 +1,48 @@
+/**
+ * 路由配置 - 便于维护与扩展
+ */
+export const ROUTES = [
+ { path: '/', name: 'Home', component: () => import('@/views/Home.vue'), meta: { title: '首页' } },
+ {
+ path: '/login',
+ name: 'Login',
+ component: () => import('@/views/Login.vue'),
+ meta: { title: '登录', robots: 'noindex,nofollow,noarchive' },
+ },
+ {
+ path: '/ebook/:id',
+ name: 'EbookDetail',
+ component: () => import('@/views/EbookDetail.vue'),
+ meta: { title: '电子书' },
+ },
+ {
+ path: '/ebook/:id/chapter/:chapterId',
+ name: 'EbookChapter',
+ component: () => import('@/views/EbookChapter.vue'),
+ meta: { title: '阅读' },
+ },
+ {
+ path: '/course/:id',
+ name: 'CourseDetail',
+ component: () => import('@/views/CourseDetail.vue'),
+ meta: { title: '课程' },
+ },
+ {
+ path: '/course/:id/chapter/:chapterId',
+ name: 'CourseChapter',
+ component: () => import('@/views/CourseChapter.vue'),
+ meta: { title: '视频' },
+ },
+ {
+ path: '/vip',
+ name: 'Vip',
+ component: () => import('@/views/Vip.vue'),
+ meta: { title: '会员中心', robots: 'noindex,nofollow,noarchive' },
+ },
+ {
+ path: '/paid',
+ name: 'Paid',
+ component: () => import('@/views/Paid.vue'),
+ meta: { title: '支付结果', robots: 'noindex,nofollow,noarchive' },
+ },
+]
diff --git a/src/config/theme.js b/src/config/theme.js
new file mode 100644
index 0000000..15fcc3a
--- /dev/null
+++ b/src/config/theme.js
@@ -0,0 +1,23 @@
+/**
+ * 主题配置 - 支持亮色/暗色模式
+ * 用于 JS 中获取主题值,CSS 变量在 styles/variables.css
+ */
+export const BREAKPOINTS = {
+ sm: 576,
+ md: 768,
+ lg: 992,
+ xl: 1280,
+}
+
+export const LAYOUT = {
+ pageMaxWidth: 1280,
+ headerHeight: 56,
+ pagePadding: { sm: 16, md: 24, lg: 32 },
+}
+
+export const Z_INDEX = {
+ header: 100,
+ overlay: 200,
+ modal: 300,
+ toast: 400,
+}
diff --git a/src/data/categories.js b/src/data/categories.js
new file mode 100644
index 0000000..1a99beb
--- /dev/null
+++ b/src/data/categories.js
@@ -0,0 +1,9 @@
+/** 分类配置 - 电子书/课程共用 */
+export const CATEGORIES = [
+ { id: 'all', name: '全部' },
+ { id: 'frontend', name: '前端开发' },
+ { id: 'backend', name: '后端开发' },
+ { id: 'ai', name: '人工智能' },
+ { id: 'mobile', name: '移动开发' },
+ { id: 'devops', name: '测试运维' },
+]
diff --git a/src/data/mockData.js b/src/data/mockData.js
new file mode 100644
index 0000000..7ad43f8
--- /dev/null
+++ b/src/data/mockData.js
@@ -0,0 +1,144 @@
+import { getCourseMarkdownRef, getEbookMarkdownRef } from '@/markdown/config.js'
+import { ACCESS_LEVEL } from '@/utils/access.js'
+
+export const mockEbooks = [
+ {
+ id: 1,
+ title: 'Prompt 工程实战手册',
+ cover: 'https://picsum.photos/400/300?random=ai1',
+ description: '从零到精通:提示词设计、Few-shot、思维链,让大模型听懂你的需求。',
+ category_id: 'ai',
+ sort_order: 1,
+ },
+ {
+ id: 2,
+ title: 'AI Agent 开发指南',
+ cover: 'https://picsum.photos/400/300?random=ai2',
+ description: 'RAG、Function Calling、多 Agent 协作,打造可落地的智能体应用。',
+ category_id: 'ai',
+ sort_order: 2,
+ },
+]
+
+export const mockEbookChapters = {
+ 1: [
+ {
+ id: 1,
+ ebook_id: 1,
+ title: '第一章:Prompt 基础',
+ content: getEbookMarkdownRef(1, 1),
+ access_level: ACCESS_LEVEL.FREE,
+ sort_order: 1,
+ },
+ {
+ id: 2,
+ ebook_id: 1,
+ title: '第二章:Few-shot 与思维链',
+ content: getEbookMarkdownRef(1, 2),
+ access_level: ACCESS_LEVEL.VIP,
+ sort_order: 2,
+ },
+ {
+ id: 3,
+ ebook_id: 1,
+ title: '第三章:高级 Prompt 技巧',
+ content: getEbookMarkdownRef(1, 3),
+ access_level: ACCESS_LEVEL.SVIP,
+ sort_order: 3,
+ },
+ ],
+ 2: [
+ {
+ id: 4,
+ ebook_id: 2,
+ title: '第一章:Agent 架构入门',
+ content: getEbookMarkdownRef(2, 1),
+ access_level: ACCESS_LEVEL.FREE,
+ sort_order: 1,
+ },
+ {
+ id: 5,
+ ebook_id: 2,
+ title: '第二章:RAG 与 Function Calling',
+ content: getEbookMarkdownRef(2, 2),
+ access_level: ACCESS_LEVEL.VIP,
+ sort_order: 2,
+ },
+ ],
+}
+
+export const mockCourses = [
+ {
+ id: 1,
+ title: 'ChatGPT 与大模型实战',
+ cover: 'https://picsum.photos/400/300?random=ai3',
+ description: 'GPT-4、Claude、国产大模型 API 调用,从 Prompt 到 RAG 全流程实战。',
+ category_id: 'ai',
+ sort_order: 1,
+ },
+ {
+ id: 2,
+ title: 'AI Agent 从 0 到 1',
+ cover: 'https://picsum.photos/400/300?random=ai4',
+ description: 'LangChain、AutoGPT、多 Agent 协作,打造能自主完成任务的智能体。',
+ category_id: 'ai',
+ sort_order: 2,
+ },
+]
+
+export const mockCourseChapters = {
+ 1: [
+ {
+ id: 1,
+ course_id: 1,
+ title: '第一讲:大模型 API 入门',
+ video_url: 'https://www.w3schools.com/html/mov_bbb.mp4',
+ duration: 120,
+ access_level: ACCESS_LEVEL.FREE,
+ sort_order: 1,
+ article_markdown: getCourseMarkdownRef(1, 1),
+ },
+ {
+ id: 2,
+ course_id: 1,
+ title: '第二讲:Prompt 工程实战',
+ video_url: 'https://www.w3schools.com/html/mov_bbb.mp4',
+ duration: 300,
+ access_level: ACCESS_LEVEL.VIP,
+ sort_order: 2,
+ article_markdown: getCourseMarkdownRef(1, 2),
+ },
+ {
+ id: 3,
+ course_id: 1,
+ title: '第三讲:RAG 应用搭建',
+ video_url: 'https://www.w3schools.com/html/mov_bbb.mp4',
+ duration: 420,
+ access_level: ACCESS_LEVEL.SVIP,
+ sort_order: 3,
+ article_markdown: getCourseMarkdownRef(1, 3),
+ },
+ ],
+ 2: [
+ {
+ id: 4,
+ course_id: 2,
+ title: '第一讲:Agent 基础架构',
+ video_url: 'https://www.w3schools.com/html/mov_bbb.mp4',
+ duration: 600,
+ access_level: ACCESS_LEVEL.FREE,
+ sort_order: 1,
+ article_markdown: getCourseMarkdownRef(2, 1),
+ },
+ {
+ id: 5,
+ course_id: 2,
+ title: '第二讲:多 Agent 协作实战',
+ video_url: 'https://www.w3schools.com/html/mov_bbb.mp4',
+ duration: 480,
+ access_level: ACCESS_LEVEL.SVIP,
+ sort_order: 2,
+ article_markdown: getCourseMarkdownRef(2, 2),
+ },
+ ],
+}
diff --git a/src/main.js b/src/main.js
new file mode 100644
index 0000000..398acc8
--- /dev/null
+++ b/src/main.js
@@ -0,0 +1,50 @@
+// 引入vue
+import { createApp } from 'vue'
+// 响应式 rem(移动端自适应,PC 端固定基准)
+import '@/utils/flexible.js'
+// 动效库
+import 'animate.css'
+// 设置全局样式
+import './style.css'
+// 引入vue3 bus总线
+import mitt from "mitt";
+
+// 1. 引入你需要的组件
+import { Button, DropdownMenu, DropdownItem, Uploader, Toast, Loading, Form, Field, CellGroup, Icon, ConfigProvider, NavBar, Overlay, Tag, Popup, Empty, Skeleton, Tabs, Tab } from 'vant';
+// 2. 引入组件样式
+import 'vant/lib/index.css';
+
+// 初始化vue 根组件
+import App from './App.vue'
+import router from './router'
+const app = createApp(App)
+app.use(router)
+
+// 🔥 事件总线
+const bus = mitt();
+// 🔥 挂到全局
+app.config.globalProperties.$bus = bus;
+
+// 3. 注册你需要的组件
+app.use(Button);
+app.use(DropdownMenu);
+app.use(DropdownItem);
+app.use(Uploader);
+app.use(Toast);
+app.use(Loading);
+app.use(Form);
+app.use(Field);
+app.use(CellGroup);
+app.use(Icon);
+app.use(ConfigProvider);
+app.use(NavBar);
+app.use(Overlay);
+app.use(Tag);
+app.use(Popup);
+app.use(Empty);
+app.use(Skeleton);
+app.use(Tabs);
+app.use(Tab);
+
+// 挂载组件
+app.mount('#app')
diff --git a/src/markdown/config.js b/src/markdown/config.js
new file mode 100644
index 0000000..ff38a7d
--- /dev/null
+++ b/src/markdown/config.js
@@ -0,0 +1,44 @@
+const PUBLIC = 'public'
+const PRIVATE = 'private'
+
+function entry(path, visibility = PUBLIC) {
+ return { path, visibility }
+}
+
+export const MARKDOWN = {
+ course: {
+ 1: {
+ 1: entry('course/1/1'),
+ 2: entry('course/1/2', PRIVATE),
+ 3: entry('course/1/3', PRIVATE),
+ },
+ 2: {
+ 1: entry('course/2/1'),
+ 2: entry('course/2/2', PRIVATE),
+ },
+ },
+ ebook: {
+ 1: {
+ 1: entry('ebook/1/1'),
+ 2: entry('ebook/1/2', PRIVATE),
+ 3: entry('ebook/1/3', PRIVATE),
+ },
+ 2: {
+ 1: entry('ebook/2/1'),
+ 2: entry('ebook/2/2', PRIVATE),
+ },
+ },
+}
+
+function createMarkdownRef(item) {
+ if (!item?.path) return null
+ return item.visibility === PRIVATE ? `@private:${item.path}` : `@file:${item.path}`
+}
+
+export function getCourseMarkdownRef(courseId, chapterId) {
+ return createMarkdownRef(MARKDOWN.course[courseId]?.[chapterId])
+}
+
+export function getEbookMarkdownRef(ebookId, chapterId) {
+ return createMarkdownRef(MARKDOWN.ebook[ebookId]?.[chapterId])
+}
diff --git a/src/markdown/index.js b/src/markdown/index.js
new file mode 100644
index 0000000..019ecdb
--- /dev/null
+++ b/src/markdown/index.js
@@ -0,0 +1,72 @@
+const FILE_PREFIX = '@file:'
+const PRIVATE_PREFIX = '@private:'
+const MARKDOWN_BASE = '/markdown'
+const privateMarkdownModules = import.meta.glob('../private-markdown/**/*.md', {
+ query: '?raw',
+ import: 'default',
+})
+
+export function isFileRef(source) {
+ return typeof source === 'string' && source.trim().startsWith(FILE_PREFIX)
+}
+
+export function isPrivateRef(source) {
+ return typeof source === 'string' && source.trim().startsWith(PRIVATE_PREFIX)
+}
+
+function normalizePath(path) {
+ return path.endsWith('.md') ? path : `${path}.md`
+}
+
+export function parseFilePath(source) {
+ const path = source.trim().slice(FILE_PREFIX.length).trim()
+ return `${MARKDOWN_BASE}/${normalizePath(path)}`
+}
+
+export function parsePrivatePath(source) {
+ const path = source.trim().slice(PRIVATE_PREFIX.length).trim()
+ return `../private-markdown/${normalizePath(path)}`
+}
+
+export async function resolveMarkdown(source) {
+ if (!source || typeof source !== 'string') return ''
+
+ const trimmed = source.trim()
+ if (!trimmed) return ''
+
+ if (isFileRef(trimmed)) {
+ const url = parseFilePath(trimmed)
+
+ try {
+ const res = await fetch(url)
+ if (!res.ok) {
+ console.warn(`[markdown] failed to load public markdown: ${url}`, res.status)
+ return ''
+ }
+
+ return await res.text()
+ } catch (error) {
+ console.warn(`[markdown] failed to load public markdown: ${url}`, error)
+ return ''
+ }
+ }
+
+ if (isPrivateRef(trimmed)) {
+ const fileKey = parsePrivatePath(trimmed)
+ const loader = privateMarkdownModules[fileKey]
+
+ if (!loader) {
+ console.warn(`[markdown] missing private markdown: ${fileKey}`)
+ return ''
+ }
+
+ try {
+ return await loader()
+ } catch (error) {
+ console.warn(`[markdown] failed to load private markdown: ${fileKey}`, error)
+ return ''
+ }
+ }
+
+ return trimmed
+}
diff --git a/src/private-markdown/course/1/2.md b/src/private-markdown/course/1/2.md
new file mode 100644
index 0000000..66b0ede
--- /dev/null
+++ b/src/private-markdown/course/1/2.md
@@ -0,0 +1,12 @@
+# API 设计
+
+## RESTful 约定
+
+- `GET` 用于查询资源。
+- `POST` 用于创建资源。
+- `PUT` 或 `PATCH` 用于更新资源。
+- `DELETE` 用于删除资源。
+
+## 设计重点
+
+接口命名要稳定、返回结构要统一、错误码要可追踪,这样前后端协作会顺畅很多。
diff --git a/src/private-markdown/course/1/3.md b/src/private-markdown/course/1/3.md
new file mode 100644
index 0000000..e8ced18
--- /dev/null
+++ b/src/private-markdown/course/1/3.md
@@ -0,0 +1,11 @@
+# 部署上线
+
+## 基础流程
+
+1. 执行构建命令,生成生产包。
+2. 将产物发布到静态资源服务器或容器环境。
+3. 配置反向代理、HTTPS 和缓存策略。
+
+## 上线前检查
+
+上线前要确认环境变量、回源地址、监控告警和回滚方案都已经准备好。
diff --git a/src/private-markdown/course/2/2.md b/src/private-markdown/course/2/2.md
new file mode 100644
index 0000000..df01790
--- /dev/null
+++ b/src/private-markdown/course/2/2.md
@@ -0,0 +1,13 @@
+# 泛型实战
+
+泛型的价值不在于“语法炫技”,而在于让函数、组件和工具类型在复用时仍能保留准确的类型信息。
+
+## 常见场景
+
+- 封装列表请求函数。
+- 约束表单模型和返回值关系。
+- 编写可复用的组件 props 类型。
+
+## 实践建议
+
+优先让泛型表达业务约束,再考虑抽象层级,避免为了通用而牺牲可读性。
diff --git a/src/private-markdown/ebook/1/2.md b/src/private-markdown/ebook/1/2.md
new file mode 100644
index 0000000..f8e459b
--- /dev/null
+++ b/src/private-markdown/ebook/1/2.md
@@ -0,0 +1,14 @@
+# 组合式 API
+
+组合式 API 让状态、计算属性和副作用逻辑可以按“功能”组织,而不是被 `data`、`methods`、`computed` 拆散。
+
+## 常见组合
+
+- `ref` 适合管理基础类型和单一状态。
+- `reactive` 适合管理对象结构。
+- `computed` 负责派生状态,避免模板里塞复杂逻辑。
+- `watch` 适合监听某个状态变化后的副作用。
+
+## 实战建议
+
+把一组相关逻辑封装成 composable,可以显著提升复用性和可测试性。
diff --git a/src/private-markdown/ebook/1/3.md b/src/private-markdown/ebook/1/3.md
new file mode 100644
index 0000000..14d1b2a
--- /dev/null
+++ b/src/private-markdown/ebook/1/3.md
@@ -0,0 +1,12 @@
+# 响应式原理
+
+Vue 3 通过 `Proxy` 拦截对象访问,从而在“读取时收集依赖、写入时触发更新”。
+
+## 你需要理解的两个阶段
+
+1. 组件渲染时,Vue 记录模板依赖了哪些状态。
+2. 这些状态变化后,Vue 只重新执行相关的更新逻辑。
+
+## 为什么这很重要
+
+理解响应式原理后,我们在设计状态结构、避免重复计算和排查页面更新异常时会更有把握。
diff --git a/src/private-markdown/ebook/2/2.md b/src/private-markdown/ebook/2/2.md
new file mode 100644
index 0000000..ca51e24
--- /dev/null
+++ b/src/private-markdown/ebook/2/2.md
@@ -0,0 +1,13 @@
+# Monorepo
+
+Monorepo 适合把多个前端应用、共享组件库和工具脚本放在同一个仓库中统一维护。
+
+## 优点
+
+- 共享代码更直接。
+- 依赖升级更集中。
+- CI、规范和版本管理更一致。
+
+## 风险
+
+仓库边界会变复杂,因此需要更清晰的包划分、缓存策略和发布流程。
diff --git a/src/router/index.js b/src/router/index.js
new file mode 100644
index 0000000..b2b322c
--- /dev/null
+++ b/src/router/index.js
@@ -0,0 +1,20 @@
+import { createRouter, createWebHistory } from 'vue-router'
+import { APP_NAME, APP_TITLE } from '@/config/app.js'
+import { ROUTES } from '@/config/routes.js'
+import { DEFAULT_ROBOTS_CONTENT, setRobotsMeta } from '@/utils/seo.js'
+
+const router = createRouter({
+ history: createWebHistory(),
+ routes: ROUTES,
+})
+
+router.beforeEach((to, _from, next) => {
+ if (to.meta?.title) {
+ document.title = to.meta.title === '首页' ? APP_TITLE : `${to.meta.title} - ${APP_NAME}`
+ }
+
+ setRobotsMeta(to.meta?.robots || DEFAULT_ROBOTS_CONTENT)
+ next()
+})
+
+export default router
diff --git a/src/style.css b/src/style.css
new file mode 100644
index 0000000..4e63816
--- /dev/null
+++ b/src/style.css
@@ -0,0 +1,25 @@
+/* 主样式入口 - 模块化样式加载 */
+@import './styles/variables.css';
+@import './styles/base.css';
+@import './styles/vant-overrides.css';
+
+/* 全局工具类 */
+.page-with-navbar {
+ padding-top: 56px;
+}
+
+/* 滚动条 */
+::-webkit-scrollbar {
+ width: 8px;
+ height: 8px;
+}
+
+::-webkit-scrollbar-thumb {
+ border-radius: 4px;
+ background: var(--color-border-strong);
+}
+
+::-webkit-scrollbar-track {
+ background: transparent;
+}
+
diff --git a/src/styles/base.css b/src/styles/base.css
new file mode 100644
index 0000000..3f9c90d
--- /dev/null
+++ b/src/styles/base.css
@@ -0,0 +1,53 @@
+/* 基础样式 */
+* {
+ box-sizing: border-box;
+}
+
+html {
+ -webkit-tap-highlight-color: transparent;
+ -webkit-font-smoothing: antialiased;
+}
+
+html,
+body {
+ margin: 0;
+ padding: 0;
+ min-height: 100%;
+ background: var(--color-bg);
+ color: var(--color-text);
+ font-family: var(--font-sans);
+ font-size: 16px;
+ line-height: 1.5;
+ transition: background-color var(--transition-normal), color var(--transition-normal);
+}
+
+body {
+ overflow-x: hidden;
+ user-select: none;
+}
+
+input,
+textarea {
+ font: inherit;
+ user-select: auto;
+}
+
+img {
+ display: block;
+ max-width: 100%;
+}
+
+a {
+ color: inherit;
+ text-decoration: none;
+}
+
+button:focus-visible,
+a:focus-visible {
+ outline: 2px solid var(--color-primary);
+ outline-offset: 2px;
+}
+
+::selection {
+ background: rgba(37, 99, 235, 0.2);
+}
diff --git a/src/styles/vant-overrides.css b/src/styles/vant-overrides.css
new file mode 100644
index 0000000..9ccb134
--- /dev/null
+++ b/src/styles/vant-overrides.css
@@ -0,0 +1,73 @@
+/* Vant 组件主题覆盖 */
+:root {
+ --van-primary-color: var(--color-primary);
+ --van-success-color: var(--color-success);
+ --van-warning-color: var(--color-warning);
+ --van-danger-color: var(--color-danger);
+ --van-background-2: transparent;
+ --van-background-3: transparent;
+ --van-text-color: var(--color-text);
+ --van-text-color-2: var(--color-text-secondary);
+ --van-border-color: transparent;
+}
+
+.van-nav-bar {
+ background: transparent !important;
+}
+
+.van-nav-bar::after {
+ display: none !important;
+}
+
+.van-nav-bar__content {
+ width: min(calc(100% - 24px), var(--page-max-width));
+ margin: 12px auto 0;
+ padding: 0 16px;
+ min-height: 44px;
+ border-radius: var(--radius-md);
+ border: 1px solid var(--color-border);
+ background: var(--color-bg-elevated);
+ box-shadow: var(--shadow-sm);
+}
+
+.van-nav-bar__title,
+.van-nav-bar .van-icon,
+.van-nav-bar__text {
+ color: var(--color-text) !important;
+}
+
+.van-popup {
+ background: var(--color-bg-elevated) !important;
+ border: 1px solid var(--color-border);
+ box-shadow: var(--shadow-lg);
+}
+
+.van-button--primary {
+ background: var(--color-primary) !important;
+ border: none !important;
+ color: #fff !important;
+}
+
+.van-button--default,
+.van-button--plain {
+ color: var(--color-text) !important;
+ border-color: var(--color-border) !important;
+ background: var(--color-bg-muted) !important;
+}
+
+.van-cell,
+.van-cell-group,
+.van-field,
+.van-field__body,
+.van-field__control {
+ background: transparent !important;
+ color: var(--color-text) !important;
+}
+
+.van-field__label {
+ color: var(--color-text-secondary) !important;
+}
+
+.van-field__control::placeholder {
+ color: var(--color-text-muted) !important;
+}
diff --git a/src/styles/variables.css b/src/styles/variables.css
new file mode 100644
index 0000000..a954566
--- /dev/null
+++ b/src/styles/variables.css
@@ -0,0 +1,73 @@
+/* 主题变量 - 亮色/暗色模式 */
+:root {
+ --page-max-width: 1280px;
+ --page-padding: clamp(16px, 4vw, 32px);
+ --header-height: 56px;
+ --radius-sm: 8px;
+ --radius-md: 12px;
+ --radius-lg: 16px;
+ --radius-xl: 20px;
+ --font-sans: "Space Grotesk", "PingFang SC", "Microsoft YaHei", sans-serif;
+ --transition-fast: 0.15s ease;
+ --transition-normal: 0.25s ease;
+}
+
+:root {
+ --color-primary: #059669;
+ --color-primary-hover: #047857;
+ --color-bg: #fafafa;
+ --color-bg-elevated: #ffffff;
+ --color-bg-muted: #f4f4f5;
+ --color-text: #18181b;
+ --color-text-secondary: #52525b;
+ --color-text-muted: #71717a;
+ --color-border: #e4e4e7;
+ --color-border-strong: #d4d4d8;
+ --color-success: #22c55e;
+ --color-warning: #f59e0b;
+ --color-danger: #ef4444;
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1);
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1);
+}
+
+[data-theme="dark"] {
+ --color-primary: #34d399;
+ --color-primary-hover: #6ee7b7;
+ --color-bg: #0f172a;
+ --color-bg-elevated: #1e293b;
+ --color-bg-muted: #334155;
+ --color-text: #f8fafc;
+ --color-text-secondary: #94a3b8;
+ --color-text-muted: #64748b;
+ --color-border: #334155;
+ --color-border-strong: #475569;
+ --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.3);
+ --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.4);
+ --shadow-lg: 0 12px 24px rgba(0, 0, 0, 0.4);
+}
+
+/* 兼容旧变量名 */
+:root,
+[data-theme="dark"] {
+ --bg-primary: var(--color-bg);
+ --bg-card: var(--color-bg-elevated);
+ --bg-card-strong: var(--color-bg-elevated);
+ --bg-secondary: var(--color-bg-muted);
+ --text-primary: var(--color-text);
+ --text-secondary: var(--color-text-secondary);
+ --text-placeholder: var(--color-text-muted);
+ --border-color: var(--color-border);
+ --border-strong: var(--color-border-strong);
+ --primary-color: var(--color-primary);
+ --accent: var(--color-primary);
+ --accent-strong: var(--color-primary-hover);
+ --font-display: var(--font-sans);
+ --font-body: var(--font-sans);
+}
+
+@media (min-width: 768px) {
+ :root {
+ --page-padding: clamp(24px, 4vw, 40px);
+ }
+}
diff --git a/src/supabase.js b/src/supabase.js
new file mode 100644
index 0000000..2af49ab
--- /dev/null
+++ b/src/supabase.js
@@ -0,0 +1,12 @@
+import { createClient } from '@supabase/supabase-js'
+
+export const supabase = createClient(
+ 'https://supabase.dsx2016.com',
+ 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwiaWF0IjoxNjQxNzY5MjAwLCJleHAiOjE3OTk1MzU2MDAsInJvbGUiOiJhbm9uIn0.1AbfppajMwBLRdD3YeJT9_2CXh_LUZxD6vIWb0EpEnw',
+ {
+ auth: {
+ persistSession: true,
+ autoRefreshToken: true,
+ },
+ }
+)
diff --git a/src/utils/access.js b/src/utils/access.js
new file mode 100644
index 0000000..5368445
--- /dev/null
+++ b/src/utils/access.js
@@ -0,0 +1,103 @@
+export const ACCESS_LEVEL = {
+ FREE: 'free',
+ VIP: 'vip',
+ SVIP: 'svip',
+}
+
+const ACCESS_LABELS = {
+ [ACCESS_LEVEL.FREE]: '免费',
+ [ACCESS_LEVEL.VIP]: 'VIP',
+ [ACCESS_LEVEL.SVIP]: 'SVIP',
+}
+
+export function normalizeAccessLevel(target, fallback = ACCESS_LEVEL.FREE) {
+ const value = typeof target === 'object' && target !== null
+ ? target.access_level ?? target.accessLevel
+ : target
+
+ if (value === ACCESS_LEVEL.FREE || value === ACCESS_LEVEL.VIP || value === ACCESS_LEVEL.SVIP) {
+ return value
+ }
+
+ if (typeof target === 'object' && target !== null && typeof target.is_free === 'boolean') {
+ return target.is_free ? ACCESS_LEVEL.FREE : ACCESS_LEVEL.VIP
+ }
+
+ return fallback
+}
+
+export function getAccessLabel(target) {
+ const level = normalizeAccessLevel(target)
+ return ACCESS_LABELS[level]
+}
+
+export function isProtectedLevel(target) {
+ return normalizeAccessLevel(target) !== ACCESS_LEVEL.FREE
+}
+
+export function canAccessLevel(target, { user = null, isSvip = false } = {}) {
+ const level = normalizeAccessLevel(target)
+
+ if (level === ACCESS_LEVEL.FREE) return true
+ if (level === ACCESS_LEVEL.VIP) return !!user
+ return !!user && !!isSvip
+}
+
+export function shouldNoindexLevel(target) {
+ return isProtectedLevel(target)
+}
+
+export function getAccessTagType(target) {
+ const level = normalizeAccessLevel(target)
+
+ if (level === ACCESS_LEVEL.FREE) return 'success'
+ if (level === ACCESS_LEVEL.VIP) return 'primary'
+ return 'warning'
+}
+
+export function getGateCopy(target, { loggedIn = false } = {}) {
+ const level = normalizeAccessLevel(target)
+
+ if (level === ACCESS_LEVEL.VIP) {
+ if (!loggedIn) {
+ return {
+ title: 'VIP 内容',
+ description: '支付成功后在结果页查看账号密码。',
+ action: 'pay',
+ actionText: '立即支付',
+ }
+ }
+
+ return {
+ title: 'VIP 内容',
+ description: '登录后即可查看。',
+ action: 'login',
+ actionText: '去登录',
+ }
+ }
+
+ if (level === ACCESS_LEVEL.SVIP) {
+ if (loggedIn) {
+ return {
+ title: 'SVIP 内容',
+ description: '需升级 SVIP 后查看。',
+ action: 'upgrade',
+ actionText: '升级 SVIP',
+ }
+ }
+
+ return {
+ title: 'SVIP 内容',
+ description: '支付成功即解锁。',
+ action: 'pay',
+ actionText: '立即支付',
+ }
+ }
+
+ return {
+ title: '免费内容',
+ description: '可直接查看。',
+ action: 'close',
+ actionText: '知道了',
+ }
+}
diff --git a/src/utils/flexible.js b/src/utils/flexible.js
new file mode 100644
index 0000000..39113cd
--- /dev/null
+++ b/src/utils/flexible.js
@@ -0,0 +1,25 @@
+/**
+ * 响应式 rem 基准
+ * - 移动端:rem = viewWidth / 10(与 amfe-flexible 一致)
+ * - PC 端(>=768px):固定 37.5px,避免大屏字体过大,内容由 max-width 容器控制
+ */
+(function (window, document) {
+ const PC_BREAKPOINT = 768
+ const PC_ROOT = 37.5
+
+ const docEl = document.documentElement
+
+ function setRemUnit() {
+ const width = docEl.clientWidth
+ const fontSize = width >= PC_BREAKPOINT ? PC_ROOT : width / 10
+ docEl.style.fontSize = fontSize + 'px'
+ docEl.classList.toggle('is-pc', width >= PC_BREAKPOINT)
+ }
+
+ setRemUnit()
+
+ window.addEventListener('resize', setRemUnit)
+ window.addEventListener('pageshow', (e) => {
+ if (e.persisted) setRemUnit()
+ })
+})(window, document)
diff --git a/src/utils/purchaseAccount.js b/src/utils/purchaseAccount.js
new file mode 100644
index 0000000..a749041
--- /dev/null
+++ b/src/utils/purchaseAccount.js
@@ -0,0 +1,249 @@
+const STORAGE_KEY = 'wxh5_pending_purchase_account'
+const DISPLAY_KEY = 'wxh5_paid_account_display'
+const HISTORY_KEY = 'wxh5_paid_account_history'
+const PAYMENT_STATE_KEY = 'wxh5_payment_state'
+const USERNAME_LENGTH = 10
+const USERNAME_SUFFIX_LENGTH = 4
+const PAY_COOKIE_NAME = 'wxh5_pay_order'
+
+function simpleHash(input) {
+ let hash = 0
+ const text = String(input || '')
+
+ for (let index = 0; index < text.length; index += 1) {
+ hash = (hash * 31 + text.charCodeAt(index)) % 2147483647
+ }
+
+ return Math.abs(hash)
+}
+
+function padNumber(value, length) {
+ return String(value).padStart(length, '0')
+}
+
+export function buildCredentialsFromOrderId(orderId) {
+ const normalizedOrderId = String(orderId || '').trim()
+ const serial = padNumber(simpleHash(`user:${normalizedOrderId}`) % (10 ** USERNAME_SUFFIX_LENGTH), USERNAME_SUFFIX_LENGTH)
+ const username = `vip${serial}`.slice(0, USERNAME_LENGTH)
+ const password = '123456'
+ const recoveryCode = `RC${padNumber(simpleHash(`recovery:${normalizedOrderId}`) % 1000000, 6)}`
+
+ return {
+ username,
+ password,
+ email: `${username}@wxgzh.com`,
+ recoveryCode,
+ }
+}
+
+export function createPendingPurchaseProfile(overrides = {}) {
+ const createdAt = Date.now()
+
+ return {
+ guestId: overrides.guestId || `guest_${createdAt}`,
+ username: overrides.username || '',
+ password: overrides.password || '',
+ email: overrides.email || '',
+ recoveryCode: overrides.recoveryCode || '',
+ orderId: overrides.orderId || '',
+ redirect: overrides.redirect || '/',
+ source: overrides.source || 'vip',
+ createdAt,
+ issued: false,
+ status: overrides.status || 'pending',
+ payEnv: overrides.payEnv || '',
+ provider: overrides.provider || '',
+ channel: overrides.channel || 'wxpay',
+ plan: overrides.plan || 'year',
+ returnUrl: overrides.returnUrl || '',
+ sourcePath: overrides.sourcePath || '',
+ }
+}
+
+export function enrichProfileWithOrder(profile, orderId) {
+ const credentials = buildCredentialsFromOrderId(orderId)
+ return {
+ ...profile,
+ ...credentials,
+ orderId,
+ }
+}
+
+export function savePendingPurchaseProfile(profile) {
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(profile))
+}
+
+export function getPendingPurchaseProfile() {
+ const raw = localStorage.getItem(STORAGE_KEY)
+ if (!raw) return null
+
+ try {
+ return JSON.parse(raw)
+ } catch {
+ return null
+ }
+}
+
+export function updatePendingPurchaseProfile(patch) {
+ const current = getPendingPurchaseProfile()
+ if (!current) return null
+
+ const next = { ...current, ...patch }
+ savePendingPurchaseProfile(next)
+ return next
+}
+
+export function clearPendingPurchaseProfile() {
+ localStorage.removeItem(STORAGE_KEY)
+}
+
+export function savePaidAccountDisplay(data) {
+ localStorage.setItem(DISPLAY_KEY, JSON.stringify({
+ acknowledged: false,
+ savedAt: Date.now(),
+ ...data,
+ }))
+}
+
+export function getPaidAccountDisplay() {
+ const raw = localStorage.getItem(DISPLAY_KEY)
+ if (!raw) return null
+
+ try {
+ return JSON.parse(raw)
+ } catch {
+ return null
+ }
+}
+
+export function clearPaidAccountDisplay() {
+ localStorage.removeItem(DISPLAY_KEY)
+}
+
+export function markPaidAccountAcknowledged() {
+ const current = getPaidAccountDisplay()
+ if (!current) return null
+
+ const next = {
+ ...current,
+ acknowledged: true,
+ acknowledgedAt: Date.now(),
+ }
+ localStorage.setItem(DISPLAY_KEY, JSON.stringify(next))
+ return next
+}
+
+export function createPaymentState(overrides = {}) {
+ return {
+ orderId: overrides.orderId || '',
+ userId: overrides.userId || '',
+ plan: overrides.plan || 'year',
+ channel: overrides.channel || 'wxpay',
+ provider: overrides.provider || '',
+ payEnv: overrides.payEnv || '',
+ device: overrides.device || '',
+ sourcePath: overrides.sourcePath || (typeof window !== 'undefined' ? `${window.location.pathname}${window.location.search}` : ''),
+ returnUrl: overrides.returnUrl || '',
+ status: overrides.status || 'pending',
+ createdAt: overrides.createdAt || Date.now(),
+ paidAt: overrides.paidAt || null,
+ providerTradeNo: overrides.providerTradeNo || '',
+ lastCheckedAt: overrides.lastCheckedAt || null,
+ }
+}
+
+export function savePaymentState(state) {
+ localStorage.setItem(PAYMENT_STATE_KEY, JSON.stringify({
+ savedAt: Date.now(),
+ ...state,
+ }))
+}
+
+export function getPaymentState() {
+ const raw = localStorage.getItem(PAYMENT_STATE_KEY)
+ if (!raw) return null
+
+ try {
+ return JSON.parse(raw)
+ } catch {
+ return null
+ }
+}
+
+export function updatePaymentState(patch) {
+ const current = getPaymentState() || {}
+ const next = {
+ ...current,
+ ...patch,
+ savedAt: Date.now(),
+ }
+ savePaymentState(next)
+ return next
+}
+
+export function clearPaymentState() {
+ localStorage.removeItem(PAYMENT_STATE_KEY)
+}
+
+export function getPurchaseHistory() {
+ const raw = localStorage.getItem(HISTORY_KEY)
+ if (!raw) return []
+
+ try {
+ const data = JSON.parse(raw)
+ return Array.isArray(data) ? data : []
+ } catch {
+ return []
+ }
+}
+
+export function savePurchaseHistory(items) {
+ localStorage.setItem(HISTORY_KEY, JSON.stringify(items.slice(0, 20)))
+}
+
+export function pushPurchaseHistory(entry) {
+ const list = getPurchaseHistory()
+ const next = [
+ {
+ createdAt: entry?.createdAt || Date.now(),
+ ...entry,
+ },
+ ...list.filter((item) => item.orderId !== entry.orderId),
+ ]
+ savePurchaseHistory(next)
+}
+
+export function getLatestPurchaseOrderId() {
+ const pending = getPendingPurchaseProfile()
+ if (pending?.orderId) return pending.orderId
+
+ const paymentState = getPaymentState()
+ if (paymentState?.orderId) return paymentState.orderId
+
+ const paidDisplay = getPaidAccountDisplay()
+ if (paidDisplay?.orderId) return paidDisplay.orderId
+
+ const history = getPurchaseHistory()
+ const latest = history
+ .filter((item) => item?.orderId)
+ .sort((a, b) => Number(b.createdAt || 0) - Number(a.createdAt || 0))[0]
+
+ return latest?.orderId || ''
+}
+
+export function resolveOrderIdFromPayResult(result) {
+ if (!result) return ''
+ if (typeof result === 'string') return result
+ return result.order_id || ''
+}
+
+export function getOrderIdFromPayCookie() {
+ if (typeof document === 'undefined') return ''
+
+ const match = document.cookie.match(new RegExp(`(?:^|; )${PAY_COOKIE_NAME}=([^;]*)`))
+ if (!match) return ''
+
+ const raw = decodeURIComponent(match[1] || '')
+ const parts = raw.split('|')
+ return parts[0]?.trim() || ''
+}
diff --git a/src/utils/seo.js b/src/utils/seo.js
new file mode 100644
index 0000000..17e462e
--- /dev/null
+++ b/src/utils/seo.js
@@ -0,0 +1,14 @@
+export const DEFAULT_ROBOTS_CONTENT = 'index,follow,max-image-preview:large'
+
+export function setRobotsMeta(content = DEFAULT_ROBOTS_CONTENT) {
+ if (typeof document === 'undefined') return
+
+ let meta = document.head.querySelector('meta[name="robots"]')
+ if (!meta) {
+ meta = document.createElement('meta')
+ meta.name = 'robots'
+ document.head.appendChild(meta)
+ }
+
+ meta.setAttribute('content', content)
+}
diff --git a/src/views/CourseChapter.vue b/src/views/CourseChapter.vue
new file mode 100644
index 0000000..c7f8ee5
--- /dev/null
+++ b/src/views/CourseChapter.vue
@@ -0,0 +1,498 @@
+
+
+
+
+
+
+
+
+
{{ gateCopy.title }}
+
{{ gateCopy.description }}
+
+ {{ gateCopy.actionText }}
+ 返回上页
+
+
+
+
+
+
+
+
+
+
+
上次看到 {{ formatResumeTime(savedTime) }}
+
+ 从上次继续
+ 重新观看
+
+
+
+ {{ chapter.title }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/CourseDetail.vue b/src/views/CourseDetail.vue
new file mode 100644
index 0000000..295872f
--- /dev/null
+++ b/src/views/CourseDetail.vue
@@ -0,0 +1,382 @@
+
+
+
+
+
+
+
+
+ 课程目录
+
+
+
{{ index + 1 }}
+
+
{{ chapter.title }}
+
+ {{ formatDuration(chapter.duration) }}
+
+
+
+
+ {{ getLabel(chapter) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/EbookChapter.vue b/src/views/EbookChapter.vue
new file mode 100644
index 0000000..77826d3
--- /dev/null
+++ b/src/views/EbookChapter.vue
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+
{{ gateCopy.title }}
+
{{ gateCopy.description }}
+
+ {{ gateCopy.actionText }}
+ 返回上页
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/EbookDetail.vue b/src/views/EbookDetail.vue
new file mode 100644
index 0000000..445339f
--- /dev/null
+++ b/src/views/EbookDetail.vue
@@ -0,0 +1,239 @@
+
+
+
+
+
+
+
+
+
+
{{ ebook.description }}
+
+
+
目录
+
+
{{ index + 1 }}
+
{{ chapter.title }}
+
+ {{ getLabel(chapter) }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/Home.vue b/src/views/Home.vue
new file mode 100644
index 0000000..b09b290
--- /dev/null
+++ b/src/views/Home.vue
@@ -0,0 +1,695 @@
+
+
+
+
+ AI 实战营
+ 大模型、Prompt、Agent 实战课程与电子书,紧跟 AI 时代
+
+ {{ filteredCourses.length }} 节课程
+ {{ filteredEbooks.length }} 本电子书
+
+ 立即报名 →
+
+
+
+
+
+
+
+
+
AI 实战课程
+
大模型应用、Prompt 工程、AI Agent 开发,从入门到实战
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ item.title }}
+
{{ item.description }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
电子书
+
+
+
{{ item.title }}
+
{{ item.description }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 适合谁学习?
+ 想用 AI 提效、转型或创业的人
+
+
+
💻
+
开发者
+
用 AI 写代码、做 Agent,提升 10x 效率
+
+
+
📝
+
产品/运营
+
Prompt 工程、AI 工作流,告别重复劳动
+
+
+
🚀
+
创业者
+
AI 应用落地,抓住大模型红利
+
+
+
🎯
+
职场转型者
+
从零学 AI,成为 AI 时代稀缺人才
+
+
+
+
+
+ 学完你将获得
+ 5 大 AI 核心能力,助你抓住时代红利
+
+
+
1
+
+
Prompt 工程实战
+
写出高质量提示词,让大模型听懂你的需求
+
+
+
+
2
+
+
AI Agent 开发
+
从 RAG 到多 Agent 协作,打造智能应用
+
+
+
+
3
+
+
大模型 API 调用
+
接入 GPT、Claude、国产大模型,快速落地
+
+
+
+
4
+
+
AI 工作流设计
+
自动化办公、智能客服、内容生成,提效 10 倍
+
+
+
+
5
+
+
AI 社群与资源
+
加入 AI 实战社群,获取最新模型与工具
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/Login.vue b/src/views/Login.vue
new file mode 100644
index 0000000..6156483
--- /dev/null
+++ b/src/views/Login.vue
@@ -0,0 +1,184 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 登录
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/Paid.vue b/src/views/Paid.vue
new file mode 100644
index 0000000..cc8302b
--- /dev/null
+++ b/src/views/Paid.vue
@@ -0,0 +1,700 @@
+
+
+
+
正在确认支付结果...
+
请稍候。
+
关闭页面后重新打开可继续查询订单。
+
+
+ 当前订单号:{{ lastOrderId }}
+ 复制
+
+
+
+
+ 立即重试
+
+ 返回首页
+
+
+
+
+
+
账号已准备好
+
请保存用户名和密码。手机长按图片保存,电脑会自动下载截图。
+
+
+
+
用户名
+
+ {{ issuedAccount.username || '-' }}
+ 复制
+
+
+
+
密码
+
+ {{ issuedAccount.password || '-' }}
+ 复制
+
+
+
保存截图后下次不会自动进入本页。
+
+
+
+
+ 我知道了,保存截图
+
+
+ 一键复制账号密码
+
+
+
+
+
+
+
{{ failTitle }}
+
{{ failDesc }}
+
+
+ 订单号:{{ lastOrderId }}
+ 复制订单号
+
+
+
{{ failHint }}
+
+
+
+ 重新查询支付结果
+
+ 返回首页
+
+
+
+
+
+
+
+
diff --git a/src/views/Vip.vue b/src/views/Vip.vue
new file mode 100644
index 0000000..3b6753b
--- /dev/null
+++ b/src/views/Vip.vue
@@ -0,0 +1,388 @@
+
+
+
+
+
+
+ {{ heroTitle }}
+ {{ heroDesc }}
+
+
+
+
+
{{ actionTitle }}
+
{{ actionDesc }}
+
+
+
+
+ {{ mainActionText }}
+
+
+
+ {{ showQrModal ? '请扫码支付' : '支付成功后自动跳转' }}
+
+
请保存截图中的用户名和密码。
+
+
+
+
+ SVIP 权益
+
+ 解锁全部课程与电子书
+ 永久回看,持续更新
+ 社群答疑与交流
+
+
+
+
+
+
+
+
+
+
+
diff --git a/supabase/migrations/001_knowledge_tables.sql b/supabase/migrations/001_knowledge_tables.sql
new file mode 100644
index 0000000..93a2b4b
--- /dev/null
+++ b/supabase/migrations/001_knowledge_tables.sql
@@ -0,0 +1,75 @@
+-- 知识付费平台数据表
+-- 在 Supabase SQL Editor 中执行
+
+-- 电子书专栏
+CREATE TABLE IF NOT EXISTS wxgzh_ebooks (
+ id BIGSERIAL PRIMARY KEY,
+ title TEXT NOT NULL,
+ cover TEXT,
+ description TEXT,
+ sort_order INT DEFAULT 0,
+ created_at TIMESTAMPTZ DEFAULT NOW()
+);
+
+-- 电子书章节
+CREATE TABLE IF NOT EXISTS wxgzh_ebook_chapters (
+ id BIGSERIAL PRIMARY KEY,
+ ebook_id BIGINT NOT NULL REFERENCES wxgzh_ebooks(id) ON DELETE CASCADE,
+ title TEXT NOT NULL,
+ content TEXT,
+ is_free BOOLEAN DEFAULT false,
+ sort_order INT DEFAULT 0,
+ created_at TIMESTAMPTZ DEFAULT NOW()
+);
+
+-- 课程专栏
+CREATE TABLE IF NOT EXISTS wxgzh_courses (
+ id BIGSERIAL PRIMARY KEY,
+ title TEXT NOT NULL,
+ cover TEXT,
+ description TEXT,
+ sort_order INT DEFAULT 0,
+ created_at TIMESTAMPTZ DEFAULT NOW()
+);
+
+-- 课程章节(视频 + 配套文章)
+CREATE TABLE IF NOT EXISTS wxgzh_course_chapters (
+ id BIGSERIAL PRIMARY KEY,
+ course_id BIGINT NOT NULL REFERENCES wxgzh_courses(id) ON DELETE CASCADE,
+ title TEXT NOT NULL,
+ video_url TEXT,
+ article_markdown TEXT,
+ duration INT DEFAULT 0,
+ is_free BOOLEAN DEFAULT false,
+ sort_order INT DEFAULT 0,
+ created_at TIMESTAMPTZ DEFAULT NOW()
+);
+
+-- 若表已存在,可单独执行添加列:
+-- ALTER TABLE wxgzh_course_chapters ADD COLUMN IF NOT EXISTS article_markdown TEXT;
+
+-- VIP 用户表(user_id 对应 auth.users.id)
+CREATE TABLE IF NOT EXISTS wxgzh_vip_users (
+ id BIGSERIAL PRIMARY KEY,
+ user_id UUID NOT NULL UNIQUE REFERENCES auth.users(id) ON DELETE CASCADE,
+ expire_at TIMESTAMPTZ NOT NULL,
+ created_at TIMESTAMPTZ DEFAULT NOW()
+);
+
+-- 启用 RLS
+ALTER TABLE wxgzh_ebooks ENABLE ROW LEVEL SECURITY;
+ALTER TABLE wxgzh_ebook_chapters ENABLE ROW LEVEL SECURITY;
+ALTER TABLE wxgzh_courses ENABLE ROW LEVEL SECURITY;
+ALTER TABLE wxgzh_course_chapters ENABLE ROW LEVEL SECURITY;
+ALTER TABLE wxgzh_vip_users ENABLE ROW LEVEL SECURITY;
+
+-- 公开读取策略(专栏和章节列表可匿名读)
+CREATE POLICY "ebooks_public_read" ON wxgzh_ebooks FOR SELECT USING (true);
+CREATE POLICY "ebook_chapters_public_read" ON wxgzh_ebook_chapters FOR SELECT USING (true);
+CREATE POLICY "courses_public_read" ON wxgzh_courses FOR SELECT USING (true);
+CREATE POLICY "course_chapters_public_read" ON wxgzh_course_chapters FOR SELECT USING (true);
+
+-- VIP 表仅允许用户查询自己的记录
+CREATE POLICY "vip_users_select_own" ON wxgzh_vip_users FOR SELECT USING (auth.uid() = user_id);
+
+-- 示例数据可在 Supabase 后台手动插入,或使用 mock 数据(前端已内置)
diff --git a/supabase/migrations/002_add_article_markdown.sql b/supabase/migrations/002_add_article_markdown.sql
new file mode 100644
index 0000000..5f34176
--- /dev/null
+++ b/supabase/migrations/002_add_article_markdown.sql
@@ -0,0 +1,2 @@
+-- 若已执行过 001,可单独执行此文件添加 article_markdown 列
+ALTER TABLE wxgzh_course_chapters ADD COLUMN IF NOT EXISTS article_markdown TEXT;
diff --git a/supabase/migrations/003_add_access_level.sql b/supabase/migrations/003_add_access_level.sql
new file mode 100644
index 0000000..356ae2b
--- /dev/null
+++ b/supabase/migrations/003_add_access_level.sql
@@ -0,0 +1,33 @@
+ALTER TABLE wxgzh_ebook_chapters
+ADD COLUMN IF NOT EXISTS access_level TEXT NOT NULL DEFAULT 'free';
+
+ALTER TABLE wxgzh_course_chapters
+ADD COLUMN IF NOT EXISTS access_level TEXT NOT NULL DEFAULT 'free';
+
+UPDATE wxgzh_ebook_chapters
+SET access_level = CASE
+ WHEN is_free THEN 'free'
+ ELSE 'vip'
+END
+WHERE access_level IS NULL OR access_level = 'free';
+
+UPDATE wxgzh_course_chapters
+SET access_level = CASE
+ WHEN is_free THEN 'free'
+ ELSE 'vip'
+END
+WHERE access_level IS NULL OR access_level = 'free';
+
+ALTER TABLE wxgzh_ebook_chapters
+DROP CONSTRAINT IF EXISTS wxgzh_ebook_chapters_access_level_check;
+
+ALTER TABLE wxgzh_course_chapters
+DROP CONSTRAINT IF EXISTS wxgzh_course_chapters_access_level_check;
+
+ALTER TABLE wxgzh_ebook_chapters
+ADD CONSTRAINT wxgzh_ebook_chapters_access_level_check
+CHECK (access_level IN ('free', 'vip', 'svip'));
+
+ALTER TABLE wxgzh_course_chapters
+ADD CONSTRAINT wxgzh_course_chapters_access_level_check
+CHECK (access_level IN ('free', 'vip', 'svip'));
diff --git a/vite.config.js b/vite.config.js
new file mode 100644
index 0000000..4f66126
--- /dev/null
+++ b/vite.config.js
@@ -0,0 +1,43 @@
+import { defineConfig } from 'vite'
+import vue from '@vitejs/plugin-vue'
+import { fileURLToPath, URL } from 'node:url'
+
+// https://vite.dev/config/
+export default defineConfig({
+ plugins: [vue()],
+ server: {
+ host: '0.0.0.0', // 允许局域网访问(手机/其他设备调试)
+ proxy: {
+ '/api': {
+ target: 'http://127.0.0.1:8700', // payH5 本地后端,默认 8700
+ changeOrigin: true,
+ rewrite: (path) => path.replace(/^\/api/, ''),
+ },
+ },
+ allowedHosts: ["vip.dsx2020.com", "localhost", "127.0.0.1", "192.168.41.222"]
+ },
+ preview: {
+ host: '0.0.0.0', // pnpm preview 时也可局域网访问
+ },
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url)),
+ },
+ },
+ build: {
+ target: 'es2020',
+ minify: 'esbuild',
+ rollupOptions: {
+ output: {
+ manualChunks: {
+ 'vue-vendor': ['vue', 'vue-router'],
+ 'vant': ['vant'],
+ 'supabase': ['@supabase/supabase-js'],
+ },
+ chunkFileNames: 'assets/[name]-[hash].js',
+ assetFileNames: 'assets/[name]-[hash][extname]',
+ },
+ },
+ chunkSizeWarningLimit: 600,
+ },
+})
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000..d8e1707
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,1530 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/generator@^7.28.6":
+ version "7.29.1"
+ resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz"
+ integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==
+ dependencies:
+ "@babel/parser" "^7.29.0"
+ "@babel/types" "^7.29.0"
+ "@jridgewell/gen-mapping" "^0.3.12"
+ "@jridgewell/trace-mapping" "^0.3.28"
+ jsesc "^3.0.2"
+
+"@babel/helper-string-parser@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz"
+ integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==
+
+"@babel/helper-validator-identifier@^7.28.5":
+ version "7.28.5"
+ resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz"
+ integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==
+
+"@babel/parser@^7.28.0", "@babel/parser@^7.28.4", "@babel/parser@^7.28.5", "@babel/parser@^7.29.0":
+ version "7.29.0"
+ resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz"
+ integrity sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==
+ dependencies:
+ "@babel/types" "^7.29.0"
+
+"@babel/runtime@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz"
+ integrity sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==
+
+"@babel/types@^7.29.0":
+ version "7.29.0"
+ resolved "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz"
+ integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==
+ dependencies:
+ "@babel/helper-string-parser" "^7.27.1"
+ "@babel/helper-validator-identifier" "^7.28.5"
+
+"@esbuild/aix-ppc64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz"
+ integrity sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==
+
+"@esbuild/android-arm@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.8.tgz"
+ integrity sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==
+
+"@esbuild/android-arm64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz"
+ integrity sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==
+
+"@esbuild/android-x64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.8.tgz"
+ integrity sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==
+
+"@esbuild/darwin-arm64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz"
+ integrity sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==
+
+"@esbuild/darwin-x64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz"
+ integrity sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==
+
+"@esbuild/freebsd-arm64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz"
+ integrity sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==
+
+"@esbuild/freebsd-x64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz"
+ integrity sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==
+
+"@esbuild/linux-arm@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz"
+ integrity sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==
+
+"@esbuild/linux-arm64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz"
+ integrity sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==
+
+"@esbuild/linux-ia32@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz"
+ integrity sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==
+
+"@esbuild/linux-loong64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz"
+ integrity sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==
+
+"@esbuild/linux-mips64el@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz"
+ integrity sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==
+
+"@esbuild/linux-ppc64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz"
+ integrity sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==
+
+"@esbuild/linux-riscv64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz"
+ integrity sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==
+
+"@esbuild/linux-s390x@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz"
+ integrity sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==
+
+"@esbuild/linux-x64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz"
+ integrity sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==
+
+"@esbuild/netbsd-arm64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz"
+ integrity sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==
+
+"@esbuild/netbsd-x64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz"
+ integrity sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==
+
+"@esbuild/openbsd-arm64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz"
+ integrity sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==
+
+"@esbuild/openbsd-x64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz"
+ integrity sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==
+
+"@esbuild/openharmony-arm64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz"
+ integrity sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==
+
+"@esbuild/sunos-x64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz"
+ integrity sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==
+
+"@esbuild/win32-arm64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz"
+ integrity sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==
+
+"@esbuild/win32-ia32@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz"
+ integrity sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==
+
+"@esbuild/win32-x64@0.25.8":
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz"
+ integrity sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==
+
+"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5":
+ version "0.3.13"
+ resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz"
+ integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==
+ dependencies:
+ "@jridgewell/sourcemap-codec" "^1.5.0"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/remapping@^2.3.5":
+ version "2.3.5"
+ resolved "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz"
+ integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/resolve-uri@^3.1.0":
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz"
+ integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
+
+"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5":
+ version "1.5.5"
+ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz"
+ integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==
+
+"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28":
+ version "0.3.31"
+ resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz"
+ integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.1.0"
+ "@jridgewell/sourcemap-codec" "^1.4.14"
+
+"@rolldown/pluginutils@1.0.0-beta.29":
+ version "1.0.0-beta.29"
+ resolved "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.29.tgz"
+ integrity sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==
+
+"@rollup/rollup-android-arm-eabi@4.46.2":
+ version "4.46.2"
+ resolved "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.2.tgz"
+ integrity sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==
+
+"@rollup/rollup-android-arm64@4.46.2":
+ version "4.46.2"
+ resolved "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.2.tgz"
+ integrity sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==
+
+"@rollup/rollup-darwin-arm64@4.46.2":
+ version "4.46.2"
+ resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.2.tgz"
+ integrity sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==
+
+"@rollup/rollup-darwin-x64@4.46.2":
+ version "4.46.2"
+ resolved "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.2.tgz"
+ integrity sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==
+
+"@rollup/rollup-freebsd-arm64@4.46.2":
+ version "4.46.2"
+ resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.2.tgz"
+ integrity sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==
+
+"@rollup/rollup-freebsd-x64@4.46.2":
+ version "4.46.2"
+ resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.2.tgz"
+ integrity sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==
+
+"@rollup/rollup-linux-arm-gnueabihf@4.46.2":
+ version "4.46.2"
+ resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.2.tgz"
+ integrity sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==
+
+"@rollup/rollup-linux-arm-musleabihf@4.46.2":
+ version "4.46.2"
+ resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.2.tgz"
+ integrity sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==
+
+"@rollup/rollup-linux-arm64-gnu@4.46.2":
+ version "4.46.2"
+ resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.2.tgz"
+ integrity sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==
+
+"@rollup/rollup-linux-arm64-musl@4.46.2":
+ version "4.46.2"
+ resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.2.tgz"
+ integrity sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==
+
+"@rollup/rollup-linux-loongarch64-gnu@4.46.2":
+ version "4.46.2"
+ resolved "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.2.tgz"
+ integrity sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==
+
+"@rollup/rollup-linux-ppc64-gnu@4.46.2":
+ version "4.46.2"
+ resolved "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.2.tgz"
+ integrity sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==
+
+"@rollup/rollup-linux-riscv64-gnu@4.46.2":
+ version "4.46.2"
+ resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.2.tgz"
+ integrity sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==
+
+"@rollup/rollup-linux-riscv64-musl@4.46.2":
+ version "4.46.2"
+ resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.2.tgz"
+ integrity sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==
+
+"@rollup/rollup-linux-s390x-gnu@4.46.2":
+ version "4.46.2"
+ resolved "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.2.tgz"
+ integrity sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==
+
+"@rollup/rollup-linux-x64-gnu@4.46.2":
+ version "4.46.2"
+ resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.2.tgz"
+ integrity sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==
+
+"@rollup/rollup-linux-x64-musl@4.46.2":
+ version "4.46.2"
+ resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.2.tgz"
+ integrity sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==
+
+"@rollup/rollup-win32-arm64-msvc@4.46.2":
+ version "4.46.2"
+ resolved "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.2.tgz"
+ integrity sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==
+
+"@rollup/rollup-win32-ia32-msvc@4.46.2":
+ version "4.46.2"
+ resolved "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.2.tgz"
+ integrity sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==
+
+"@rollup/rollup-win32-x64-msvc@4.46.2":
+ version "4.46.2"
+ resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.2.tgz"
+ integrity sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==
+
+"@supabase/auth-js@2.99.0":
+ version "2.99.0"
+ resolved "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.99.0.tgz"
+ integrity sha512-tHiIST/OEoLmWBE+3X69xRY5srJM/lL86KltmMlIfDo9ePJLo14vQQV9T4NF+P+MoGhCwQL1GTmk51zuAFMXKw==
+ dependencies:
+ tslib "2.8.1"
+
+"@supabase/functions-js@2.99.0":
+ version "2.99.0"
+ resolved "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.99.0.tgz"
+ integrity sha512-zA9oad6EqGwMLLu2LfP1bXbqKcJGiotAdbdTfZG7YS7619YZQAEgejj9mp+E5vglKE1yMWbKK+S1J3PbuUtgLg==
+ dependencies:
+ tslib "2.8.1"
+
+"@supabase/postgrest-js@2.99.0":
+ version "2.99.0"
+ resolved "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.99.0.tgz"
+ integrity sha512-8qfOMi2pu9y0IQhUAeFqjrvR49G4ELGevXCWV9qAHXFQ/h2FFh0I8PYjFQj4rHcHSq6hrpozDnS1vbQU8NAQ/A==
+ dependencies:
+ tslib "2.8.1"
+
+"@supabase/realtime-js@2.99.0":
+ version "2.99.0"
+ resolved "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.99.0.tgz"
+ integrity sha512-7nFTZhNeANR7FvEY6PfWLCfE8dHqcaJd9SuR7IPEZvBPG9K4uEHMivpjZx4NWRSU7Eji7ZbKy2LG+cJ48DhwHg==
+ dependencies:
+ "@types/phoenix" "^1.6.6"
+ "@types/ws" "^8.18.1"
+ tslib "2.8.1"
+ ws "^8.18.2"
+
+"@supabase/storage-js@2.99.0":
+ version "2.99.0"
+ resolved "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.99.0.tgz"
+ integrity sha512-mAEEbfsght5EEALejYrwAP9k8sFBGjfMZT8n4SyMXk2iYuWVeRMs1kA/uKg0uDMctWdZ0bL+L4jZzksUJpCjMA==
+ dependencies:
+ iceberg-js "^0.8.1"
+ tslib "2.8.1"
+
+"@supabase/supabase-js@^2.93.3":
+ version "2.99.0"
+ resolved "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.99.0.tgz"
+ integrity sha512-SP9Sn9tsHDB7N4u2gT13rdeZJewE4xibAxasG7vOz+fYi92+XkMMbWNx0uGK53zKTnAnvTs16isRooyBy4sn5w==
+ dependencies:
+ "@supabase/auth-js" "2.99.0"
+ "@supabase/functions-js" "2.99.0"
+ "@supabase/postgrest-js" "2.99.0"
+ "@supabase/realtime-js" "2.99.0"
+ "@supabase/storage-js" "2.99.0"
+
+"@types/estree@1.0.8":
+ version "1.0.8"
+ resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz"
+ integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==
+
+"@types/node@*", "@types/node@^20.19.0 || >=22.12.0":
+ version "25.0.10"
+ resolved "https://registry.npmjs.org/@types/node/-/node-25.0.10.tgz"
+ integrity sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==
+ dependencies:
+ undici-types "~7.16.0"
+
+"@types/phoenix@^1.6.6":
+ version "1.6.7"
+ resolved "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.7.tgz"
+ integrity sha512-oN9ive//QSBkf19rfDv45M7eZPi0eEXylht2OLEXicu5b4KoQ1OzXIw+xDSGWxSxe1JmepRR/ZH283vsu518/Q==
+
+"@types/readable-stream@^4.0.0", "@types/readable-stream@^4.0.21":
+ version "4.0.23"
+ resolved "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.23.tgz"
+ integrity sha512-wwXrtQvbMHxCbBgjHaMGEmImFTQxxpfMOR/ZoQnXxB1woqkUbdLGFDgauo00Py9IudiaqSeiBiulSV9i6XIPig==
+ dependencies:
+ "@types/node" "*"
+
+"@types/ws@^8.18.1":
+ version "8.18.1"
+ resolved "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz"
+ integrity sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==
+ dependencies:
+ "@types/node" "*"
+
+"@vant/popperjs@^1.3.0":
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/@vant/popperjs/-/popperjs-1.3.0.tgz"
+ integrity sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw==
+
+"@vant/use@^1.6.0":
+ version "1.6.0"
+ resolved "https://registry.npmjs.org/@vant/use/-/use-1.6.0.tgz"
+ integrity sha512-PHHxeAASgiOpSmMjceweIrv2AxDZIkWXyaczksMoWvKV2YAYEhoizRuk/xFnKF+emUIi46TsQ+rvlm/t2BBCfA==
+
+"@vitejs/plugin-vue@^6.0.0":
+ version "6.0.1"
+ resolved "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.1.tgz"
+ integrity sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==
+ dependencies:
+ "@rolldown/pluginutils" "1.0.0-beta.29"
+
+"@vue-macros/common@^3.1.1":
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/@vue-macros/common/-/common-3.1.2.tgz"
+ integrity sha512-h9t4ArDdniO9ekYHAD95t9AZcAbb19lEGK+26iAjUODOIJKmObDNBSe4+6ELQAA3vtYiFPPBtHh7+cQCKi3Dng==
+ dependencies:
+ "@vue/compiler-sfc" "^3.5.22"
+ ast-kit "^2.1.2"
+ local-pkg "^1.1.2"
+ magic-string-ast "^1.0.2"
+ unplugin-utils "^0.3.0"
+
+"@vue/compiler-core@3.5.18":
+ version "3.5.18"
+ resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.18.tgz"
+ integrity sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==
+ dependencies:
+ "@babel/parser" "^7.28.0"
+ "@vue/shared" "3.5.18"
+ entities "^4.5.0"
+ estree-walker "^2.0.2"
+ source-map-js "^1.2.1"
+
+"@vue/compiler-core@3.5.30":
+ version "3.5.30"
+ resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.30.tgz"
+ integrity sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==
+ dependencies:
+ "@babel/parser" "^7.29.0"
+ "@vue/shared" "3.5.30"
+ entities "^7.0.1"
+ estree-walker "^2.0.2"
+ source-map-js "^1.2.1"
+
+"@vue/compiler-dom@3.5.18":
+ version "3.5.18"
+ resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz"
+ integrity sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==
+ dependencies:
+ "@vue/compiler-core" "3.5.18"
+ "@vue/shared" "3.5.18"
+
+"@vue/compiler-dom@3.5.30":
+ version "3.5.30"
+ resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.30.tgz"
+ integrity sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==
+ dependencies:
+ "@vue/compiler-core" "3.5.30"
+ "@vue/shared" "3.5.30"
+
+"@vue/compiler-sfc@^3.5.17", "@vue/compiler-sfc@3.5.18":
+ version "3.5.18"
+ resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz"
+ integrity sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==
+ dependencies:
+ "@babel/parser" "^7.28.0"
+ "@vue/compiler-core" "3.5.18"
+ "@vue/compiler-dom" "3.5.18"
+ "@vue/compiler-ssr" "3.5.18"
+ "@vue/shared" "3.5.18"
+ estree-walker "^2.0.2"
+ magic-string "^0.30.17"
+ postcss "^8.5.6"
+ source-map-js "^1.2.1"
+
+"@vue/compiler-sfc@^3.5.22":
+ version "3.5.30"
+ resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.30.tgz"
+ integrity sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A==
+ dependencies:
+ "@babel/parser" "^7.29.0"
+ "@vue/compiler-core" "3.5.30"
+ "@vue/compiler-dom" "3.5.30"
+ "@vue/compiler-ssr" "3.5.30"
+ "@vue/shared" "3.5.30"
+ estree-walker "^2.0.2"
+ magic-string "^0.30.21"
+ postcss "^8.5.8"
+ source-map-js "^1.2.1"
+
+"@vue/compiler-ssr@3.5.18":
+ version "3.5.18"
+ resolved "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz"
+ integrity sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==
+ dependencies:
+ "@vue/compiler-dom" "3.5.18"
+ "@vue/shared" "3.5.18"
+
+"@vue/compiler-ssr@3.5.30":
+ version "3.5.30"
+ resolved "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.30.tgz"
+ integrity sha512-NsYK6OMTnx109PSL2IAyf62JP6EUdk4Dmj6AkWcJGBvN0dQoMYtVekAmdqgTtWQgEJo+Okstbf/1p7qZr5H+bA==
+ dependencies:
+ "@vue/compiler-dom" "3.5.30"
+ "@vue/shared" "3.5.30"
+
+"@vue/devtools-api@^8.0.6":
+ version "8.0.7"
+ resolved "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.0.7.tgz"
+ integrity sha512-tc1TXAxclsn55JblLkFVcIRG7MeSJC4fWsPjfM7qu/IcmPUYnQ5Q8vzWwBpyDY24ZjmZTUCCwjRSNbx58IhlAA==
+ dependencies:
+ "@vue/devtools-kit" "^8.0.7"
+
+"@vue/devtools-kit@^8.0.7":
+ version "8.0.7"
+ resolved "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.0.7.tgz"
+ integrity sha512-H6esJGHGl5q0E9iV3m2EoBQHJ+V83WMW83A0/+Fn95eZ2iIvdsq4+UCS6yT/Fdd4cGZSchx/MdWDreM3WqMsDw==
+ dependencies:
+ "@vue/devtools-shared" "^8.0.7"
+ birpc "^2.6.1"
+ hookable "^5.5.3"
+ perfect-debounce "^2.0.0"
+
+"@vue/devtools-shared@^8.0.7":
+ version "8.0.7"
+ resolved "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.0.7.tgz"
+ integrity sha512-CgAb9oJH5NUmbQRdYDj/1zMiaICYSLtm+B1kxcP72LBrifGAjUmt8bx52dDH1gWRPlQgxGPqpAMKavzVirAEhA==
+
+"@vue/reactivity@3.5.18":
+ version "3.5.18"
+ resolved "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.18.tgz"
+ integrity sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==
+ dependencies:
+ "@vue/shared" "3.5.18"
+
+"@vue/runtime-core@3.5.18":
+ version "3.5.18"
+ resolved "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.18.tgz"
+ integrity sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==
+ dependencies:
+ "@vue/reactivity" "3.5.18"
+ "@vue/shared" "3.5.18"
+
+"@vue/runtime-dom@3.5.18":
+ version "3.5.18"
+ resolved "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz"
+ integrity sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==
+ dependencies:
+ "@vue/reactivity" "3.5.18"
+ "@vue/runtime-core" "3.5.18"
+ "@vue/shared" "3.5.18"
+ csstype "^3.1.3"
+
+"@vue/server-renderer@3.5.18":
+ version "3.5.18"
+ resolved "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.18.tgz"
+ integrity sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==
+ dependencies:
+ "@vue/compiler-ssr" "3.5.18"
+ "@vue/shared" "3.5.18"
+
+"@vue/shared@^3.5.25":
+ version "3.5.27"
+ resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.5.27.tgz"
+ integrity sha512-dXr/3CgqXsJkZ0n9F3I4elY8wM9jMJpP3pvRG52r6m0tu/MsAFIe6JpXVGeNMd/D9F4hQynWT8Rfuj0bdm9kFQ==
+
+"@vue/shared@3.5.18":
+ version "3.5.18"
+ resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz"
+ integrity sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==
+
+"@vue/shared@3.5.30":
+ version "3.5.30"
+ resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.5.30.tgz"
+ integrity sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==
+
+abort-controller@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz"
+ integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==
+ dependencies:
+ event-target-shim "^5.0.0"
+
+acorn@^8.16.0:
+ version "8.16.0"
+ resolved "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz"
+ integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==
+
+amfe-flexible@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.npmjs.org/amfe-flexible/-/amfe-flexible-2.2.1.tgz"
+ integrity sha512-L2VfvDzoETBjhRptg5u/IUuzHSuxm22JpSRb404p/TBGeRfwWmmNEbB+TFPIP/sS/+pbM18bCFH9QnMojLuPNw==
+
+animate.css@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.npmjs.org/animate.css/-/animate.css-4.1.1.tgz"
+ integrity sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ==
+
+ast-kit@^2.1.2, ast-kit@^2.1.3:
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/ast-kit/-/ast-kit-2.2.0.tgz"
+ integrity sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==
+ dependencies:
+ "@babel/parser" "^7.28.5"
+ pathe "^2.0.3"
+
+ast-walker-scope@^0.8.3:
+ version "0.8.3"
+ resolved "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.8.3.tgz"
+ integrity sha512-cbdCP0PGOBq0ASG+sjnKIoYkWMKhhz+F/h9pRexUdX2Hd38+WOlBkRKlqkGOSm0YQpcFMQBJeK4WspUAkwsEdg==
+ dependencies:
+ "@babel/parser" "^7.28.4"
+ ast-kit "^2.1.3"
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz"
+ integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
+
+axios@^1.13.2:
+ version "1.13.2"
+ resolved "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz"
+ integrity sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==
+ dependencies:
+ follow-redirects "^1.15.6"
+ form-data "^4.0.4"
+ proxy-from-env "^1.1.0"
+
+base64-js@^1.3.1:
+ version "1.5.1"
+ resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+birpc@^2.6.1:
+ version "2.9.0"
+ resolved "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz"
+ integrity sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==
+
+bl@^6.0.8:
+ version "6.1.6"
+ resolved "https://registry.npmjs.org/bl/-/bl-6.1.6.tgz"
+ integrity sha512-jLsPgN/YSvPUg9UX0Kd73CXpm2Psg9FxMeCSXnk3WBO3CMT10JMwijubhGfHCnFu6TPn1ei3b975dxv7K2pWVg==
+ dependencies:
+ "@types/readable-stream" "^4.0.0"
+ buffer "^6.0.3"
+ inherits "^2.0.4"
+ readable-stream "^4.2.0"
+
+broker-factory@^3.1.13:
+ version "3.1.13"
+ resolved "https://registry.npmjs.org/broker-factory/-/broker-factory-3.1.13.tgz"
+ integrity sha512-H2VALe31mEtO/SRcNp4cUU5BAm1biwhc/JaF77AigUuni/1YT0FLCJfbUxwIEs9y6Kssjk2fmXgf+Y9ALvmKlw==
+ dependencies:
+ "@babel/runtime" "^7.28.6"
+ fast-unique-numbers "^9.0.26"
+ tslib "^2.8.1"
+ worker-factory "^7.0.48"
+
+buffer-from@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz"
+ integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+
+buffer@^6.0.3:
+ version "6.0.3"
+ resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz"
+ integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.2.1"
+
+call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz"
+ integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==
+ dependencies:
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+
+chokidar@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz"
+ integrity sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==
+ dependencies:
+ readdirp "^5.0.0"
+
+combined-stream@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+commist@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.npmjs.org/commist/-/commist-3.2.0.tgz"
+ integrity sha512-4PIMoPniho+LqXmpS5d3NuGYncG6XWlkBSVGiWycL22dd42OYdUGil2CWuzklaJoNxyxUSpO4MKIBU94viWNAw==
+
+concat-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz"
+ integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^3.0.2"
+ typedarray "^0.0.6"
+
+confbox@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz"
+ integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==
+
+confbox@^0.2.2:
+ version "0.2.4"
+ resolved "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz"
+ integrity sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==
+
+copy-anything@^2.0.1:
+ version "2.0.6"
+ resolved "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz"
+ integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==
+ dependencies:
+ is-what "^3.14.1"
+
+csstype@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz"
+ integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
+
+debug@^4.3.1, debug@^4.3.4, debug@^4.4.1:
+ version "4.4.3"
+ resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz"
+ integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==
+ dependencies:
+ ms "^2.1.3"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
+ integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
+
+dunder-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz"
+ integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==
+ dependencies:
+ call-bind-apply-helpers "^1.0.1"
+ es-errors "^1.3.0"
+ gopd "^1.2.0"
+
+entities@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz"
+ integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
+
+entities@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz"
+ integrity sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==
+
+errno@^0.1.1:
+ version "0.1.8"
+ resolved "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz"
+ integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
+ dependencies:
+ prr "~1.0.1"
+
+es-define-property@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz"
+ integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==
+
+es-errors@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz"
+ integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
+
+es-object-atoms@^1.0.0, es-object-atoms@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz"
+ integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==
+ dependencies:
+ es-errors "^1.3.0"
+
+es-set-tostringtag@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz"
+ integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==
+ dependencies:
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.6"
+ has-tostringtag "^1.0.2"
+ hasown "^2.0.2"
+
+esbuild@^0.25.0:
+ version "0.25.8"
+ resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.8.tgz"
+ integrity sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==
+ optionalDependencies:
+ "@esbuild/aix-ppc64" "0.25.8"
+ "@esbuild/android-arm" "0.25.8"
+ "@esbuild/android-arm64" "0.25.8"
+ "@esbuild/android-x64" "0.25.8"
+ "@esbuild/darwin-arm64" "0.25.8"
+ "@esbuild/darwin-x64" "0.25.8"
+ "@esbuild/freebsd-arm64" "0.25.8"
+ "@esbuild/freebsd-x64" "0.25.8"
+ "@esbuild/linux-arm" "0.25.8"
+ "@esbuild/linux-arm64" "0.25.8"
+ "@esbuild/linux-ia32" "0.25.8"
+ "@esbuild/linux-loong64" "0.25.8"
+ "@esbuild/linux-mips64el" "0.25.8"
+ "@esbuild/linux-ppc64" "0.25.8"
+ "@esbuild/linux-riscv64" "0.25.8"
+ "@esbuild/linux-s390x" "0.25.8"
+ "@esbuild/linux-x64" "0.25.8"
+ "@esbuild/netbsd-arm64" "0.25.8"
+ "@esbuild/netbsd-x64" "0.25.8"
+ "@esbuild/openbsd-arm64" "0.25.8"
+ "@esbuild/openbsd-x64" "0.25.8"
+ "@esbuild/openharmony-arm64" "0.25.8"
+ "@esbuild/sunos-x64" "0.25.8"
+ "@esbuild/win32-arm64" "0.25.8"
+ "@esbuild/win32-ia32" "0.25.8"
+ "@esbuild/win32-x64" "0.25.8"
+
+estree-walker@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz"
+ integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
+
+event-target-shim@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz"
+ integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
+
+events@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz"
+ integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
+exsolve@^1.0.7:
+ version "1.0.8"
+ resolved "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz"
+ integrity sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==
+
+fast-unique-numbers@^9.0.26:
+ version "9.0.26"
+ resolved "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-9.0.26.tgz"
+ integrity sha512-3Mtq8p1zQinjGyWfKeuBunbuFoixG72AUkk4VvzbX4ykCW9Q4FzRaNyIlfQhUjnKw2ARVP+/CKnoyr6wfHftig==
+ dependencies:
+ "@babel/runtime" "^7.28.6"
+ tslib "^2.8.1"
+
+fdir@^6.4.6, fdir@^6.5.0:
+ version "6.5.0"
+ resolved "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz"
+ integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==
+
+follow-redirects@^1.15.6:
+ version "1.15.11"
+ resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz"
+ integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==
+
+form-data@^4.0.4:
+ version "4.0.5"
+ resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz"
+ integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ es-set-tostringtag "^2.1.0"
+ hasown "^2.0.2"
+ mime-types "^2.1.12"
+
+fsevents@~2.3.2, fsevents@~2.3.3:
+ version "2.3.3"
+ resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz"
+ integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
+function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
+get-intrinsic@^1.2.6:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz"
+ integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==
+ 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-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz"
+ integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==
+ dependencies:
+ dunder-proto "^1.0.1"
+ es-object-atoms "^1.0.0"
+
+gopd@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz"
+ integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==
+
+graceful-fs@^4.1.2:
+ version "4.2.11"
+ resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
+has-symbols@^1.0.3, has-symbols@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz"
+ integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==
+
+has-tostringtag@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz"
+ integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
+ dependencies:
+ has-symbols "^1.0.3"
+
+hasown@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz"
+ integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
+ dependencies:
+ function-bind "^1.1.2"
+
+help-me@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz"
+ integrity sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==
+
+hookable@^5.5.3:
+ version "5.5.3"
+ resolved "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz"
+ integrity sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==
+
+iceberg-js@^0.8.1:
+ version "0.8.1"
+ resolved "https://registry.npmjs.org/iceberg-js/-/iceberg-js-0.8.1.tgz"
+ integrity sha512-1dhVQZXhcHje7798IVM+xoo/1ZdVfzOMIc8/rgVSijRK38EDqOJoGula9N/8ZI5RD8QTxNQtK/Gozpr+qUqRRA==
+
+iconv-lite@^0.6.3:
+ version "0.6.3"
+ resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz"
+ integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3.0.0"
+
+ieee754@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+image-size@~0.5.0:
+ version "0.5.5"
+ resolved "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz"
+ integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==
+
+inherits@^2.0.3, inherits@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+ip-address@^10.0.1:
+ version "10.1.0"
+ resolved "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz"
+ integrity sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==
+
+is-what@^3.14.1:
+ version "3.14.1"
+ resolved "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz"
+ integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==
+
+js-sdsl@4.3.0:
+ version "4.3.0"
+ resolved "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz"
+ integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==
+
+jsesc@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz"
+ integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==
+
+json5@^2.2.3:
+ version "2.2.3"
+ resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz"
+ integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+
+less@^4.0.0, less@^4.4.0:
+ version "4.4.0"
+ resolved "https://registry.npmjs.org/less/-/less-4.4.0.tgz"
+ integrity sha512-kdTwsyRuncDfjEs0DlRILWNvxhDG/Zij4YLO4TMJgDLW+8OzpfkdPnRgrsRuY1o+oaxJGWsps5f/RVBgGmmN0w==
+ dependencies:
+ copy-anything "^2.0.1"
+ parse-node-version "^1.0.1"
+ tslib "^2.3.0"
+ optionalDependencies:
+ errno "^0.1.1"
+ graceful-fs "^4.1.2"
+ image-size "~0.5.0"
+ make-dir "^2.1.0"
+ mime "^1.4.1"
+ needle "^3.1.0"
+ source-map "~0.6.0"
+
+local-pkg@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz"
+ integrity sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==
+ dependencies:
+ mlly "^1.7.4"
+ pkg-types "^2.3.0"
+ quansync "^0.2.11"
+
+lru-cache@^10.4.3:
+ version "10.4.3"
+ resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz"
+ integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==
+
+magic-string-ast@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-1.0.3.tgz"
+ integrity sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==
+ dependencies:
+ magic-string "^0.30.19"
+
+magic-string@^0.30.17, magic-string@^0.30.19, magic-string@^0.30.21:
+ version "0.30.21"
+ resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz"
+ integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==
+ dependencies:
+ "@jridgewell/sourcemap-codec" "^1.5.5"
+
+make-dir@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz"
+ integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
+ dependencies:
+ pify "^4.0.1"
+ semver "^5.6.0"
+
+marked@^17.0.4:
+ version "17.0.4"
+ resolved "https://registry.npmjs.org/marked/-/marked-17.0.4.tgz"
+ integrity sha512-NOmVMM+KAokHMvjWmC5N/ZOvgmSWuqJB8FoYI019j4ogb/PeRMKoKIjReZ2w3376kkA8dSJIP8uD993Kxc0iRQ==
+
+math-intrinsics@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz"
+ integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==
+
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@^2.1.12:
+ version "2.1.35"
+ resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.0"
+
+mime@^1.4.1:
+ version "1.6.0"
+ resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+minimist@^1.2.8:
+ version "1.2.8"
+ resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz"
+ integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+
+mitt@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz"
+ integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==
+
+mlly@^1.7.4, mlly@^1.8.0:
+ version "1.8.1"
+ resolved "https://registry.npmjs.org/mlly/-/mlly-1.8.1.tgz"
+ integrity sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==
+ dependencies:
+ acorn "^8.16.0"
+ pathe "^2.0.3"
+ pkg-types "^1.3.1"
+ ufo "^1.6.3"
+
+mqtt-packet@^9.0.2:
+ version "9.0.2"
+ resolved "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-9.0.2.tgz"
+ integrity sha512-MvIY0B8/qjq7bKxdN1eD+nrljoeaai+qjLJgfRn3TiMuz0pamsIWY2bFODPZMSNmabsLANXsLl4EMoWvlaTZWA==
+ dependencies:
+ bl "^6.0.8"
+ debug "^4.3.4"
+ process-nextick-args "^2.0.1"
+
+mqtt@^5.14.1:
+ version "5.14.1"
+ resolved "https://registry.npmjs.org/mqtt/-/mqtt-5.14.1.tgz"
+ integrity sha512-NxkPxE70Uq3Ph7goefQa7ggSsVzHrayCD0OyxlJgITN/EbzlZN+JEPmaAZdxP1LsIT5FamDyILoQTF72W7Nnbw==
+ dependencies:
+ "@types/readable-stream" "^4.0.21"
+ "@types/ws" "^8.18.1"
+ commist "^3.2.0"
+ concat-stream "^2.0.0"
+ debug "^4.4.1"
+ help-me "^5.0.0"
+ lru-cache "^10.4.3"
+ minimist "^1.2.8"
+ mqtt-packet "^9.0.2"
+ number-allocator "^1.0.14"
+ readable-stream "^4.7.0"
+ rfdc "^1.4.1"
+ socks "^2.8.6"
+ split2 "^4.2.0"
+ worker-timers "^8.0.23"
+ ws "^8.18.3"
+
+ms@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+muggle-string@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz"
+ integrity sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==
+
+nanoid@^3.3.11:
+ version "3.3.11"
+ resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz"
+ integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
+
+needle@^3.1.0:
+ version "3.3.1"
+ resolved "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz"
+ integrity sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==
+ dependencies:
+ iconv-lite "^0.6.3"
+ sax "^1.2.4"
+
+number-allocator@^1.0.14:
+ version "1.0.14"
+ resolved "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.14.tgz"
+ integrity sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==
+ dependencies:
+ debug "^4.3.1"
+ js-sdsl "4.3.0"
+
+parse-node-version@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz"
+ integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==
+
+pathe@^2.0.1, pathe@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz"
+ integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==
+
+perfect-debounce@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz"
+ integrity sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==
+
+picocolors@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz"
+ integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
+
+"picomatch@^3 || ^4", picomatch@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz"
+ integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==
+
+pify@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz"
+ integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
+
+pkg-types@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz"
+ integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==
+ dependencies:
+ confbox "^0.1.8"
+ mlly "^1.7.4"
+ pathe "^2.0.1"
+
+pkg-types@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz"
+ integrity sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==
+ dependencies:
+ confbox "^0.2.2"
+ exsolve "^1.0.7"
+ pathe "^2.0.3"
+
+postcss-pxtorem@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.npmjs.org/postcss-pxtorem/-/postcss-pxtorem-6.1.0.tgz"
+ integrity sha512-ROODSNci9ADal3zUcPHOF/K83TiCgNSPXQFSbwyPHNV8ioHIE4SaC+FPOufd8jsr5jV2uIz29v1Uqy1c4ov42g==
+
+postcss@^8.0.0, postcss@^8.5.6, postcss@^8.5.8:
+ version "8.5.8"
+ resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz"
+ integrity sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==
+ dependencies:
+ nanoid "^3.3.11"
+ picocolors "^1.1.1"
+ source-map-js "^1.2.1"
+
+process-nextick-args@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz"
+ integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
+
+proxy-from-env@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz"
+ integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
+
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz"
+ integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==
+
+quansync@^0.2.11:
+ version "0.2.11"
+ resolved "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz"
+ integrity sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==
+
+readable-stream@^3.0.2:
+ version "3.6.2"
+ resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz"
+ integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+readable-stream@^4.2.0, readable-stream@^4.7.0:
+ version "4.7.0"
+ resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz"
+ integrity sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==
+ dependencies:
+ abort-controller "^3.0.0"
+ buffer "^6.0.3"
+ events "^3.3.0"
+ process "^0.11.10"
+ string_decoder "^1.3.0"
+
+readdirp@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz"
+ integrity sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==
+
+rfdc@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz"
+ integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==
+
+rollup@^4.40.0:
+ version "4.46.2"
+ resolved "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz"
+ integrity sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==
+ dependencies:
+ "@types/estree" "1.0.8"
+ optionalDependencies:
+ "@rollup/rollup-android-arm-eabi" "4.46.2"
+ "@rollup/rollup-android-arm64" "4.46.2"
+ "@rollup/rollup-darwin-arm64" "4.46.2"
+ "@rollup/rollup-darwin-x64" "4.46.2"
+ "@rollup/rollup-freebsd-arm64" "4.46.2"
+ "@rollup/rollup-freebsd-x64" "4.46.2"
+ "@rollup/rollup-linux-arm-gnueabihf" "4.46.2"
+ "@rollup/rollup-linux-arm-musleabihf" "4.46.2"
+ "@rollup/rollup-linux-arm64-gnu" "4.46.2"
+ "@rollup/rollup-linux-arm64-musl" "4.46.2"
+ "@rollup/rollup-linux-loongarch64-gnu" "4.46.2"
+ "@rollup/rollup-linux-ppc64-gnu" "4.46.2"
+ "@rollup/rollup-linux-riscv64-gnu" "4.46.2"
+ "@rollup/rollup-linux-riscv64-musl" "4.46.2"
+ "@rollup/rollup-linux-s390x-gnu" "4.46.2"
+ "@rollup/rollup-linux-x64-gnu" "4.46.2"
+ "@rollup/rollup-linux-x64-musl" "4.46.2"
+ "@rollup/rollup-win32-arm64-msvc" "4.46.2"
+ "@rollup/rollup-win32-ia32-msvc" "4.46.2"
+ "@rollup/rollup-win32-x64-msvc" "4.46.2"
+ fsevents "~2.3.2"
+
+safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+"safer-buffer@>= 2.1.2 < 3.0.0":
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+sax@^1.2.4:
+ version "1.4.1"
+ resolved "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz"
+ integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==
+
+scule@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz"
+ integrity sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==
+
+semver@^5.6.0:
+ version "5.7.2"
+ resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz"
+ integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
+
+smart-buffer@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz"
+ integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==
+
+socks@^2.8.6:
+ version "2.8.7"
+ resolved "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz"
+ integrity sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==
+ dependencies:
+ ip-address "^10.0.1"
+ smart-buffer "^4.2.0"
+
+source-map-js@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz"
+ integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
+
+source-map@~0.6.0:
+ version "0.6.1"
+ resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+split2@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz"
+ integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==
+
+string_decoder@^1.1.1, string_decoder@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+tinyglobby@^0.2.14, tinyglobby@^0.2.15:
+ version "0.2.15"
+ resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz"
+ integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==
+ dependencies:
+ fdir "^6.5.0"
+ picomatch "^4.0.3"
+
+tslib@^2.3.0, tslib@^2.8.1, tslib@2.8.1:
+ version "2.8.1"
+ resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz"
+ integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz"
+ integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==
+
+ufo@^1.6.3:
+ version "1.6.3"
+ resolved "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz"
+ integrity sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==
+
+undici-types@~7.16.0:
+ version "7.16.0"
+ resolved "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz"
+ integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==
+
+unplugin-utils@^0.3.0, unplugin-utils@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.1.tgz"
+ integrity sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==
+ dependencies:
+ pathe "^2.0.3"
+ picomatch "^4.0.3"
+
+unplugin@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/unplugin/-/unplugin-3.0.0.tgz"
+ integrity sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==
+ dependencies:
+ "@jridgewell/remapping" "^2.3.5"
+ picomatch "^4.0.3"
+ webpack-virtual-modules "^0.6.2"
+
+util-deprecate@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
+ integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
+
+vant@^4.9.22:
+ version "4.9.22"
+ resolved "https://registry.npmjs.org/vant/-/vant-4.9.22.tgz"
+ integrity sha512-P2PDSj3oB6l3W1OpVlQpapeLmI6bXMSvPqPdrw5rutslC0Y6tSkrVB/iSD57weD7K92GsjGkvgDK0eZlOsXGqw==
+ dependencies:
+ "@vant/popperjs" "^1.3.0"
+ "@vant/use" "^1.6.0"
+ "@vue/shared" "^3.5.25"
+
+"vite@^5.0.0 || ^6.0.0 || ^7.0.0", vite@^7.0.4:
+ version "7.0.6"
+ resolved "https://registry.npmjs.org/vite/-/vite-7.0.6.tgz"
+ integrity sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==
+ dependencies:
+ esbuild "^0.25.0"
+ fdir "^6.4.6"
+ picomatch "^4.0.3"
+ postcss "^8.5.6"
+ rollup "^4.40.0"
+ tinyglobby "^0.2.14"
+ optionalDependencies:
+ fsevents "~2.3.3"
+
+vue-router@^5.0.3:
+ version "5.0.3"
+ resolved "https://registry.npmjs.org/vue-router/-/vue-router-5.0.3.tgz"
+ integrity sha512-nG1c7aAFac7NYj8Hluo68WyWfc41xkEjaR0ViLHCa3oDvTQ/nIuLJlXJX1NUPw/DXzx/8+OKMng045HHQKQKWw==
+ dependencies:
+ "@babel/generator" "^7.28.6"
+ "@vue-macros/common" "^3.1.1"
+ "@vue/devtools-api" "^8.0.6"
+ ast-walker-scope "^0.8.3"
+ chokidar "^5.0.0"
+ json5 "^2.2.3"
+ local-pkg "^1.1.2"
+ magic-string "^0.30.21"
+ mlly "^1.8.0"
+ muggle-string "^0.4.1"
+ pathe "^2.0.3"
+ picomatch "^4.0.3"
+ scule "^1.3.0"
+ tinyglobby "^0.2.15"
+ unplugin "^3.0.0"
+ unplugin-utils "^0.3.1"
+ yaml "^2.8.2"
+
+"vue@^2.7.0 || ^3.2.25", vue@^3.0.0, vue@^3.2.25, vue@^3.5.0, vue@^3.5.17, vue@3.5.18:
+ version "3.5.18"
+ resolved "https://registry.npmjs.org/vue/-/vue-3.5.18.tgz"
+ integrity sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==
+ dependencies:
+ "@vue/compiler-dom" "3.5.18"
+ "@vue/compiler-sfc" "3.5.18"
+ "@vue/runtime-dom" "3.5.18"
+ "@vue/server-renderer" "3.5.18"
+ "@vue/shared" "3.5.18"
+
+webpack-virtual-modules@^0.6.2:
+ version "0.6.2"
+ resolved "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz"
+ integrity sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==
+
+worker-factory@^7.0.48:
+ version "7.0.48"
+ resolved "https://registry.npmjs.org/worker-factory/-/worker-factory-7.0.48.tgz"
+ integrity sha512-CGmBy3tJvpBPjUvb0t4PrpKubUsfkI1Ohg0/GGFU2RvA9j/tiVYwKU8O7yu7gH06YtzbeJLzdUR29lmZKn5pag==
+ dependencies:
+ "@babel/runtime" "^7.28.6"
+ fast-unique-numbers "^9.0.26"
+ tslib "^2.8.1"
+
+worker-timers-broker@^8.0.15:
+ version "8.0.15"
+ resolved "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-8.0.15.tgz"
+ integrity sha512-Te+EiVUMzG5TtHdmaBZvBrZSFNauym6ImDaCAnzQUxvjnw+oGjMT2idmAOgDy30vOZMLejd0bcsc90Axu6XPWA==
+ dependencies:
+ "@babel/runtime" "^7.28.6"
+ broker-factory "^3.1.13"
+ fast-unique-numbers "^9.0.26"
+ tslib "^2.8.1"
+ worker-timers-worker "^9.0.13"
+
+worker-timers-worker@^9.0.13:
+ version "9.0.13"
+ resolved "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-9.0.13.tgz"
+ integrity sha512-qjn18szGb1kjcmh2traAdki1eiIS5ikFo+L90nfMOvSRpuDw1hAcR1nzkP2+Hkdqz5thIRnfuWx7QSpsEUsA6Q==
+ dependencies:
+ "@babel/runtime" "^7.28.6"
+ tslib "^2.8.1"
+ worker-factory "^7.0.48"
+
+worker-timers@^8.0.23:
+ version "8.0.29"
+ resolved "https://registry.npmjs.org/worker-timers/-/worker-timers-8.0.29.tgz"
+ integrity sha512-9jk0MWHhWAZ2xlJPXr45oe5UF/opdpfZrY0HtyPizWuJ+ce1M3IYk/4IIdGct3kn9Ncfs+tkZt3w1tU6KW2Fsg==
+ dependencies:
+ "@babel/runtime" "^7.28.6"
+ tslib "^2.8.1"
+ worker-timers-broker "^8.0.15"
+ worker-timers-worker "^9.0.13"
+
+ws@^8.18.2, ws@^8.18.3:
+ version "8.19.0"
+ resolved "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz"
+ integrity sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==
+
+yaml@^2.4.2, yaml@^2.8.2:
+ version "2.8.2"
+ resolved "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz"
+ integrity sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==