diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..dbcc2f3 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,39 @@ +# 依赖 +node_modules +npm-debug.log +yarn-error.log +yarn-debug.log +package-lock.json + +# 构建产物 +dist +build + +# 环境变量 +.env.local +.env.*.local + +# IDE +.vscode +.idea +*.swp +*.swo +.DS_Store + +# Git +.git +.gitignore +.gitattributes + +# 文档 +README.md +*.md + +# 测试 +coverage +.nyc_output + +# 其他 +*.log +temp +tmp diff --git a/.env.development b/.env.development index 083c815..4db40c6 100644 --- a/.env.development +++ b/.env.development @@ -1 +1,71 @@ -NODE_ENV=development \ No newline at end of file +NODE_ENV=development + +# 百度翻译API配置 +VITE_BAIDU_APP_ID=your_baidu_app_id_here +VITE_BAIDU_SECRET_KEY=your_baidu_secret_key_here + +# DeepSeek/OpenAI API配置 +VITE_OPENAI_BASE_URL=https://api.deepseek.com +VITE_OPENAI_API_KEY=your_openai_api_key_here + +# 动漫漫画配置 +BCOMIC_API_BASE_URL=your_bcomic_api_base_url_here + +# 黄金配置 +VITE_GOLD_API_BASE_URL=your_gold_api_base_url_here + +# 开发环境使用本地 Hono 代理(局域网可访问) +# Vite 代理配置,自动转发到本地 Hono 服务器 +VITE_API_BASE_URL=/api +VITE_PROXY_TARGET=http://localhost:3001 + +# Google OAuth 配置 +VITE_GOOGLE_CLIENT_ID=your_google_client_id_here + +# GitHub OAuth 配置 +VITE_GITHUB_CLIENT_ID=your_github_client_id_here + +# 论文API配置 +VITE_PAPERS_API_URL=your_papers_api_url_here + +# EmailJS 配置 +VITE_EMAILJS_PUBLIC_KEY=YOUR_PUBLIC_KEY_HERE +VITE_EMAILJS_SERVICE_ID=YOUR_SERVICE_ID_HERE +VITE_EMAILJS_TEMPLATE_ID=YOUR_TEMPLATE_ID_HERE +VITE_EMAILJS_FROM_NAME=ChattyPlay +VITE_EMAILJS_FROM_EMAIL=891523233@qq.com + +# 视频去水印解析下载配置 +VIDEO_PARSE_API_BASE_URL=your_video_parse_api_base_url_here + +# 视频解析接口列表 +VITE_VIDEO_PARSE_URL1=your_video_parse_url1_here +VITE_VIDEO_PARSE_URL2=your_video_parse_url2_here +VITE_VIDEO_PARSE_URL3=your_video_parse_url3_here +VITE_VIDEO_PARSE_URL4=your_video_parse_url4_here +VITE_VIDEO_PARSE_URL5=your_video_parse_url5_here + +# 埋点SDK配置 +VITE_ANALYTICS_REPORT_URL=your_analytics_report_url_here + +# agent配置 +VITE_AGENT_API_URL=your_agent_api_url_here + +# Redis配置 +UPSTASH_REDIS_REST_URL=https://your-redis-url.upstash.io +UPSTASH_REDIS_REST_TOKEN=your_redis_token_here + +# hcaptcha 配置 +VITE_HCAPTCHA_SITE_KEY=your_hcaptcha_site_key_here + +# Cloudflare Turnstile 配置 +VITE_TURNSTILE_SITE_KEY=your_turnstile_site_key_here +TURNSTILE_SECRET_KEY=your_turnstile_secret_key_here + +# 支付 +VITE_PAY_URL=your_pay_url_here +VITE_PAY_BEARER_KEY=your_pay_bearer_key_here + +# 闲鱼常驻后端 +VITE_GOOFISH_API_URL=your_goofish_api_url_here +VITE_GOOFISH_WS_URL=your_goofish_ws_url_here diff --git a/.env.production b/.env.production index 995fca4..28dd650 100644 --- a/.env.production +++ b/.env.production @@ -1 +1,70 @@ -NODE_ENV=production \ No newline at end of file +NODE_ENV=production + +# 百度翻译API配置 +VITE_BAIDU_APP_ID=your_baidu_app_id_here +VITE_BAIDU_SECRET_KEY=your_baidu_secret_key_here + +# DeepSeek/OpenAI API配置 +VITE_OPENAI_BASE_URL=https://api.deepseek.com +VITE_OPENAI_API_KEY=your_openai_api_key_here + +# 动漫漫画配置 +BCOMIC_API_BASE_URL=your_bcomic_api_base_url_here + +# 黄金配置 +VITE_GOLD_API_BASE_URL=your_gold_api_base_url_here + +# 生产环境使用宝塔服务器 +# 部署到 http://123.60.91.107/ +VITE_API_BASE_URL=http://123.60.91.107:3001/api + +# Google OAuth 配置 +VITE_GOOGLE_CLIENT_ID=your_google_client_id_here + +# GitHub OAuth 配置 +VITE_GITHUB_CLIENT_ID=your_github_client_id_here + +# 论文API配置 +VITE_PAPERS_API_URL=your_papers_api_url_here + +# EmailJS 配置 +VITE_EMAILJS_PUBLIC_KEY=YOUR_PUBLIC_KEY_HERE +VITE_EMAILJS_SERVICE_ID=YOUR_SERVICE_ID_HERE +VITE_EMAILJS_TEMPLATE_ID=YOUR_TEMPLATE_ID_HERE +VITE_EMAILJS_FROM_NAME=ChattyPlay +VITE_EMAILJS_FROM_EMAIL=891523233@qq.com + +# 视频去水印解析下载配置 +VIDEO_PARSE_API_BASE_URL=your_video_parse_api_base_url_here + +# 视频解析接口列表 +VITE_VIDEO_PARSE_URL1=your_video_parse_url1_here +VITE_VIDEO_PARSE_URL2=your_video_parse_url2_here +VITE_VIDEO_PARSE_URL3=your_video_parse_url3_here +VITE_VIDEO_PARSE_URL4=your_video_parse_url4_here +VITE_VIDEO_PARSE_URL5=your_video_parse_url5_here + +# 埋点SDK配置 +VITE_ANALYTICS_REPORT_URL=your_analytics_report_url_here + +# agent配置 +VITE_AGENT_API_URL=your_agent_api_url_here + +# Redis配置 +UPSTASH_REDIS_REST_URL=https://your-redis-url.upstash.io +UPSTASH_REDIS_REST_TOKEN=your_redis_token_here + +# hcaptcha 配置 +VITE_HCAPTCHA_SITE_KEY=your_hcaptcha_site_key_here + +# Cloudflare Turnstile 配置 +VITE_TURNSTILE_SITE_KEY=your_turnstile_site_key_here +TURNSTILE_SECRET_KEY=your_turnstile_secret_key_here + +# 支付 +VITE_PAY_URL=your_pay_url_here +VITE_PAY_BEARER_KEY=your_pay_bearer_key_here + +# 闲鱼常驻后端 +VITE_GOOFISH_API_URL=your_goofish_api_url_here +VITE_GOOFISH_WS_URL=your_goofish_ws_url_here diff --git a/.gitignore b/.gitignore index 403adbc..24ad949 100644 --- a/.gitignore +++ b/.gitignore @@ -2,10 +2,19 @@ node_modules /dist +# 闲鱼日志文件 +/logs +# 闲鱼数据库文件 +/data -# local env files + +# local env files - ignore all .env files except .env.example +.env .env.local .env.*.local +.env.development +.env.production +.env.test # Log files npm-debug.log* diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..7852bd4 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,35 @@ +# 多阶段构建 - 构建阶段 +FROM node:20-alpine AS builder + +# 设置工作目录 +WORKDIR /app + +# 安装 yarn +RUN corepack enable && corepack prepare yarn@stable --activate + +# 复制 package.json 和 yarn.lock +COPY package.json yarn.lock ./ + +# 安装依赖 +RUN yarn install --frozen-lockfile + +# 复制源代码 +COPY . . + +# 构建生产环境代码 +RUN yarn build + +# 生产阶段 - 使用 nginx 托管静态文件 +FROM nginx:alpine + +# 复制 nginx 配置 +COPY nginx.conf /etc/nginx/conf.d/default.conf + +# 从构建阶段复制构建产物 +COPY --from=builder /app/dist /usr/share/nginx/html + +# 暴露端口 +EXPOSE 80 + +# 启动 nginx +CMD ["nginx", "-g", "daemon off;"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index 743572c..04407d5 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,461 @@ -# vip-video-parsing +

+

ChattyPlay-Agent

+ ChattyPlay-Agent | Trendshift +

+ Github Stargazers + Github Forks + Github Licence +
+ 支持平台 +

+

-## Project setup -``` -npm install -``` +## 📄 免责声明 -### Compiles and hot-reloads for development -``` -npm run serve -``` +### 本项目提供音乐、影视解析及下载、实时黄金及K线图、动漫漫画、Hugging Face论文、Latex和Markdown编辑、思维导图、闲鱼助手和ChatGPT相关服务,仅供学习使用,请勿用于任何商业用途。如你有更好的想法、建议、或不解的问题,欢迎提PR或Issues!如有侵权,请联系我! -### Compiles and minifies for production -``` -npm run build -``` +> License:ChattyPlay-Agent is licensed under the Apache-2.0 License. See the [LICENSE](https://github.com/P1kaj1uu/ChattyPlay-Agent/blob/master/LICENSE) file for more information. -### Customize configuration -See [Configuration Reference](https://cli.vuejs.org/config/). +> 项目描述参考信息可跳转WiKi:https://github.com/P1kaj1uu/ChattyPlay-Agent/wiki/%E4%BD%BF%E7%94%A8%E6%96%87%E6%A1%A3 + +> PC端、移动端均已适配 + +## 🚀 在线体验 + +- 体验地址:在线体验(需要科学上网工具访问) +- 视频预览:录频视频 +- 备注:如使用ChatGPT服务,我的APIKey配额有限,希望大家能省点用谢谢! + +## 📦 相关项目 + +如果你更习惯在终端里工作,可以试试我的另一个项目: + +- **[ChattyPlay-Agent-Terminal](https://github.com/P1kaj1uu/ChattyPlay-Agent-Terminal)** + **终端 AI 编程助手**,在 shell 里直接调用 AI 写代码、改 bug、解释代码、操作文件... + +## 📖 版本迭代 + +- v1.0版本已完成(2023.1.7凌晨) +- v1.1版本优化观看页面的提示内容(2023.1.7上午) +- v1.2版本优化解析接口(2023.1.8下午) +- v1.3版本优化帮助内容页面(2023.1.8下午) +- v1.4版本优化分离加载爱心跳动效果(2023.1.9上午) +- v1.5版本增加多个能用的视频解析接口(2023.1.14晚上) +- v1.6版本禁止F12查看源代码(2023.1.19上午) +- v1.7版本增加并优化解析视频接口(2023.1.19下午) +- v1.8版本浏览器兼容判断浏览器类型(2023.1.20晚上) +- v2.0版本优化页面样式,增加首页听音乐功能(2023.4.22下午) +- v2.1版本增加论文降重功能(2023.4.30全天) +- v2.2版本接入ChatGPT服务,可无需再代理和APIkey(2023.5.1-2023.5.3) +- v2.3版本优化ChatGPT服务,检测自动换行,并支持上下文对话(2023.5.6-2023.5.7) +- v2.4版本代仓本地的部分接口隐藏不对外开放(2023.5.7晚上) +- v2.5版本输出代码高亮显示,流式处理EventStream,并支持会话存储(2023.5.13-2023.5.14) +- v2.6版本接入文心一言基础服务,增加语音聊天、语音朗读功能(2023.5.20-2023.5.21) +- v2.7版本前端也做限流处理,增加验证功能,防止接口被恶意多次请求(2023.5.24晚上) +- v2.8版本优化加载效果,增加网站访问次数统计和版本更新提醒用户功能(2023.5.26-2023.5.27) +- v2.9版本整体优化代码,修复bug,并抽离封装部分函数和组件,降低复杂度,实现高内聚低耦合(2023.6.10-2023.6.20) +- v3.0全新版本上线,优化markdown代码块格式,并接入文生图、亚马逊爬虫服务,发布浏览器插件(2023.7.24-2023.8.13) +- v4.0重构项目完成,修改相关的bug,页面结构样式重新设计,增加实时黄金及k线图、动漫漫画和Hugging Face论文功能,优化用户体验,并完成移动端和PC端的适配,添加版本检测弹窗更新功能,接入SDK、MCP、Agent、谷歌和Github授权登录等服务,同时系统整体架构将Vue2替换为React + TypeScript + Hono + Vite + Tailwind CSS + i18n国际化 + live2d看板娘 + nginx + Docker容器化管理(2025.12.16-2026.2.10) +- v4.1闲鱼助手,可自动回复、自动发货等(2026.2.26-2026.3.7) +- v4.2思维导图和Markdown格式预览及编辑,导出图片。论文PDF预览及AI问答(2026.3.9-2026.3.11) +- v4.3解析下载无水印1080P视频(2026.3.13-2026.3.14) +- v4.4封装浏览器指纹SDK、GIF图片埋点SDK,接入Google Analytics分析工具(2026.3.15-2026.3.16) +- v4.5优化注册登录功能,jwt token无感刷新token,redis存储用户信息,cloudflare托管vercel(2026.3.22-2026.3.26) +- v4.6新增hcaptcha防机器人验证码(2026.4.12) +- v4.7新增cloudflare turnstile防恶意请求和爬虫(2026.4.25-2026.4.27) +- v4.8新增支付功能(2026.4.28-2026.4.29) +- v4.9新增Latex编辑功能(2026.5.2-2026.5.8),完善上传压缩包并自动解压功能(2026.7.4-2026.7.5),国外用户接入Adsterra广告弹窗服务(2026.7.11) +- v5.0修复生产环境闲鱼服务接口和websocket连接问题,使用JWT_SECRET验证hugging space闲鱼后端(2026.8.20-2026.8.30) +- v5.1新增Markdown编辑和分享链接的相关功能(2026.9.12-2026.9.15) +- v5.2修改bug优化用户体验,重构动漫漫画相关接口和功能(2026.9.15-2026.9.16) + +## 最新版本V5.2(推荐) + +> 本地调试时,可注释掉限制调用控制台的代码。参照说明修改package.json、email.config.js、index.html、.env.development、.env.production和docker-compose.yml文件。 + +## 🛠️ 系统架构 + +Image +Image + +## 🤝 优选伙伴 · 特别赞助 + +- IPWO + +Image + +### IPWO住宅代理提供覆盖全球 195+ 国家和地区的高质量的IP池,适用于 AI Agent、浏览器自动化、多地区访问测试及全球市场调研,为开发者提供稳定、灵活的网络支持。 + +0元试用,优惠折扣码:0103,访问IPWO入口:https://www.ipwo.net/?ref=githubP1kaj1uu + +- 魔珐星云 + +Image + +### 魔珐星云搭载自研 LAM 文生 3D 多模态大模型,打造覆盖全终端的底层具身智能基础设施,适配数字人 AI 智能体、人形机器人开发、AR/VR 交互、多终端虚实场景落地及全行业数字化服务搭建,为企业、硬件厂商与开发者提供低延迟、高并发、轻量化部署的一站式 3D 具身 AI 技术支撑。 + +注册填写邀请码:JMLAPNFDSL,免费领取 1000 积分奖励,访问魔珐星云入口:https://xingyun3d.com + +## 🔰 项目概述 + +✅ 技术栈 + +- Python + SQLite + Redis + React + TypeScript + Vite + Hono + WebSocket + Tailwind CSS + Docker + Nginx + Vercel + i18n国际化 + live2d看板娘 +- 适配移动端和PC端 +- Three.js 3D 模型加载动画效果 +- MD5加密,验证码,网站访问次数统计 +- Markdown语法解析,highlight代码高亮显示 +- 基于HLS协议进行HTTP分片传输,结合自适应码流动态切换画质,由播放器完成下载、解码与渲染 +- 处理EventStream流数据,实时更新数据 +- 金融基金K线图 +- 实时版本检测更新 +- 限制终端控制台调用 +- 组件库使用Antd +- 接入fundebug SDK和OPen AI SDK +- Hugging Face今日论文和热搜论文、预览PDF及对PDF的AI解答 +- 接入MCP、Agent相关服务 +- 接入谷歌和Github授权登录 +- 闲鱼助手,可自动回复、自动发货等 +- 思维导图和Markdown格式预览及编辑,导出图片 +- 解析下载无水印1080P视频 +- 封装浏览器指纹SDK、GIF图片埋点SDK +- 接入Google Analytics分析工具 +- jwt token无感刷新token +- redis存储用户信息 +- cloudflare托管vercel +- hcaptcha防机器人验证码 +- cloudflare turnstile防恶意请求和爬虫 +- 支付宝支付功能 +- Latex编辑,可替代overleaf使用 +- Markdown编辑,分享链接,换肤,自定义模板 +- 支持上传压缩包并自动解压功能 +- 国外用户接入Adsterra广告弹窗服务 +- 代码自动同步部署集成 (CI/CD) + +✅ 音乐播放 + +- 无需登录,可快速上手使用 +- 支持歌曲/歌手的模糊搜索,播放歌曲和查看热评 +- 支持歌曲倍速播放 + +✅ 视频解析 + +- 无需会员,可在线解析视频,解析速度快 +- 包含海量视频资源,提供多个可用的解析接口 +- 支持全屏、倍速播放,画质超清及以上 +- 解析下载无水印1080P视频 + +✅ 实时黄金 + +- 页面水印,版权认证 +- 实时获取黄内金价和国外金价数据 +- TradingView实时k线图数据波动 +- 支持切换日期范围选择、复制图片、下载图片 + +✅ 论文文献 + +- Hugging Face今日论文和热搜论文 +- 筛选论文,项目主页,代码地址,arXiv论文等 +- PC端和移动端适配预览论文PDF +- 对论文PDF进行AI解答 + +✅ Latex编辑 + +- 支持overleaf的90%功能,编译不受限制 +- 编辑本地保存,不会上传到服务器,信息安全 +- 支持导出PDF文件 +- 支持自定义模板 + +✅ Markdown编辑 + +- 支持Markdown语法,代码高亮,代码复制,公式和图表展示 +- 支持分享链接,内容压缩在链接里,不上传服务器 +- 支持导出和自定义模板 +- 适配PC端和移动端 + +✅ 思维导图 + +- 生成对应内容的思维导图和Markdown内容,可导出SVG图片和PNG图片 +- 支持拖拽、放大、缩小、全屏 +- 适配PC端和移动端 + +✅ ChatGPT + +- 集成OpenAi API (DeepSeek V4模型),无需再代理,可快速使用 +- 支持markdown格式,代码高亮,代码复制,公式和图表展示 +- 无限轮聊天 + 带上下文逻辑 +- 流式输出,可中断输出,实时会话存储管理,导出聊天记录 +- 语音聊天 + 语音播放 + +✅ 文生图 + +- 接入文生图模型(MidJourney / Stable Diffusion Model) +- 支持大量多语言的AI绘图 +- 提供20+种生成的图片风格 + +✅ 动漫漫画 + +- 有9个热门榜单,上万本图漫,包括新作榜、男生榜、女生榜、国漫榜、日漫榜、韩漫榜、宝藏榜、完结榜、原创榜 +- 支持漫画名/漫画作者/漫画内容的模糊搜索,可快速切换漫画上一章、下一章 + +## ➰ 效果展示 + +- ### 关于我 + +Image +Image +Image + +- ### 版本检测 + +Image +Image + +- ### 登录页面 + +Image +Image +Image +Image + +- ### 爱心跳动 + + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/02b9367e-0b6e-4cde-8157-36b5731aa518) + +- ### 主页 + +Image +Image +Image +Image + +- ### 观看页面 + +Image +Image +Image +Image +Image +Image +Image +Image +Image + +- ### 论文文献 + +Image +Image +Image +Image +Image +Image + +- ### Latex编辑 + +Image +Image + +- ### Markdown编辑 + +Image +Image +Image + +- ### 思维导图 + +Image +Image +Image +Image + +- ### 动漫漫画 + +Image +Image +Image +Image +Image +Image + +- ### 实时黄金 + +Image +Image +Image + +- ### ChatGPT页面 + +Image +Image +Image +Image + +- ### 音乐页面 + +Image +Image +Image +Image + +- ### 闲鱼助手 + +Image +Image + +- ### 文生图页面 + +Image +Image + +- ### 降重页面 + +Image +Image + +- ### Agent监工 + +Image + +- ### 404页面 + +Image + +## ⚡ 网站性能 + +Image +Image +Image +Image +Image +Image + +
+ +历史版本V3.0 + +> 切换commit版本:bbcb9d9146edcb1230adb874d67c2bb38aac1e69 + +## 🔰 项目概述 + +✅ 技术栈 + +- 前端:Vue2,Vuex,JQuery,Three.js,axios,fetch,路由前置全局守卫,MD5加密,验证码,网站访问次数统计,Markdown语法解析,highlight代码高亮显示,处理EventStream流,PC端屏幕适配,组件库使用ElementUI和Layui +- 后端:Java,开发框架SpringBoot,数据库MySQL,中间件Redis,第三方API接入Openai-ChatGPT,接入文生图模型(MidJourney / Stable Diffusion Model),核心技术包含拦截器、过滤器、本地缓存Caffeine LoadingCache、算法(双端队列 + 滑动窗口 + 轮询负载均衡等)、Stream流、全局异常处理器、定时任务、锁机制、Swagger +- 部署:Nginx,服务器开代理模式 + +✅ 音乐播放 + +- 无需登录,可快速上手使用 +- 支持歌曲/歌手的模糊搜索,播放歌曲和对应MV +- 支持歌曲倍速播放,MV可下载 + +✅ 视频解析 + +- 无需会员,可在线解析视频,解析速度快 +- 包含海量视频资源,提供多个可用的解析接口 +- 支持全屏、倍速播放,画质超清及以上 + +✅ ChatGPT + +- 集成OpenAi API (ChatGPT3.5),无需再代理,可快速使用 +- 支持markdown格式,代码高亮,代码复制,公式和图表展示 +- 无限轮聊天 + 带上下文逻辑 +- 流式输出,会话存储管理 +- 语音聊天 + 语音播放 + +✅ 文生图 + +- 接入文生图模型(MidJourney / Stable Diffusion Model) +- 支持大量多语言的AI绘图 +- 提供20+种生成的图片风格 + +## ➰ 效果展示 + +- ### 检测页面 + + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/47f44a74-6901-4c0a-bd28-a69ff2423dae) + +- ### 登录页面 + + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/9a994b55-b7af-4ee2-98b1-7ec3844be75b) + +- ### 404页面 + + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/8b1bc61b-a5ff-4dcb-80e8-4459680f8da7) + +- ### 爱心跳动 + + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/02b9367e-0b6e-4cde-8157-36b5731aa518) + +- ### 音乐页面 + + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/a02a52f6-15e8-4503-922b-2af207419c15) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/1bbd4733-f5fa-43ed-bd4d-a2c30a5b8f52) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/1321776c-1942-4ab4-b911-5569759b80d3) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/0b7d8db6-d8ad-4e6e-a103-427e66deba33) + +- ### 观看页面 + + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/8d26a5d2-9cb9-4671-8612-a65e1dd1adda) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/c02fafa0-2f08-4f09-bb92-bf4480dcf7e2) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/2dc87edc-068e-48f4-8655-d7c05ff91086) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/0464986a-b635-4114-9b41-84e7786fdabb) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/43d7a201-0473-4d29-bc3c-d1fd03898e85) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/3f77676f-fd12-497e-ba5b-857429a60dbb) + +- ### 降重页面 + + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/05dc42f5-15ed-49e7-9141-dead78fd5a5b) + +- ### ChatGPT页面 + + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/112e3eb6-158f-47e5-9bb4-7e104af38088) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/f219dc3a-2540-4c87-8ac3-1d030ca88f7e) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/d44844db-fd03-430c-8bc7-ebbbdf6abed2) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/fe6d07d7-4564-458b-aa11-d05b1d7119ec) + +- ### 文生图页面 + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/26a6ac68-a3c9-49f1-b53d-47582480b107) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/fcf5de85-6a43-42a0-88e7-ca1bc2d8e6bb) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/05f02f4a-836a-4d68-879d-5b2d7264bf02) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/61f8d79d-13b6-4700-98e5-e316023c2e16) + +## ⚡ 网站性能 + +![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/8bf28d51-e295-4eb7-bf81-d89ba65d2527) +![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/f0300dc2-945c-4f49-8b62-083dd3d5911b) +![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/f8ff05cf-c2f8-4967-a5f5-2975b2d729c0) + +
+ +## 🖋 参与贡献 + + + +## 🍺 赞助 + +如果你认为我的项目对你很有帮助,而且情况允许的话,那么请考虑支持我的项目。我将非常感激任何的支持,哪怕只是一点点的资助,也能激励我持续开发和改进这个项目。 + +您可以通过以下几种方式支持我的项目: + +- 赞助我:您可以通过贡献资金来支持我的项目,这将帮助我支付服务器、工具和其他开发成本。您可以在下方找到资助方式。 + +- 分享项目:如果您不能贡献资金,但是您认为我的项目非常有价值,那么请考虑分享项目链接给您的朋友和同事。这将有助于我的项目得到更多的关注和支持。如果可以请给一个小小的star! + +- 提供反馈:您可以通过提交Issues或者Pull Requests来帮助改进我的项目。如果您发现了任何错误或者您认为我的项目可以改进的地方,欢迎随时向我提供反馈。 + +总之,非常感谢您对我的项目的支持,我将努力不懈地改进和提高这个项目的质量,让它更好地为您和其他用户服务。 + +
+ +联系我(WeChat:Dveiklokk): + +Image + +WeChat Pay: + +Image + +## ⏰ Star History + +[![Star History Chart](https://star-history.dera.page/svg?repos=P1kaj1uu/ChattyPlay-Agent&type=Timeline)](https://star-history.dera.page/#P1kaj1uu/ChattyPlay-Agent&Timeline) diff --git a/api/index.ts b/api/index.ts new file mode 100644 index 0000000..e6eb117 --- /dev/null +++ b/api/index.ts @@ -0,0 +1,1205 @@ +import { Hono } from 'hono' +import { cors } from 'hono/cors' +import CryptoJS from 'crypto-js' + +const app = new Hono() +const videoParseBaseURL = (process.env.VIDEO_PARSE_API_BASE_URL || '').replace(/\/+$/, '') + +// CORS +app.use('/*', cors()) + +// 漫画 API 使用服务端环境变量,保留前端同源请求地址。 +app.get('/api/bcomic/*', async (c) => { + let target: URL + try { + target = new URL(process.env.BCOMIC_API_BASE_URL || '') + if (!['http:', 'https:'].includes(target.protocol)) throw new Error('Invalid protocol') + } catch { + return c.json({ code: -1, msg: '请配置有效的 BCOMIC_API_BASE_URL', data: null }, 503) + } + target.pathname = c.req.path.replace(/^\/api\/bcomic/, '/bcomic') + target.search = new URL(c.req.url).search + target.hash = '' + + try { + const response = await fetch(target, { + headers: { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', + 'Accept': 'application/json, text/plain, */*', + 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', + }, + signal: AbortSignal.timeout(30000), + }) + if (!response.ok) { + console.error(`[Bcomic upstream] ${c.req.path}: HTTP ${response.status}`) + } + return new Response(response.body, { + status: response.status, + headers: { + 'Content-Type': response.headers.get('Content-Type') || 'application/json', + 'Cache-Control': 'no-store', + }, + }) + } catch { + return c.json({ code: -1, msg: '漫画接口请求失败', data: null }, 502) + } +}) + +// ============ 认证相关常量 ============ + +const JWT_SECRET = process.env.JWT_SECRET || 'chattyplay-jwt-secret-2024' +const PASSWORD_SECRET = 'chattyplay-secret-key-2024' +const TOKEN_EXPIRY = 7 * 24 * 60 * 60 * 1000 // 7天 + +// Redis 配置 +const REDIS_REST_URL = process.env.UPSTASH_REDIS_REST_URL +const REDIS_REST_TOKEN = process.env.UPSTASH_REDIS_REST_TOKEN + +// 用户计数器 key +const USER_COUNTER_KEY = 'user:id_counter' +// 用户 Hash key prefix +const USER_HASH_PREFIX = 'user:' +// 用户名索引 key +const USERNAME_INDEX_KEY = 'user:username_index' + +// ============ Redis HTTP API 调用函数 ============ + +interface RedisResult { + result?: any + error?: string +} + +async function redisCommand(command: string[]): Promise { + if (!REDIS_REST_URL || !REDIS_REST_TOKEN) { + return { error: 'Redis 未配置' } + } + + try { + const response = await fetch(`${REDIS_REST_URL}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${REDIS_REST_TOKEN}` + }, + body: JSON.stringify(command) + }) + + if (!response.ok) { + return { error: `Redis 请求失败: ${response.status}` } + } + + const data = await response.json() + return { result: data.result } + } catch (error) { + return { error: `Redis 连接错误: ${error instanceof Error ? error.message : '未知错误'}` } + } +} + +// Redis 操作函数 +async function getNextUserId(): Promise { + const { result, error } = await redisCommand(['INCR', USER_COUNTER_KEY]) + if (error || result === null) return null + return result as number +} + +async function getUserById(id: number): Promise { + const { result, error } = await redisCommand(['HGETALL', `${USER_HASH_PREFIX}${id}`]) + if (error || !result || result.length === 0) return null + + // HGETALL 返回 [key1, val1, key2, val2, ...] 格式 + const user: any = {} + for (let i = 0; i < result.length; i += 2) { + user[result[i]] = result[i + 1] + } + user.id = Number(user.id) + return user as User +} + +async function getUserByUsername(username: string): Promise { + // 从用户名索引获取用户 ID + const { result: userId, error } = await redisCommand(['HGET', USERNAME_INDEX_KEY, username]) + if (error || !userId) return null + return getUserById(Number(userId)) +} + +async function getUserByEmail(email: string): Promise { + // 扫描查找邮箱匹配的用户(较慢但可行) + const { result: keys, error } = await redisCommand(['KEYS', `${USER_HASH_PREFIX}*`]) + if (error || !keys || keys.length === 0) return null + + for (const key of keys) { + const { result: emailVal, error: emailError } = await redisCommand(['HGET', key, 'email']) + if (!emailError && emailVal === email) { + return getUserById(Number(key.replace(USER_HASH_PREFIX, ''))) + } + } + return null +} + +async function createUser(user: User): Promise { + const { error } = await redisCommand([ + 'HMSET', + `${USER_HASH_PREFIX}${user.id}`, + 'id', String(user.id), + 'username', user.username, + 'password', user.password, + 'email', user.email || '', + 'created_at', user.created_at + ]) + if (error) throw new Error(error) + + // 保存用户名索引 + await redisCommand(['HSET', USERNAME_INDEX_KEY, user.username, String(user.id)]) +} + +async function updateUserField(id: number, field: string, value: string): Promise { + await redisCommand(['HSET', `${USER_HASH_PREFIX}${id}`, field, value]) +} + +// ============ 数据类型定义 ============ + +interface User { + id: number + username: string + password: string + email?: string + avatar?: string + created_at: string + last_login?: string +} + +interface UserWithoutPassword { + id: number + username: string + email?: string + avatar?: string + created_at: string + last_login?: string +} + +// ============ 密码工具函数 ============ + +function hashPassword(password: string): string { + return CryptoJS.SHA256(password + PASSWORD_SECRET).toString() +} + +function verifyPassword(password: string, hashedPassword: string): boolean { + const hashed = hashPassword(password) + return hashed === hashedPassword +} + +// ============ JWT Token 函数 ============ + +function generateToken(payload: { userId: number; username: string }): string { + const tokenPayload = { + ...payload, + exp: Date.now() + TOKEN_EXPIRY + } + + const header = { + alg: 'HS256', + typ: 'JWT' + } + + const encodedHeader = base64UrlEncode(JSON.stringify(header)) + const encodedPayload = base64UrlEncode(JSON.stringify(tokenPayload)) + const signature = CryptoJS.HmacSHA256(`${encodedHeader}.${encodedPayload}`, JWT_SECRET).toString() + const encodedSignature = base64UrlEncode(signature) + + return `${encodedHeader}.${encodedPayload}.${encodedSignature}` +} + +function verifyToken(token: string): { userId: number; username: string } | null { + try { + const [encodedHeader, encodedPayload, encodedSignature] = token.split('.') + + if (!encodedHeader || !encodedPayload || !encodedSignature) { + return null + } + + const signature = CryptoJS.HmacSHA256(`${encodedHeader}.${encodedPayload}`, JWT_SECRET).toString() + const encodedSignatureCheck = base64UrlEncode(signature) + + if (encodedSignature !== encodedSignatureCheck) { + return null + } + + const payload = JSON.parse(base64UrlDecode(encodedPayload)) as { userId: number; username: string; exp?: number } + + if (payload.exp && payload.exp < Date.now()) { + return null + } + + return payload + } catch (error) { + console.error('Token verification failed:', error) + return null + } +} + +function base64UrlEncode(str: string): string { + return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(str)) + .replace(/\+/g, '-') + .replace(/\//g, '_') + .replace(/=/g, '') +} + +function base64UrlDecode(str: string): string { + let base64 = str.replace(/-/g, '+').replace(/_/g, '/') + while (base64.length % 4) { + base64 += '=' + } + return CryptoJS.enc.Base64.parse(base64).toString(CryptoJS.enc.Utf8) +} + +// ============ 认证路由 ============ + +/** + * 用户注册 + * POST /api/auth/register + */ +app.post('/api/auth/register', async (c) => { + try { + const body = await c.req.json() + const { username, password, email } = body + + if (!username || !password) { + return c.json({ + success: false, + message: '用户名和密码不能为空' + }, 400) + } + + if (username.length < 3 || username.length > 20) { + return c.json({ + success: false, + message: '用户名长度必须在3-20个字符之间' + }, 400) + } + + if (password.length < 6 || password.length > 20) { + return c.json({ + success: false, + message: '密码长度必须在6-20个字符之间' + }, 400) + } + + if (email) { + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ + if (!emailRegex.test(email)) { + return c.json({ + success: false, + message: '邮箱格式不正确' + }, 400) + } + } + + // 检查用户名是否已存在 + const existingUser = await getUserByUsername(username) + if (existingUser) { + return c.json({ + success: false, + message: '用户名已存在' + }, 400) + } + + // 检查邮箱是否已存在 + if (email) { + const existingEmail = await getUserByEmail(email) + if (existingEmail) { + return c.json({ + success: false, + message: '邮箱已被注册' + }, 400) + } + } + + // 创建用户 + const userId = await getNextUserId() + if (userId === null) { + return c.json({ + success: false, + message: '用户服务暂不可用,请检查 Redis 配置' + }, 500) + } + + const hashedPassword = hashPassword(password) + const createdAt = new Date().toISOString() + + const newUser: User = { + id: userId, + username, + password: hashedPassword, + email, + created_at: createdAt + } + + await createUser(newUser) + + // 生成 token + const token = generateToken({ + userId: newUser.id, + username: newUser.username + }) + + const userWithoutPassword: UserWithoutPassword = { + id: newUser.id, + username: newUser.username, + email: newUser.email, + created_at: newUser.created_at + } + + return c.json({ + success: true, + message: '注册成功', + token, + user: userWithoutPassword + }) + } catch (error) { + console.error('注册接口错误:', error) + return c.json({ + success: false, + message: '服务器错误' + }, 500) + } +}) + +/** + * 用户登录 + * POST /api/auth/login + */ +app.post('/api/auth/login', async (c) => { + try { + const body = await c.req.json() + const { username, password } = body + + if (!username || !password) { + return c.json({ + success: false, + message: '用户名和密码不能为空' + }, 400) + } + + // 查找用户 + const user = await getUserByUsername(username) + if (!user) { + return c.json({ + success: false, + message: '用户名或密码错误' + }, 400) + } + + // 验证密码 + const isPasswordValid = verifyPassword(password, user.password) + if (!isPasswordValid) { + return c.json({ + success: false, + message: '用户名或密码错误' + }, 400) + } + + // 更新最后登录时间 + const lastLogin = new Date().toISOString() + await updateUserField(user.id, 'last_login', lastLogin) + + // 生成 token + const token = generateToken({ + userId: user.id, + username: user.username + }) + + const userWithoutPassword: UserWithoutPassword = { + id: user.id, + username: user.username, + email: user.email, + avatar: user.avatar, + created_at: user.created_at, + last_login: lastLogin + } + + return c.json({ + success: true, + message: '登录成功', + token, + user: userWithoutPassword + }) + } catch (error) { + console.error('登录接口错误:', error) + return c.json({ + success: false, + message: '服务器错误' + }, 500) + } +}) + +/** + * Google OAuth 登录 + * POST /api/auth/google + * 用 Google access_token 验证身份,找到或自动创建本站用户,签发本站 JWT + */ +app.post('/api/auth/google', async (c) => { + try { + const body = await c.req.json() + const { accessToken } = body + + if (!accessToken) { + return c.json({ success: false, message: '缺少 access_token' }, 400) + } + + // 用 access_token 调 Google userinfo 验证身份(access_token 无需 client_secret) + const profileResponse = await fetch('https://www.googleapis.com/oauth2/v3/userinfo', { + headers: { + Authorization: `Bearer ${accessToken}`, + Accept: 'application/json' + } + }) + + if (!profileResponse.ok) { + return c.json({ success: false, message: 'Google 身份验证失败' }, 401) + } + + const profile = await profileResponse.json() + if (!profile || !profile.sub) { + return c.json({ success: false, message: 'Google 身份验证失败' }, 401) + } + + const email = profile.email || '' + const avatar = profile.picture || '' + let username = email ? email.split('@')[0] : `google_${profile.sub}` + + // 按邮箱查找已有用户,没有则自动创建 + let user = email ? await getUserByEmail(email) : null + if (!user) { + // 用户名冲突时追加后缀保证唯一 + const baseUsername = username + let suffix = 0 + while (await getUserByUsername(username)) { + suffix += 1 + username = `${baseUsername}_${suffix}` + } + + const userId = await getNextUserId() + if (userId === null) { + return c.json({ success: false, message: '用户服务暂不可用,请检查 Redis 配置' }, 500) + } + + const createdAt = new Date().toISOString() + user = { + id: userId, + username, + password: '', + email, + avatar, + created_at: createdAt, + last_login: createdAt + } + await createUser(user) + if (avatar) await updateUserField(user.id, 'avatar', avatar) + } else { + await updateUserField(user.id, 'last_login', new Date().toISOString()) + if (avatar) await updateUserField(user.id, 'avatar', avatar) + } + + const token = generateToken({ userId: user.id, username: user.username }) + + return c.json({ + success: true, + message: '登录成功', + token, + user: { + id: user.id, + username: user.username, + email: user.email, + avatar: user.avatar, + created_at: user.created_at, + last_login: user.last_login + } + }) + } catch (error) { + console.error('Google 登录接口错误:', error) + return c.json({ success: false, message: '服务器错误' }, 500) + } +}) + +/** + * GitHub OAuth 登录 + * POST /api/auth/github + * 用 GitHub 授权 code 换取 access_token,验证身份后签发本站 JWT + */ +app.post('/api/auth/github', async (c) => { + try { + const body = await c.req.json() + const { code } = body + + if (!code) { + return c.json({ success: false, message: '缺少 code' }, 400) + } + + // client_id 复用现有的 VITE_GITHUB_CLIENT_ID(Vercel 平台环境变量中配置) + // client_secret 从 GITHUB_CLIENT_SECRET 读取(可选,仅部署到 Vercel 平台时配置;未配置则 GitHub JWT 登录不可用) + const clientId = process.env.VITE_GITHUB_CLIENT_ID + const clientSecret = process.env.GITHUB_CLIENT_SECRET + + if (!clientId || !clientSecret) { + return c.json({ + success: false, + message: 'GitHub OAuth 未配置,请在 Vercel 环境变量中设置 VITE_GITHUB_CLIENT_ID 和 GITHUB_CLIENT_SECRET' + }, 500) + } + + // code 换取 access_token + const tokenResponse = await fetch('https://github.com/login/oauth/access_token', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json' + }, + body: JSON.stringify({ + client_id: clientId, + client_secret: clientSecret, + code + }) + }) + + const tokenData = await tokenResponse.json() + if (!tokenData.access_token) { + return c.json({ success: false, message: 'GitHub 授权失败,请重试' }, 401) + } + + // 获取 GitHub 用户信息 + const userResponse = await fetch('https://api.github.com/user', { + headers: { + Authorization: `Bearer ${tokenData.access_token}`, + 'Accept': 'application/vnd.github+json', + 'User-Agent': 'ChattyPlay' + } + }) + + if (!userResponse.ok) { + return c.json({ success: false, message: '获取 GitHub 用户信息失败' }, 401) + } + + const profile = await userResponse.json() + const username = profile.login + const email = profile.email || '' + const avatar = profile.avatar_url || '' + + // 按用户名查找已有用户(GitHub 用户名全局唯一),没有则自动创建 + let user = await getUserByUsername(username) + if (!user) { + const userId = await getNextUserId() + if (userId === null) { + return c.json({ success: false, message: '用户服务暂不可用,请检查 Redis 配置' }, 500) + } + + const createdAt = new Date().toISOString() + user = { + id: userId, + username, + password: '', + email, + avatar, + created_at: createdAt, + last_login: createdAt + } + await createUser(user) + if (avatar) await updateUserField(user.id, 'avatar', avatar) + } else { + await updateUserField(user.id, 'last_login', new Date().toISOString()) + if (avatar) await updateUserField(user.id, 'avatar', avatar) + } + + const token = generateToken({ userId: user.id, username: user.username }) + + return c.json({ + success: true, + message: '登录成功', + token, + user: { + id: user.id, + username: user.username, + email: user.email, + avatar: user.avatar, + created_at: user.created_at, + last_login: user.last_login + } + }) + } catch (error) { + console.error('GitHub 登录接口错误:', error) + return c.json({ success: false, message: '服务器错误' }, 500) + } +}) + +/** + * 验证 token 并获取用户信息 + * GET /api/auth/me + */ +app.get('/api/auth/me', async (c) => { + try { + const token = c.req.header('Authorization')?.replace('Bearer ', '') + + if (!token) { + return c.json({ + success: false, + message: '未提供认证令牌' + }, 401) + } + + const payload = verifyToken(token) + + if (!payload) { + return c.json({ + success: false, + message: '无效的认证令牌' + }, 401) + } + + // 查找用户 + const user = await getUserById(payload.userId) + if (!user) { + return c.json({ + success: false, + message: '用户不存在' + }, 401) + } + + const userWithoutPassword: UserWithoutPassword = { + id: user.id, + username: user.username, + email: user.email, + avatar: user.avatar, + created_at: user.created_at, + last_login: user.last_login + } + + return c.json({ + success: true, + user: userWithoutPassword + }) + } catch (error) { + console.error('获取用户信息接口错误:', error) + return c.json({ + success: false, + message: '服务器错误' + }, 500) + } +}) + +// 简单的健康检查 +app.get('/api/health', (c) => c.json({ status: 'ok' })) + +// Vercel Cron 定期唤醒常驻的 Hugging Face 闲鱼后端 +app.get('/api/goofish-health', async (c) => { + const cronSecret = process.env.CRON_SECRET + if (cronSecret && c.req.header('Authorization') !== `Bearer ${cronSecret}`) { + return c.json({ status: 'unauthorized' }, 401) + } + + const backendUrl = (process.env.GOOFISH_BACKEND_URL || 'https://wangdsd-chattyplay-goofish.hf.space') + .replace(/\/+$/, '') + const controller = new AbortController() + const timeout = setTimeout(() => controller.abort(), 15000) + + try { + const response = await fetch(`${backendUrl}/health`, { + headers: { Accept: 'application/json' }, + signal: controller.signal + }) + const body = await response.json().catch(() => null) + return c.json({ + status: response.ok ? 'ok' : 'unavailable', + backendStatus: response.status, + backend: body + }, response.ok ? 200 : 502) + } catch (error) { + return c.json({ + status: 'unavailable', + message: error instanceof Error ? error.message : 'Unknown error' + }, 502) + } finally { + clearTimeout(timeout) + } +}) + +// 视频下载代理端点 +app.post('/api/resolve', async (c) => { + const targetUrl = `${videoParseBaseURL}/api/resolve` + const body = await c.req.json() + + const response = await fetch(targetUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Referer': `${videoParseBaseURL}/`, + 'Origin': videoParseBaseURL, + 'Accept': 'application/json, text/plain, */*', + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', + }, + body: JSON.stringify(body), + }) + + const responseData = await response.json() + + if (responseData.thumbnail) { + responseData.thumbnail = `/api/image-proxy?url=${encodeURIComponent(responseData.thumbnail)}` + } + + return c.json(responseData, response.status as any) +}) + +// 图片代理 - 绕过防盗链 +app.get('/api/image-proxy', async (c) => { + const imageUrl = c.req.query('url') + + if (!imageUrl) { + return c.json({ error: 'Missing url parameter' }, 400) + } + + try { + const response = await fetch(imageUrl, { + headers: { + 'Referer': 'https://www.bilibili.com/', + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', + }, + }) + + if (!response.ok) { + throw new Error(`Failed to fetch image: ${response.status}`) + } + + const imageBuffer = await response.arrayBuffer() + const contentType = response.headers.get('Content-Type') || 'image/jpeg' + + return new Response(imageBuffer, { + headers: { + 'Content-Type': contentType, + 'Cache-Control': 'public, max-age=86400', + }, + }) + } catch (error) { + return c.json({ + error: 'Failed to proxy image', + message: error instanceof Error ? error.message : 'Unknown error' + }, 500) + } +}) + +// B站视频下载代理 +app.post('/api/bilibili-download', async (c) => { + const targetUrl = `${videoParseBaseURL}/api/bilibili-download` + const body = await c.req.json() + + const response = await fetch(targetUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Referer': `${videoParseBaseURL}/`, + 'Origin': videoParseBaseURL, + 'Accept': '*/*', + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', + }, + body: JSON.stringify(body), + }) + + const contentType = response.headers.get('content-type') || '' + + if (contentType.includes('application/json')) { + const jsonData = await response.json() + return c.json(jsonData) + } else { + const reader = response.body?.getReader() + + if (!reader) { + throw new Error('无法获取响应流') + } + + const stream = new ReadableStream({ + async start(controller) { + try { + while (true) { + const { done, value } = await reader.read() + if (done) { + controller.close() + break + } + controller.enqueue(value) + } + } catch (error) { + controller.error(error) + } finally { + reader.releaseLock() + } + } + }) + + return new Response(stream, { + status: response.status, + headers: { + 'Content-Type': contentType, + 'Content-Disposition': response.headers.get('Content-Disposition') || `attachment; filename="video.mp4"`, + 'Content-Length': response.headers.get('Content-Length') || '', + 'Cache-Control': 'no-cache', + }, + }) + } +}) + +// 抖音/其他视频下载代理 +app.post('/api/proxy-download', async (c) => { + const targetUrl = `${videoParseBaseURL}/api/proxy-download` + const body = await c.req.json() + + const response = await fetch(targetUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Referer': `${videoParseBaseURL}/`, + 'Origin': videoParseBaseURL, + 'Accept': '*/*', + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', + }, + body: JSON.stringify(body), + }) + + const contentType = response.headers.get('content-type') || '' + + if (contentType.includes('application/json')) { + const jsonData = await response.json() + return c.json(jsonData) + } else { + const reader = response.body?.getReader() + + if (!reader) { + throw new Error('无法获取响应流') + } + + const stream = new ReadableStream({ + async start(controller) { + try { + while (true) { + const { done, value } = await reader.read() + if (done) { + controller.close() + break + } + controller.enqueue(value) + } + } catch (error) { + controller.error(error) + } finally { + reader.releaseLock() + } + } + }) + + return new Response(stream, { + status: response.status, + headers: { + 'Content-Type': contentType, + 'Content-Disposition': response.headers.get('Content-Disposition') || `attachment; filename="video.mp4"`, + 'Content-Length': response.headers.get('Content-Length') || '', + 'Cache-Control': 'no-cache', + }, + }) + } +}) + +// ============ LaTeX 编译 API 代理 ============ + +// LaTeX 编译 API 代理 +app.post('/api/latex/compile', async (c) => { + try { + const { code, compiler = 'xelatex', files = [] } = await c.req.json() + + // 添加时间戳确保请求唯一性 + const timestamp = new Date().toISOString() + console.log(`[${timestamp}] LaTeX 编译请求`) + + if (!code || typeof code !== 'string') { + return c.json({ + success: false, + error: '请提供有效的 LaTeX 代码' + }, 400) + } + + console.log('LaTeX 编译请求:', { + compiler, + codeLength: code.length, + codePreview: code.substring(0, 100) + (code.length > 100 ? '...' : ''), + filesCount: files.length, + files: files.map((f: any) => ({ name: f.name, contentLength: f.content?.length })) + }) + + // 如果有图片文件,使用正确的 API 格式传递 + const processedCode = code + if (files && files.length > 0) { + console.log('检测到图片文件,使用多文件资源格式') + } + + // 检测是否包含中文字符 + const hasChinese = /[一-龥]/.test(processedCode) + console.log('包含中文:', hasChinese) + + // 如果包含中文,尝试使用专门处理中文的服务 + if (hasChinese) { + console.log('检测到中文内容,使用特殊的中文处理方案') + + // 方案1: 尝试使用 Overleaf-style API + try { + const overleafUrl = 'https://compile.overleaf.com/docs' + + // 构建文件列表:主文件(图片已嵌入) + const requestFiles: any[] = [{ + name: 'main.tex', + content: processedCode + }] + + const response = await fetch(overleafUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + compiler: compiler, + files: requestFiles, + options: { + timeout: 60 + } + }), + }) + + if (response.ok) { + const data = await response.json() + if (data.pdfs && data.pdfs['main.pdf']) { + const pdfData = data.pdfs['main.pdf'] + const pdfBuffer = Buffer.from(pdfData, 'base64') + + return new Response(pdfBuffer, { + headers: { + 'Content-Type': 'application/pdf', + 'Content-Disposition': 'attachment; filename="document.pdf"', + 'Access-Control-Allow-Origin': '*', + }, + }) + } + } + } catch (error) { + console.error('Overleaf API 失败:', error) + } + + // 方案2: 修改LaTeX代码以使用更通用的字体设置 + console.log('尝试修改LaTeX代码以支持中文') + let modifiedCode = processedCode + + // 如果代码中没有ctex相关包,添加中文支持 + if (!processedCode.includes('ctex') && !processedCode.includes('CJK')) { + // 在documentclass后添加中文支持 + modifiedCode = processedCode.replace( + /\\documentclass(\[[^\]]*\])?\{([^}]+)\}/, + (match: string, options: string, docclass: string) => { + if (docclass === 'ctexart') { + return match + } + return `\\documentclass${options || ''}{${docclass}}\n\\usepackage{CJKutf8}\n\\usepackage{CJK}` + } + ) + + // 在document环境中添加CJK支持 + if (modifiedCode.includes('\\begin{document}')) { + modifiedCode = modifiedCode.replace( + '\\begin{document}', + '\\begin{document}\n\\begin{CJK*}{UTF8}{gbsn}' + ) + } + + if (modifiedCode.includes('\\end{document}')) { + modifiedCode = modifiedCode.replace( + '\\end{document}', + '\\end{CJK*}\n\\end{document}' + ) + } + } + + console.log('修改后的代码预览:', modifiedCode.substring(0, 200) + '...') + + // 使用修改后的代码尝试编译 + const latexApiUrl = 'https://latex.ytotech.com/builds/sync' + + // 构建请求数据 - 使用正确的 resources 格式 + const resources: any[] = [{ + main: true, + content: modifiedCode + }] + + // 添加附加文件(图片等)- 使用正确的格式 + if (files && files.length > 0) { + for (const file of files) { + if (file.name && file.content) { + let base64Data = file.content + if (base64Data.startsWith('data:')) { + base64Data = base64Data.split(',')[1] || base64Data + } + + resources.push({ + path: file.name, + file: base64Data + }) + + console.log(`添加图片资源(中文处理): ${file.name}`) + } + } + } + + const requestData = { + compiler: compiler, + resources: resources + } + + console.log('发送到 LaTeX API 的请求(中文处理):', { + compiler, + codeLength: modifiedCode.length, + 资源数量: resources.length, + 包含图片: files && files.length > 0 + }) + + const response = await fetch(latexApiUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData), + }) + + if (response.ok) { + const contentType = response.headers.get('content-type') || '' + if (contentType.includes('application/pdf')) { + const pdfBuffer = await response.arrayBuffer() + console.log('中文PDF生成成功,大小:', pdfBuffer.byteLength, '字节') + + return new Response(pdfBuffer, { + headers: { + 'Content-Type': 'application/pdf', + 'Content-Disposition': 'attachment; filename="document.pdf"', + 'Access-Control-Allow-Origin': '*', + }, + }) + } + } + } + + // 非中文内容或中文处理失败,使用标准流程 + const latexApiUrl = 'https://latex.ytotech.com/builds/sync' + + // 构建请求数据 - 使用正确的 resources 格式 + const resources: any[] = [{ + main: true, + content: processedCode + }] + + // 添加附加文件(图片等)- 使用正确的格式 + if (files && files.length > 0) { + for (const file of files) { + if (file.name && file.content) { + let base64Data = file.content + if (base64Data.startsWith('data:')) { + base64Data = base64Data.split(',')[1] || base64Data + } + + resources.push({ + path: file.name, + file: base64Data + }) + + console.log(`添加图片资源: ${file.name}`) + } + } + } + + const requestData = { + compiler: compiler, + resources: resources + } + + console.log('发送到 LaTeX API 的请求:', { + compiler, + codeLength: processedCode.length, + 资源数量: resources.length, + 包含图片: files && files.length > 0 + }) + + const response = await fetch(latexApiUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData), + }) + + console.log('API 响应状态:', response.status, response.statusText) + + if (!response.ok) { + const errorText = await response.text() + console.error('LaTeX API 错误响应:', errorText) + console.error('请求体详情:', JSON.stringify(requestData, null, 2)) + throw new Error(`LaTeX API 返回错误: ${response.status} ${response.statusText} - ${errorText}`) + } + + const contentType = response.headers.get('content-type') || '' + console.log('响应内容类型:', contentType) + + if (contentType.includes('application/pdf')) { + const pdfBuffer = await response.arrayBuffer() + console.log('PDF 生成成功,大小:', pdfBuffer.byteLength, '字节') + + return new Response(pdfBuffer, { + headers: { + 'Content-Type': 'application/pdf', + 'Content-Disposition': 'attachment; filename="document.pdf"', + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', + 'Access-Control-Allow-Headers': 'Content-Type, Authorization', + }, + }) + } + + const errorText = await response.text() + console.error('非 PDF 响应:', errorText) + return c.json({ + success: false, + error: `编译失败,服务器返回非 PDF 内容: ${errorText.substring(0, 200)}` + }, 500) + + } catch (error) { + console.error('LaTeX 编译代理错误:', error) + + const errorMessage = error instanceof Error ? error.message : '未知错误' + return c.json({ + success: false, + error: `LaTeX 编译失败: ${errorMessage}` + }, 500) + } +}) + +// LaTeX 编译健康检查 +app.get('/api/latex/health', async (c) => { + try { + const testCode = '\\documentclass{article}\\begin{document}Hello World\\end{document}' + const response = await fetch(`https://latex.ytotech.com/builds/sync?content=${encodeURIComponent(testCode)}`, { + method: 'GET', + }) + + return c.json({ + status: response.ok ? 'available' : 'unavailable', + statusCode: response.status, + timestamp: new Date().toISOString() + }) + } catch (error) { + return c.json({ + status: 'error', + error: error instanceof Error ? error.message : '未知错误', + timestamp: new Date().toISOString() + }, 503) + } +}) + +export default app diff --git a/babel.config.js b/babel.config.js deleted file mode 100644 index b31c0df..0000000 --- a/babel.config.js +++ /dev/null @@ -1,15 +0,0 @@ -module.exports = { - presets: [ - '@vue/cli-plugin-babel/preset', - ["@babel/preset-env", { "modules": false }] - ], - "plugins": [ - [ - "component", - { - "libraryName": "element-ui", - "styleLibraryName": "theme-chalk" - } - ] - ] -} diff --git a/deploy.sh b/deploy.sh new file mode 100755 index 0000000..5913386 --- /dev/null +++ b/deploy.sh @@ -0,0 +1,68 @@ +#!/bin/bash + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 项目名称 +PROJECT_NAME="chattyplay-agent" +IMAGE_NAME="${PROJECT_NAME}:latest" +CONTAINER_NAME="${PROJECT_NAME}-web" + +echo -e "${GREEN}======================================${NC}" +echo -e "${GREEN} Docker 部署脚本${NC}" +echo -e "${GREEN}======================================${NC}" + +# 检查 Docker 是否安装 +if ! command -v docker &> /dev/null; then + echo -e "${RED}错误: Docker 未安装,请先安装 Docker${NC}" + exit 1 +fi + +# 构建镜像 +echo -e "${YELLOW}步骤 1/4: 构建 Docker 镜像...${NC}" +docker build -t $IMAGE_NAME . +if [ $? -ne 0 ]; then + echo -e "${RED}镜像构建失败${NC}" + exit 1 +fi +echo -e "${GREEN}✓ 镜像构建成功${NC}" + +# 停止并删除旧容器 +echo -e "${YELLOW}步骤 2/4: 停止旧容器...${NC}" +if [ "$(docker ps -aq -f name=$CONTAINER_NAME)" ]; then + docker stop $CONTAINER_NAME 2>/dev/null + docker rm $CONTAINER_NAME 2>/dev/null + echo -e "${GREEN}✓ 旧容器已删除${NC}" +else + echo -e "${GREEN}✓ 没有运行中的旧容器${NC}" +fi + +# 运行新容器 +echo -e "${YELLOW}步骤 3/4: 启动新容器...${NC}" +docker run -d \ + --name $CONTAINER_NAME \ + -p 80:80 \ + --restart unless-stopped \ + $IMAGE_NAME + +if [ $? -ne 0 ]; then + echo -e "${RED}容器启动失败${NC}" + exit 1 +fi +echo -e "${GREEN}✓ 容器启动成功${NC}" + +# 查看容器状态 +echo -e "${YELLOW}步骤 4/4: 检查容器状态...${NC}" +docker ps -f name=$CONTAINER_NAME + +echo -e "${GREEN}======================================${NC}" +echo -e "${GREEN}✓ 部署完成!${NC}" +echo -e "${GREEN}访问地址: http://localhost${NC}" +echo -e "${GREEN}======================================${NC}" + +# 显示日志 +echo -e "${YELLOW}容器日志 (按 Ctrl+C 退出):${NC}" +docker logs -f $CONTAINER_NAME diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..3fc7c5d --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,26 @@ +version: '3.8' + +services: + # 前端应用 + web: + build: + context: . + dockerfile: Dockerfile + container_name: chattyplay-web + ports: + - "80:80" + environment: + - NODE_ENV=production + restart: unless-stopped + networks: + - app-network + healthcheck: + test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost/"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + +networks: + app-network: + driver: bridge diff --git a/email.config.d.ts b/email.config.d.ts new file mode 100644 index 0000000..4e3b26a --- /dev/null +++ b/email.config.d.ts @@ -0,0 +1,9 @@ +export interface EmailConfig { + PUBLIC_KEY: string + SERVICE_ID: string + TEMPLATE_ID: string + fromName: string + fromEmail: string +} + +export const emailConfig: EmailConfig diff --git a/email.config.js b/email.config.js new file mode 100644 index 0000000..9164ed7 --- /dev/null +++ b/email.config.js @@ -0,0 +1,48 @@ +/** + * EmailJS 配置文件 + * + * 使用说明: + * 1. 访问 https://www.emailjs.com/ 注册账号 + * 2. 添加邮件服务(Email Service),支持: + * - Gmail + * - Outlook + * - Yahoo Mail + * - 或任何支持 SMTP 的邮件服务 + * 3. 创建邮件模板(Email Template) + * 4. 获取以下配置信息并填入: + * - SERVICE_ID: 服务 ID + * - TEMPLATE_ID: 模板 ID + * - PUBLIC_KEY: 公钥 + * + * 邮件模板示例: + * 主题:ChattyPlay - 实时金价 + * 内容: + * {{email}} 您好, + * {{to_email}} 您好, + * + * 黄金价格实时通知: + * + * 国内金价:{{domestic_price}} + * 国际金价:{{international_price}} + * 当前时间:{{current_time}} + * + * -- + * ChattyPlay - 黄金价格实时监控 + */ + +export const emailConfig = { + // EmailJS 公钥(必填) + PUBLIC_KEY: import.meta.env.VITE_EMAILJS_PUBLIC_KEY || 'YOUR_PUBLIC_KEY_HERE', + + // EmailJS 服务 ID(必填) + SERVICE_ID: import.meta.env.VITE_EMAILJS_SERVICE_ID || 'YOUR_SERVICE_ID_HERE', + + // EmailJS 模板 ID(必填) + TEMPLATE_ID: import.meta.env.VITE_EMAILJS_TEMPLATE_ID || 'YOUR_TEMPLATE_ID_HERE', + + // 发件人信息(可选) + fromName: import.meta.env.VITE_EMAILJS_FROM_NAME || 'ChattyPlay', + fromEmail: import.meta.env.VITE_EMAILJS_FROM_EMAIL || '891523233@qq.com', +} + +export default emailConfig diff --git a/goofish_backend/Dockerfile b/goofish_backend/Dockerfile new file mode 100644 index 0000000..c5c13f5 --- /dev/null +++ b/goofish_backend/Dockerfile @@ -0,0 +1,28 @@ +# Hugging Face Docker Space:运行常驻 Node/Hono 闲鱼后端 +FROM node:20-bookworm-slim + +ENV NODE_ENV=production \ + PORT=7860 \ + GOOFISH_DATA_DIR=/data \ + GOOFISH_LOG_DIR=/data/logs + +WORKDIR /app + +# better-sqlite3 在没有匹配预编译产物时需要本地编译工具。 +RUN apt-get update \ + && apt-get install -y --no-install-recommends ca-certificates python3 make g++ \ + && rm -rf /var/lib/apt/lists/* + +COPY package.json package-lock.json ./ +# tsx 是容器运行 TypeScript 入口所需的运行工具,目前位于 devDependencies。 +RUN npm ci --include=dev && npm cache clean --force + +COPY . . + +RUN mkdir -p /data/logs && chown -R node:node /app /data + +USER node + +EXPOSE 7860 + +CMD ["npm", "run", "start"] diff --git a/goofish_backend/LICENSE b/goofish_backend/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/goofish_backend/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/goofish_backend/README.md b/goofish_backend/README.md new file mode 100644 index 0000000..79c0f89 --- /dev/null +++ b/goofish_backend/README.md @@ -0,0 +1,449 @@ +--- +title: ChattyPlay Goofish Backend +emoji: 🐟 +colorFrom: blue +colorTo: yellow +sdk: docker +app_port: 7860 +fullWidth: true +--- + +

+

ChattyPlay-Agent

+ ChattyPlay-Agent | Trendshift +

+ Github Stargazers + Github Forks + Github Licence +
+ 支持平台 +

+

+ +## 📄 免责声明 + +### 本项目提供音乐、影视解析下载、实时黄金及K线图、动漫漫画、Hugging Face论文、思维导图、闲鱼助手和ChatGPT相关服务,仅供学习使用,请勿用于任何商业用途。如你有更好的想法、建议、或不解的问题,欢迎提PR或Issues!如有侵权,请联系我! + +> License:ChattyPlay-Agent is licensed under the Apache-2.0 License. See the [LICENSE](https://github.com/P1kaj1uu/ChattyPlay-Agent/blob/master/LICENSE) file for more information. + +> 项目描述参考信息可跳转WiKi:https://github.com/P1kaj1uu/ChattyPlay-Agent/wiki/%E4%BD%BF%E7%94%A8%E6%96%87%E6%A1%A3 + +> PC端、移动端均已适配 + +## 🚀 在线体验 + +- 体验地址:在线体验(需要科学上网工具访问) +- 视频预览:录频视频 +- 备注:如使用ChatGPT服务,我的APIKey配额有限,希望大家能省点用谢谢! + +## 📖 版本迭代 + +- v1.0版本已完成(2023.1.7凌晨) +- v1.1版本优化观看页面的提示内容(2023.1.7上午) +- v1.2版本优化解析接口(2023.1.8下午) +- v1.3版本优化帮助内容页面(2023.1.8下午) +- v1.4版本优化分离加载爱心跳动效果(2023.1.9上午) +- v1.5版本增加多个能用的视频解析接口(2023.1.14晚上) +- v1.6版本禁止F12查看源代码(2023.1.19上午) +- v1.7版本增加并优化解析视频接口(2023.1.19下午) +- v1.8版本浏览器兼容判断浏览器类型(2023.1.20晚上) +- v2.0版本优化页面样式,增加首页听音乐功能(2023.4.22下午) +- v2.1版本增加论文降重功能(2023.4.30全天) +- v2.2版本接入ChatGPT服务,可无需再代理和APIkey(2023.5.1-2023.5.3) +- v2.3版本优化ChatGPT服务,检测自动换行,并支持上下文对话(2023.5.6-2023.5.7) +- v2.4版本代仓本地的部分接口隐藏不对外开放(2023.5.7晚上) +- v2.5版本输出代码高亮显示,流式处理EventStream,并支持会话存储(2023.5.13-2023.5.14) +- v2.6版本接入文心一言基础服务,增加语音聊天、语音朗读功能(2023.5.20-2023.5.21) +- v2.7版本前端也做限流处理,增加验证功能,防止接口被恶意多次请求(2023.5.24晚上) +- v2.8版本优化加载效果,增加网站访问次数统计和版本更新提醒用户功能(2023.5.26-2023.5.27) +- v2.9版本整体优化代码,修复bug,并抽离封装部分函数和组件,降低复杂度,实现高内聚低耦合(2023.6.10-2023.6.20) +- v3.0全新版本上线,优化markdown代码块格式,并接入文生图、亚马逊爬虫服务,发布浏览器插件(2023.7.24-2023.8.13) +- v4.0重构项目完成,修改相关的bug,页面结构样式重新设计,增加实时黄金及k线图、动漫漫画和Hugging Face论文功能,优化用户体验,并完成移动端和PC端的适配,添加版本检测弹窗更新功能,接入SDK、MCP、Agent、谷歌和Github授权登录等服务,同时系统整体架构将Vue2替换为React + TypeScript + Hono + Vite + Tailwind CSS + i18n国际化 + live2d看板娘 + nginx + Docker容器化管理(2025.12.16-2026.2.10) +- v4.1闲鱼助手,可自动回复、自动发货等(2026.2.26-2026.3.7) +- v4.2思维导图和Markdown格式预览及编辑,导出图片。论文PDF预览及AI问答(2026.3.9-2026.3.11) +- v4.3解析下载无水印1080P视频(2026.3.13-2026.3.14) +- v4.4封装浏览器指纹SDK、GIF图片埋点SDK,接入Google Analytics分析工具(2026.3.15-2026.3.16) +- v4.5优化注册登录功能,jwt token无感刷新token,redis存储用户信息,cloudflare托管vercel(2026.3.22-2026.3.26) +- v4.6新增hcaptcha防机器人验证码(2026.4.12) +- v4.7新增cloudflare turnstile防恶意请求和爬虫(2026.4.25-2026.4.27) +- v4.8新增支付功能(2026.4.28-2026.4.29) +- v4.9新增Latex编辑功能(2026.5.2-2026.5.8),完善上传压缩包并自动解压功能(2026.7.4-2026.7.5),国外用户接入Adsterra广告弹窗服务(2026.7.11) + +## 最新版本V4.9(推荐) + +> 本地调试时,可注释掉限制调用控制台的代码。参照说明修改package.json、email.config.js、index.html、.env.development、.env.production和docker-compose.yml文件。 + +### Vercel 部署闲鱼助手 + +闲鱼助手采用双部署:React 前端部署到 Vercel,常驻 Node/Hono 后端部署为 Hugging Face Docker Space。Space 提供 HTTPS/WSS 二级域名,不需要自行购买域名。完整步骤见 [Hugging Face Docker Space 部署指南](docs/huggingface-space.md)。 + +未配置 Space 地址时,Vercel 上的闲鱼页面会自动进入本地运行模式,不会请求无效接口;配置 `VITE_GOOFISH_API_URL` 后会自动启用远程 API 和 WebSocket。 + +## 🛠️ 系统架构 + +Image +Image + +## 🤝 优选伙伴 · 特别赞助 + +- IPWO + +Image + +### IPWO住宅代理提供覆盖全球 195+ 国家和地区的高质量的IP池,适用于 AI Agent、浏览器自动化、多地区访问测试及全球市场调研,为开发者提供稳定、灵活的网络支持。 + +0元试用,优惠折扣码:0103,访问IPWO入口:https://www.ipwo.net/?ref=githubP1kaj1uu + +- 魔珐星云 + +Image + +### 魔珐星云搭载自研 LAM 文生 3D 多模态大模型,打造覆盖全终端的底层具身智能基础设施,适配数字人 AI 智能体、人形机器人开发、AR/VR 交互、多终端虚实场景落地及全行业数字化服务搭建,为企业、硬件厂商与开发者提供低延迟、高并发、轻量化部署的一站式 3D 具身 AI 技术支撑。 + +注册填写邀请码:JMLAPNFDSL,免费领取 1000 积分奖励,访问魔珐星云入口:https://xingyun3d.com + +## 🔰 项目概述 + +✅ 技术栈 + +- Python + React + TypeScript + Vite + Tailwind CSS + i18n国际化 + live2d看板娘 +- 适配移动端和PC端 +- Three.js 3D 模型加载动画效果 +- MD5加密,验证码,网站访问次数统计 +- Markdown语法解析,highlight代码高亮显示 +- 处理EventStream流 +- 金融基金K线图 +- 实时版本检测更新 +- 限制终端控制台调用 +- 组件库使用Antd +- 接入fundebug SDK和OPen AI SDK +- Hugging Face今日论文和热搜论文、预览PDF及对PDF的AI解答 +- 接入MCP、Agent相关服务 +- 接入谷歌和Github授权登录 +- 闲鱼助手,可自动回复、自动发货等 +- 思维导图和Markdown格式预览及编辑,导出图片 +- 解析下载无水印1080P视频 +- 封装浏览器指纹SDK、GIF图片埋点SDK +- 接入Google Analytics分析工具 +- jwt token无感刷新token +- redis存储用户信息 +- cloudflare托管vercel +- hcaptcha防机器人验证码 +- cloudflare turnstile防恶意请求和爬虫 +- 支付宝支付功能 +- Latex编辑,可替代overleaf使用 + +✅ 音乐播放 + +- 无需登录,可快速上手使用 +- 支持歌曲/歌手的模糊搜索,播放歌曲和查看热评 +- 支持歌曲倍速播放 + +✅ 视频解析 + +- 无需会员,可在线解析视频,解析速度快 +- 包含海量视频资源,提供多个可用的解析接口 +- 支持全屏、倍速播放,画质超清及以上 +- 解析下载无水印1080P视频 + +✅ 实时黄金 + +- 页面水印,版权认证 +- 实时获取黄内金价和国外金价数据 +- TradingView实时k线图数据波动 +- 支持切换日期范围选择、复制图片、下载图片 + +✅ 论文文献 + +- Hugging Face今日论文和热搜论文 +- 筛选论文,项目主页,代码地址,arXiv论文等 +- PC端和移动端适配预览论文PDF +- 对论文PDF进行AI解答 + +✅ Latex编辑 + +- 支持overleaf的90%功能,编译不受限制 +- 编辑本地保存,不会上传到服务器,信息安全 +- 支持导出PDF文件 +- 支持自定义模板 + +✅ 思维导图 + +- 生成对应内容的思维导图和Markdown内容,可导出SVG图片和PNG图片 +- 支持拖拽、放大、缩小、全屏 +- 适配PC端和移动端 + +✅ ChatGPT + +- 集成OpenAi API (DeepSeek V4模型),无需再代理,可快速使用 +- 支持markdown格式,代码高亮,代码复制,公式和图表展示 +- 无限轮聊天 + 带上下文逻辑 +- 流式输出,可中断输出,实时会话存储管理,导出聊天记录 +- 语音聊天 + 语音播放 + +✅ 文生图 + +- 接入文生图模型(MidJourney / Stable Diffusion Model) +- 支持大量多语言的AI绘图 +- 提供20+种生成的图片风格 + +✅ 动漫漫画 + +- 有13个热门榜单,上万本图漫,包括人气榜、新作榜、畅销榜、日漫榜、恋爱榜、剧情榜、投稿榜、完结榜、免费榜、等免榜、月票榜 +- 支持漫画名/漫画作者/漫画内容的模糊搜索,可快速切换漫画上一章、下一章 + +## ➰ 效果展示 + +- ### 关于我 + +Image +Image +Image + +- ### 版本检测 + +Image +Image + +- ### 登录页面 + +Image +Image +Image +Image + +- ### 爱心跳动 + + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/02b9367e-0b6e-4cde-8157-36b5731aa518) + +- ### 主页 + +Image +Image +Image +Image + +- ### 观看页面 + +Image +Image +Image +Image +Image +Image +Image +Image +Image + +- ### 论文文献 + +Image +Image +Image +Image +Image +Image + +- ### Latex编辑 + +Image +Image + +- ### 思维导图 + +Image +Image +Image +Image + +- ### 动漫漫画 + +Image +Image +Image +Image +Image +Image + +- ### 实时黄金 + +Image +Image +Image + +- ### ChatGPT页面 + +Image +Image +Image +Image + +- ### 音乐页面 + +Image +Image +Image +Image + +- ### 闲鱼助手 + +Image +Image + +- ### 文生图页面 + +Image +Image + +- ### 降重页面 + +Image +Image + +- ### Agent监工 + +Image + +- ### 404页面 + +Image + +## ⚡ 网站性能 + +Image +Image +Image +Image +Image +Image + +
+ +历史版本V3.0 + +> 切换commit版本:bbcb9d9146edcb1230adb874d67c2bb38aac1e69 + +## 🔰 项目概述 + +✅ 技术栈 + +- 前端:Vue2,Vuex,JQuery,Three.js,axios,fetch,路由前置全局守卫,MD5加密,验证码,网站访问次数统计,Markdown语法解析,highlight代码高亮显示,处理EventStream流,PC端屏幕适配,组件库使用ElementUI和Layui +- 后端:Java,开发框架SpringBoot,数据库MySQL,中间件Redis,第三方API接入Openai-ChatGPT,接入文生图模型(MidJourney / Stable Diffusion Model),核心技术包含拦截器、过滤器、本地缓存Caffeine LoadingCache、算法(双端队列 + 滑动窗口 + 轮询负载均衡等)、Stream流、全局异常处理器、定时任务、锁机制、Swagger +- 部署:Nginx,服务器开代理模式 + +✅ 音乐播放 + +- 无需登录,可快速上手使用 +- 支持歌曲/歌手的模糊搜索,播放歌曲和对应MV +- 支持歌曲倍速播放,MV可下载 + +✅ 视频解析 + +- 无需会员,可在线解析视频,解析速度快 +- 包含海量视频资源,提供多个可用的解析接口 +- 支持全屏、倍速播放,画质超清及以上 + +✅ ChatGPT + +- 集成OpenAi API (ChatGPT3.5),无需再代理,可快速使用 +- 支持markdown格式,代码高亮,代码复制,公式和图表展示 +- 无限轮聊天 + 带上下文逻辑 +- 流式输出,会话存储管理 +- 语音聊天 + 语音播放 + +✅ 文生图 + +- 接入文生图模型(MidJourney / Stable Diffusion Model) +- 支持大量多语言的AI绘图 +- 提供20+种生成的图片风格 + +## ➰ 效果展示 + +- ### 检测页面 + + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/47f44a74-6901-4c0a-bd28-a69ff2423dae) + +- ### 登录页面 + + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/9a994b55-b7af-4ee2-98b1-7ec3844be75b) + +- ### 404页面 + + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/8b1bc61b-a5ff-4dcb-80e8-4459680f8da7) + +- ### 爱心跳动 + + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/02b9367e-0b6e-4cde-8157-36b5731aa518) + +- ### 音乐页面 + + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/a02a52f6-15e8-4503-922b-2af207419c15) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/1bbd4733-f5fa-43ed-bd4d-a2c30a5b8f52) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/1321776c-1942-4ab4-b911-5569759b80d3) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/0b7d8db6-d8ad-4e6e-a103-427e66deba33) + +- ### 观看页面 + + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/8d26a5d2-9cb9-4671-8612-a65e1dd1adda) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/c02fafa0-2f08-4f09-bb92-bf4480dcf7e2) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/2dc87edc-068e-48f4-8655-d7c05ff91086) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/0464986a-b635-4114-9b41-84e7786fdabb) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/43d7a201-0473-4d29-bc3c-d1fd03898e85) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/3f77676f-fd12-497e-ba5b-857429a60dbb) + +- ### 降重页面 + + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/05dc42f5-15ed-49e7-9141-dead78fd5a5b) + +- ### ChatGPT页面 + + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/112e3eb6-158f-47e5-9bb4-7e104af38088) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/f219dc3a-2540-4c87-8ac3-1d030ca88f7e) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/d44844db-fd03-430c-8bc7-ebbbdf6abed2) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/fe6d07d7-4564-458b-aa11-d05b1d7119ec) + +- ### 文生图页面 + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/26a6ac68-a3c9-49f1-b53d-47582480b107) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/fcf5de85-6a43-42a0-88e7-ca1bc2d8e6bb) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/05f02f4a-836a-4d68-879d-5b2d7264bf02) + ![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/61f8d79d-13b6-4700-98e5-e316023c2e16) + +## ⚡ 网站性能 + +![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/8bf28d51-e295-4eb7-bf81-d89ba65d2527) +![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/f0300dc2-945c-4f49-8b62-083dd3d5911b) +![image](https://github.com/P1kaj1uu/VIP-Video-Parsing/assets/94435057/f8ff05cf-c2f8-4967-a5f5-2975b2d729c0) + +
+ +## 🖋 参与贡献 + + + +## 🍺 赞助 + +如果你认为我的项目对你很有帮助,而且情况允许的话,那么请考虑支持我的项目。我将非常感激任何的支持,哪怕只是一点点的资助,也能激励我持续开发和改进这个项目。 + +您可以通过以下几种方式支持我的项目: + +- 赞助我:您可以通过贡献资金来支持我的项目,这将帮助我支付服务器、工具和其他开发成本。您可以在下方找到资助方式。 + +- 分享项目:如果您不能贡献资金,但是您认为我的项目非常有价值,那么请考虑分享项目链接给您的朋友和同事。这将有助于我的项目得到更多的关注和支持。如果可以请给一个小小的star! + +- 提供反馈:您可以通过提交Issues或者Pull Requests来帮助改进我的项目。如果您发现了任何错误或者您认为我的项目可以改进的地方,欢迎随时向我提供反馈。 + +总之,非常感谢您对我的项目的支持,我将努力不懈地改进和提高这个项目的质量,让它更好地为您和其他用户服务。 + +
+ +联系我(WeChat:Dveiklokk): + +Image + +WeChat Pay: + +Image + +## ⏰ Star History + +[![Star History Chart](https://api.star-history.com/svg?repos=P1kaj1uu/ChattyPlay-Agent&type=Timeline)](https://star-history.com/#P1kaj1uu/ChattyPlay-Agent&Timeline) diff --git a/goofish_backend/docs/huggingface-space.md b/goofish_backend/docs/huggingface-space.md new file mode 100644 index 0000000..ce0fc2c --- /dev/null +++ b/goofish_backend/docs/huggingface-space.md @@ -0,0 +1,63 @@ +# Hugging Face Docker Space + Vercel 部署 + +该方案保留现有 TypeScript/Node/Hono 闲鱼后端:Vercel 负责前端和普通无状态 API,Hugging Face Docker Space 负责账号常驻连接、闲鱼 WebSocket、自动回复、自动发货和 SQLite 数据。 + +## 1. 创建 Docker Space + +1. 在 Hugging Face 创建 Space,SDK 选择 **Docker**。 +2. 将本仓库推送到 Space 仓库。根目录 `README.md` 已声明 `sdk: docker` 和 `app_port: 7860`,根目录 `Dockerfile` 会启动 Node/Hono 后端。 +3. Space 应使用 Public 或 Protected 可见性。Private Space 需要 Hugging Face 身份认证,浏览器无法直接建立当前业务 WebSocket。 +4. 在 Space Settings 创建或选择 Storage Bucket,以读写方式挂载到 `/data`。未挂载时 SQLite、账号 Cookie、规则和日志会在 Space 重启后丢失。 + +## 2. 配置 Space Variables / Secrets + +在 Space Settings 添加: + +```env +NODE_ENV=production +PORT=7860 +GOOFISH_DATA_DIR=/data +GOOFISH_LOG_DIR=/data/logs +GOOFISH_SQLITE_JOURNAL_MODE=DELETE +GOOFISH_ALLOWED_ORIGINS=https://你的项目.vercel.app +GOOFISH_ADMIN_USERS=你的站点用户名 +JWT_SECRET=一个足够长的随机字符串 +``` + +`JWT_SECRET` 必须保存为 Secret,并且与 Vercel 中的 `JWT_SECRET` 完全一致。`GOOFISH_ADMIN_USERS` 可用英文逗号分隔多个管理员;如果留空,任意持有本站有效 JWT 的用户都能访问闲鱼后台。 + +部署完成后,后端地址类似: + +```text +https://username-space-name.hf.space +``` + +健康检查为 `/health`,业务 API 为 `/api/*`,浏览器推送 WebSocket 为 `/ws`。 + +## 3. 配置 Vercel Environment Variables + +在 Vercel Project Settings → Environment Variables 添加: + +```env +VITE_GOOFISH_API_URL=https://username-space-name.hf.space/api +VITE_GOOFISH_WS_URL=wss://username-space-name.hf.space/ws +GOOFISH_BACKEND_URL=https://username-space-name.hf.space +JWT_SECRET=与 Space 完全相同的随机字符串 +CRON_SECRET=另一个随机字符串 +``` + +修改 `VITE_*` 后必须重新部署。Vercel 每天会调用一次 `/api/goofish-health`,用于避免 CPU Basic Space 因长时间无页面访问而休眠;平台维护或主动重启仍可能造成短暂重连。 + +## 4. 登录与安全 + +远程闲鱼后台只接受本站用户名/密码登录后签发的 JWT。Google/GitHub 当前产生的是本地临时登录状态,不能访问 Space 后端。前端 API 请求会自动添加 `Authorization`,WebSocket 通过 `Sec-WebSocket-Protocol` 子协议携带短期 JWT,避免令牌出现在 URL 日志中;后端还会校验 Vercel Origin 和 `GOOFISH_ADMIN_USERS`。 + +不要把闲鱼 Cookie、`JWT_SECRET` 或其他密钥写入仓库。Cookie 只通过管理页面保存到挂载的 `/data/goofishcbot.db`。 + +## 5. 本地验证 + +```bash +npm run dev +``` + +打开 `http://localhost:3000/goofish`。开发环境保留同源代理并自动启动端口 `3001` 的后端。 diff --git a/goofish_backend/package-lock.json b/goofish_backend/package-lock.json new file mode 100644 index 0000000..0a50642 --- /dev/null +++ b/goofish_backend/package-lock.json @@ -0,0 +1,11828 @@ +{ + "name": "chattyplay-agent", + "version": "4.9.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "chattyplay-agent", + "version": "4.9.0", + "dependencies": { + "@emailjs/browser": "^4.4.1", + "@hcaptcha/react-hcaptcha": "^2.0.2", + "@hono/node-server": "^1.19.9", + "@hono/node-ws": "^1.3.0", + "@monaco-editor/react": "^4.7.0", + "@react-oauth/google": "^0.13.4", + "@types/better-sqlite3": "^7.6.13", + "@types/three": "^0.182.0", + "@types/ws": "^8.18.1", + "@upstash/redis": "^1.37.0", + "@vercel/hono": "^0.2.51", + "antd": "^5.12.0", + "axios": "^1.6.0", + "better-sqlite3": "^12.6.2", + "crypto-js": "^4.2.0", + "echarts": "^6.0.0", + "echarts-for-react": "^3.0.6", + "fflate": "^0.8.2", + "fundebug-javascript": "^2.8.8", + "fundebug-revideo": "^0.8.0", + "gsap": "^3.14.2", + "highlight.js": "^11.9.0", + "hono": "^4.11.7", + "http-proxy-middleware": "^3.0.5", + "i18next": "^25.8.0", + "i18next-browser-languagedetector": "^8.2.0", + "marked": "^11.1.0", + "monaco-editor": "^0.55.1", + "nprogress": "^0.2.0", + "oh-my-live2d": "^0.19.3", + "openai": "^6.25.0", + "pdfjs-dist": "^5.6.205", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-i18next": "^16.5.4", + "react-icons": "^5.5.0", + "react-pdf": "^10.4.1", + "react-router-dom": "^6.22.0", + "simplex-noise": "^4.0.3", + "styled-components": "^6.1.0", + "three": "^0.182.0", + "three-stdlib": "^2.36.1", + "vite-plugin-oh-my-live2d": "^0.19.3", + "ws": "^8.19.0" + }, + "devDependencies": { + "@types/crypto-js": "^4.2.2", + "@types/node": "^25.2.1", + "@types/nprogress": "^0.2.3", + "@types/react": "^18.2.43", + "@types/react-dom": "^18.2.17", + "@types/styled-components": "^5.1.34", + "@typescript-eslint/eslint-plugin": "^6.14.0", + "@typescript-eslint/parser": "^6.14.0", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.24", + "eslint": "^8.55.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.5", + "postcss": "^8.5.6", + "sass-embedded": "^1.97.3", + "tailwindcss": "^3.4.19", + "tsx": "^4.21.0", + "typescript": "^5.2.2", + "vite": "^5.0.8", + "wrangler": "^3.78.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ant-design/colors": { + "version": "7.2.1", + "resolved": "https://registry.npmmirror.com/@ant-design/colors/-/colors-7.2.1.tgz", + "integrity": "sha512-lCHDcEzieu4GA3n8ELeZ5VQ8pKQAWcGGLRTQ50aQM2iqPpq2evTxER84jfdPvsPAtEcZ7m44NI45edFMo8oOYQ==", + "license": "MIT", + "dependencies": { + "@ant-design/fast-color": "^2.0.6" + } + }, + "node_modules/@ant-design/cssinjs": { + "version": "1.24.0", + "resolved": "https://registry.npmmirror.com/@ant-design/cssinjs/-/cssinjs-1.24.0.tgz", + "integrity": "sha512-K4cYrJBsgvL+IoozUXYjbT6LHHNt+19a9zkvpBPxLjFHas1UpPM2A5MlhROb0BT8N8WoavM5VsP9MeSeNK/3mg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@emotion/hash": "^0.8.0", + "@emotion/unitless": "^0.7.5", + "classnames": "^2.3.1", + "csstype": "^3.1.3", + "rc-util": "^5.35.0", + "stylis": "^4.3.4" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/cssinjs-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/@ant-design/cssinjs-utils/-/cssinjs-utils-1.1.3.tgz", + "integrity": "sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg==", + "license": "MIT", + "dependencies": { + "@ant-design/cssinjs": "^1.21.0", + "@babel/runtime": "^7.23.2", + "rc-util": "^5.38.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@ant-design/fast-color": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/@ant-design/fast-color/-/fast-color-2.0.6.tgz", + "integrity": "sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@ant-design/icons": { + "version": "5.6.1", + "resolved": "https://registry.npmmirror.com/@ant-design/icons/-/icons-5.6.1.tgz", + "integrity": "sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^7.0.0", + "@ant-design/icons-svg": "^4.4.0", + "@babel/runtime": "^7.24.8", + "classnames": "^2.2.6", + "rc-util": "^5.31.1" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.4.2", + "resolved": "https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==", + "license": "MIT" + }, + "node_modules/@ant-design/react-slick": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@ant-design/react-slick/-/react-slick-1.1.2.tgz", + "integrity": "sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "resize-observer-polyfill": "^1.5.1", + "throttle-debounce": "^5.0.0" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, + "node_modules/@ant-design/react-slick/node_modules/throttle-debounce": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "license": "MIT", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.28.6.tgz", + "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.28.6.tgz", + "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bufbuild/protobuf": { + "version": "2.11.0", + "resolved": "https://registry.npmmirror.com/@bufbuild/protobuf/-/protobuf-2.11.0.tgz", + "integrity": "sha512-sBXGT13cpmPR5BMgHE6UEEfEaShh5Ror6rfN3yEK5si7QVrtZg8LEPQb0VVhiLRUslD2yLnXtnRzG035J/mZXQ==", + "dev": true, + "license": "(Apache-2.0 AND BSD-3-Clause)" + }, + "node_modules/@bugsnag/safe-json-stringify": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/@bugsnag/safe-json-stringify/-/safe-json-stringify-6.1.0.tgz", + "integrity": "sha512-ImA35rnM7bGr+J30R979FQ95BhRB4UO1KfJA0J2sVqc8nwnrS9hhE5mkTmQWMs8Vh1Da+hkLKs5jJB4JjNZp4A==", + "license": "MIT" + }, + "node_modules/@bytecodealliance/preview2-shim": { + "version": "0.17.6", + "resolved": "https://registry.npmmirror.com/@bytecodealliance/preview2-shim/-/preview2-shim-0.17.6.tgz", + "integrity": "sha512-n3cM88gTen5980UOBAD6xDcNNL3ocTK8keab21bpx1ONdA+ARj7uD1qoFxOWCyKlkpSi195FH+GeAut7Oc6zZw==", + "license": "(Apache-2.0 WITH LLVM-exception)" + }, + "node_modules/@cloudflare/kv-asset-handler": { + "version": "0.3.4", + "resolved": "https://registry.npmmirror.com/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.4.tgz", + "integrity": "sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==", + "dev": true, + "license": "MIT OR Apache-2.0", + "dependencies": { + "mime": "^3.0.0" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@cloudflare/kv-asset-handler/node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@cloudflare/unenv-preset": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/@cloudflare/unenv-preset/-/unenv-preset-2.0.2.tgz", + "integrity": "sha512-nyzYnlZjjV5xT3LizahG1Iu6mnrCaxglJ04rZLpDwlDVDZ7v46lNsfxhV3A/xtfgQuSHmLnc6SVI+KwBpc3Lwg==", + "dev": true, + "license": "MIT OR Apache-2.0", + "peerDependencies": { + "unenv": "2.0.0-rc.14", + "workerd": "^1.20250124.0" + }, + "peerDependenciesMeta": { + "workerd": { + "optional": true + } + } + }, + "node_modules/@cloudflare/workerd-darwin-64": { + "version": "1.20250718.0", + "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20250718.0.tgz", + "integrity": "sha512-FHf4t7zbVN8yyXgQ/r/GqLPaYZSGUVzeR7RnL28Mwj2djyw2ZergvytVc7fdGcczl6PQh+VKGfZCfUqpJlbi9g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-darwin-arm64": { + "version": "1.20250718.0", + "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20250718.0.tgz", + "integrity": "sha512-fUiyUJYyqqp4NqJ0YgGtp4WJh/II/YZsUnEb6vVy5Oeas8lUOxnN+ZOJ8N/6/5LQCVAtYCChRiIrBbfhTn5Z8Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-64": { + "version": "1.20250718.0", + "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20250718.0.tgz", + "integrity": "sha512-5+eb3rtJMiEwp08Kryqzzu8d1rUcK+gdE442auo5eniMpT170Dz0QxBrqkg2Z48SFUPYbj+6uknuA5tzdRSUSg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-arm64": { + "version": "1.20250718.0", + "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20250718.0.tgz", + "integrity": "sha512-Aa2M/DVBEBQDdATMbn217zCSFKE+ud/teS+fFS+OQqKABLn0azO2qq6ANAHYOIE6Q3Sq4CxDIQr8lGdaJHwUog==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-windows-64": { + "version": "1.20250718.0", + "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20250718.0.tgz", + "integrity": "sha512-dY16RXKffmugnc67LTbyjdDHZn5NoTF1yHEf2fN4+OaOnoGSp3N1x77QubTDwqZ9zECWxgQfDLjddcH8dWeFhg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@dimforge/rapier3d-compat": { + "version": "0.12.0", + "resolved": "https://registry.npmmirror.com/@dimforge/rapier3d-compat/-/rapier3d-compat-0.12.0.tgz", + "integrity": "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==", + "license": "Apache-2.0" + }, + "node_modules/@edge-runtime/format": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/@edge-runtime/format/-/format-2.2.1.tgz", + "integrity": "sha512-JQTRVuiusQLNNLe2W9tnzBlV/GvSVcozLl4XZHk5swnRZ/v6jp8TqR8P7sqmJsQqblDZ3EztcWmLDbhRje/+8g==", + "license": "MPL-2.0", + "engines": { + "node": ">=16" + } + }, + "node_modules/@edge-runtime/node-utils": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/@edge-runtime/node-utils/-/node-utils-2.3.0.tgz", + "integrity": "sha512-uUtx8BFoO1hNxtHjp3eqVPC/mWImGb2exOfGjMLUoipuWgjej+f4o/VP4bUI8U40gu7Teogd5VTeZUkGvJSPOQ==", + "license": "MPL-2.0", + "engines": { + "node": ">=16" + } + }, + "node_modules/@edge-runtime/ponyfill": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/@edge-runtime/ponyfill/-/ponyfill-2.4.2.tgz", + "integrity": "sha512-oN17GjFr69chu6sDLvXxdhg0Qe8EZviGSuqzR9qOiKh4MhFYGdBBcqRNzdmYeAdeRzOW2mM9yil4RftUQ7sUOA==", + "license": "MPL-2.0", + "engines": { + "node": ">=16" + } + }, + "node_modules/@edge-runtime/primitives": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/@edge-runtime/primitives/-/primitives-4.1.0.tgz", + "integrity": "sha512-Vw0lbJ2lvRUqc7/soqygUX216Xb8T3WBZ987oywz6aJqRxcwSVWwr9e+Nqo2m9bxobA9mdbWNNoRY6S9eko1EQ==", + "license": "MPL-2.0", + "engines": { + "node": ">=16" + } + }, + "node_modules/@edge-runtime/vm": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/@edge-runtime/vm/-/vm-3.2.0.tgz", + "integrity": "sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==", + "license": "MPL-2.0", + "dependencies": { + "@edge-runtime/primitives": "4.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@emailjs/browser": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/@emailjs/browser/-/browser-4.4.1.tgz", + "integrity": "sha512-DGSlP9sPvyFba3to2A50kDtZ+pXVp/0rhmqs2LmbMS3I5J8FSOgLwzY2Xb4qfKlOVHh29EAutLYwe5yuEZmEFg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmmirror.com/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmmirror.com/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmmirror.com/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", + "license": "MIT" + }, + "node_modules/@esbuild-plugins/node-globals-polyfill": { + "version": "0.2.3", + "resolved": "https://registry.npmmirror.com/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz", + "integrity": "sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "esbuild": "*" + } + }, + "node_modules/@esbuild-plugins/node-modules-polyfill": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.2.2.tgz", + "integrity": "sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==", + "dev": true, + "license": "ISC", + "dependencies": { + "escape-string-regexp": "^4.0.0", + "rollup-plugin-node-polyfills": "^0.2.1" + }, + "peerDependencies": { + "esbuild": "*" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@hcaptcha/react-hcaptcha": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/@hcaptcha/react-hcaptcha/-/react-hcaptcha-2.0.2.tgz", + "integrity": "sha512-VbuH6VJ6m3BHmVBHs0fL9t+suZd7PQEqCzqL2BiUbBvbHI3XfvSgdiug2QiEPN8zskbPTIV/FfGPF53JCckrow==", + "license": "MIT" + }, + "node_modules/@hono/node-server": { + "version": "1.19.9", + "resolved": "https://registry.npmmirror.com/@hono/node-server/-/node-server-1.19.9.tgz", + "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==", + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, + "node_modules/@hono/node-ws": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/@hono/node-ws/-/node-ws-1.3.0.tgz", + "integrity": "sha512-ju25YbbvLuXdqBCmLZLqnNYu1nbHIQjoyUqA8ApZOeL1k4skuiTcw5SW77/5SUYo2Xi2NVBJoVlfQurnKEp03Q==", + "license": "MIT", + "dependencies": { + "ws": "^8.17.0" + }, + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "@hono/node-server": "^1.19.2", + "hono": "^4.6.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz", + "integrity": "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==", + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.3.tgz", + "integrity": "sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==", + "license": "BSD-3-Clause", + "dependencies": { + "consola": "^3.2.3", + "detect-libc": "^2.0.0", + "https-proxy-agent": "^7.0.5", + "node-fetch": "^2.6.7", + "nopt": "^8.0.0", + "semver": "^7.5.3", + "tar": "^7.4.0" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@monaco-editor/loader": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/@monaco-editor/loader/-/loader-1.7.0.tgz", + "integrity": "sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA==", + "license": "MIT", + "dependencies": { + "state-local": "^1.0.6" + } + }, + "node_modules/@monaco-editor/react": { + "version": "4.7.0", + "resolved": "https://registry.npmmirror.com/@monaco-editor/react/-/react-4.7.0.tgz", + "integrity": "sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==", + "license": "MIT", + "dependencies": { + "@monaco-editor/loader": "^1.5.0" + }, + "peerDependencies": { + "monaco-editor": ">= 0.25.0 < 1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@napi-rs/canvas": { + "version": "0.1.99", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas/-/canvas-0.1.99.tgz", + "integrity": "sha512-zN4eQlK3eBf7aJBcTHZilpBH3tDekBzPMIWC8r0s94Ecl73XfOyFi4w7yKFMRVUT0lvNQjtOL8YSrwqQj6mZFg==", + "license": "MIT", + "optional": true, + "workspaces": [ + "e2e/*" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@napi-rs/canvas-android-arm64": "0.1.99", + "@napi-rs/canvas-darwin-arm64": "0.1.99", + "@napi-rs/canvas-darwin-x64": "0.1.99", + "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.99", + "@napi-rs/canvas-linux-arm64-gnu": "0.1.99", + "@napi-rs/canvas-linux-arm64-musl": "0.1.99", + "@napi-rs/canvas-linux-riscv64-gnu": "0.1.99", + "@napi-rs/canvas-linux-x64-gnu": "0.1.99", + "@napi-rs/canvas-linux-x64-musl": "0.1.99", + "@napi-rs/canvas-win32-arm64-msvc": "0.1.99", + "@napi-rs/canvas-win32-x64-msvc": "0.1.99" + } + }, + "node_modules/@napi-rs/canvas-android-arm64": { + "version": "0.1.99", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.99.tgz", + "integrity": "sha512-9OCRt8VVxA17m32NWZKyNC2qamdaS/SC5CEOIQwFngRq0DIeVm4PDal+6Ljnhqm2whZiC63DNuKZ4xSp2nbj9w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-darwin-arm64": { + "version": "0.1.99", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.99.tgz", + "integrity": "sha512-lupMDMy1+H38dhyCcLirOKKVUyzzlxi7j7rGPLI3vViMHOoPjcXO1b10ivy+ad+q6MiwHfoLjKTCoLke5ySOBg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-darwin-x64": { + "version": "0.1.99", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.99.tgz", + "integrity": "sha512-fdz02t4w8n6Ii/rYhWig6STb/zcTmCC/6YZTGmjoDeidDwn9Wf0ukQVynhCPEs29vqUc66wHZKsuIgMs9tycCg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-linux-arm-gnueabihf": { + "version": "0.1.99", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.99.tgz", + "integrity": "sha512-w4FwVwlNo00ezeRhfY62IVIyt6G3u8wodkPtiqWc52BUHx+VDBUM2vkS3ogfANaLI7hnf3s6WK4LyZVUjBg1lA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-linux-arm64-gnu": { + "version": "0.1.99", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.99.tgz", + "integrity": "sha512-8JvHeexKQ8c7g0q7YJ29NVQwnf1ePghP9ys9ZN0R0qzyqJQ9Uw6N9qnDINArlm3IYHexB7LjzArIfhQiqSDGvQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-linux-arm64-musl": { + "version": "0.1.99", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.99.tgz", + "integrity": "sha512-Z+6nyLdJXWzLPVxi4H6g9TJop4DwN3KSgHWto5JCbZV5/uKoVqcSynPs0tGlUHOoWI8S8tEvJspz51GQkvr07w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-linux-riscv64-gnu": { + "version": "0.1.99", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.99.tgz", + "integrity": "sha512-jAnfOUv4IO1l8Levk5t85oVtEBOXLa07KnIUgWo1CDlPxiqpxS3uBfiE38Lvj/CQgHaNF6Nxk/SaemwLgsVJgw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-linux-x64-gnu": { + "version": "0.1.99", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.99.tgz", + "integrity": "sha512-mIkXw3fGmbYyFjSmfWEvty4jN+rwEOmv0+Dy9bRvvTzLYWCgm3RMgUEQVfAKFw96nIRFnyNZiK83KNQaVVFjng==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-linux-x64-musl": { + "version": "0.1.99", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.99.tgz", + "integrity": "sha512-f3Uz2P0RgrtBHISxZqr6yiYXJlTDyCVBumDacxo+4AmSg7z0HiqYZKGWC/gszq3fbPhyQUya1W2AEteKxT9Y6A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-win32-arm64-msvc": { + "version": "0.1.99", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-win32-arm64-msvc/-/canvas-win32-arm64-msvc-0.1.99.tgz", + "integrity": "sha512-XE6KUkfqRsCNejcoRMiMr3RaUeObxNf6y7dut3hrq2rn7PzfRTZgrjF1F/B2C7FcdgqY/vSHWpQeMuNz1vTNHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-win32-x64-msvc": { + "version": "0.1.99", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.99.tgz", + "integrity": "sha512-plMYGVbc/vmmPF9MtmHbwNk1rL1Aj53vQZt+Gnv1oZn6gmd9jEHHJ0n9Nd2nxa5sKH7TS5IjkCDM6289O0d6PQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.5.6.tgz", + "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.6", + "@parcel/watcher-darwin-arm64": "2.5.6", + "@parcel/watcher-darwin-x64": "2.5.6", + "@parcel/watcher-freebsd-x64": "2.5.6", + "@parcel/watcher-linux-arm-glibc": "2.5.6", + "@parcel/watcher-linux-arm-musl": "2.5.6", + "@parcel/watcher-linux-arm64-glibc": "2.5.6", + "@parcel/watcher-linux-arm64-musl": "2.5.6", + "@parcel/watcher-linux-x64-glibc": "2.5.6", + "@parcel/watcher-linux-x64-musl": "2.5.6", + "@parcel/watcher-win32-arm64": "2.5.6", + "@parcel/watcher-win32-ia32": "2.5.6", + "@parcel/watcher-win32-x64": "2.5.6" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", + "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", + "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", + "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", + "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", + "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", + "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", + "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", + "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", + "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", + "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", + "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", + "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", + "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rc-component/async-validator": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/@rc-component/async-validator/-/async-validator-5.1.0.tgz", + "integrity": "sha512-n4HcR5siNUXRX23nDizbZBQPO0ZM/5oTtmKZ6/eqL0L2bo747cklFdZGRN2f+c9qWGICwDzrhW0H7tE9PptdcA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.4" + }, + "engines": { + "node": ">=14.x" + } + }, + "node_modules/@rc-component/color-picker": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/@rc-component/color-picker/-/color-picker-2.0.1.tgz", + "integrity": "sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==", + "license": "MIT", + "dependencies": { + "@ant-design/fast-color": "^2.0.6", + "@babel/runtime": "^7.23.6", + "classnames": "^2.2.6", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/context": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@rc-component/context/-/context-1.4.0.tgz", + "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/mini-decimal": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", + "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@rc-component/mutate-observer": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz", + "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/portal": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@rc-component/portal/-/portal-1.1.2.tgz", + "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/qrcode": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/@rc-component/qrcode/-/qrcode-1.1.1.tgz", + "integrity": "sha512-LfLGNymzKdUPjXUbRP+xOhIWY4jQ+YMj5MmWAcgcAq1Ij8XP7tRmAXqyuv96XvLUBE/5cA8hLFl9eO1JQMujrA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/tour": { + "version": "1.15.1", + "resolved": "https://registry.npmmirror.com/@rc-component/tour/-/tour-1.15.1.tgz", + "integrity": "sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/portal": "^1.0.0-9", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/trigger": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/@rc-component/trigger/-/trigger-2.3.1.tgz", + "integrity": "sha512-ORENF39PeXTzM+gQEshuk460Z8N4+6DkjpxlpE7Q3gYy1iBpLrx0FOJz3h62ryrJZ/3zCAUIkT1Pb/8hHWpb3A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@rc-component/portal": "^1.1.0", + "classnames": "^2.3.2", + "rc-motion": "^2.0.0", + "rc-resize-observer": "^1.3.1", + "rc-util": "^5.44.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@react-oauth/google": { + "version": "0.13.4", + "resolved": "https://registry.npmmirror.com/@react-oauth/google/-/google-0.13.4.tgz", + "integrity": "sha512-hGKyNEH+/PK8M0sFEuo3MAEk0txtHpgs94tDQit+s2LXg7b6z53NtzHfqDvoB2X8O6lGB+FRg80hY//X6hfD+w==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@remix-run/router": { + "version": "1.23.2", + "resolved": "https://registry.npmmirror.com/@remix-run/router/-/router-1.23.2.tgz", + "integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@renovatebot/pep440": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/@renovatebot/pep440/-/pep440-4.2.1.tgz", + "integrity": "sha512-2FK1hF93Fuf1laSdfiEmJvSJPVIDHEUTz68D3Fi9s0IZrrpaEcj6pTFBTbYvsgC5du4ogrtf5re7yMMvrKNgkw==", + "license": "Apache-2.0", + "engines": { + "node": "^20.9.0 || ^22.11.0 || ^24", + "pnpm": "^10.0.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@ts-morph/common": { + "version": "0.11.1", + "resolved": "https://registry.npmmirror.com/@ts-morph/common/-/common-0.11.1.tgz", + "integrity": "sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==", + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.7", + "minimatch": "^3.0.4", + "mkdirp": "^1.0.4", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@tweenjs/tween.js": { + "version": "23.1.3", + "resolved": "https://registry.npmmirror.com/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", + "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/better-sqlite3": { + "version": "7.6.13", + "resolved": "https://registry.npmmirror.com/@types/better-sqlite3/-/better-sqlite3-7.6.13.tgz", + "integrity": "sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/crypto-js": { + "version": "4.2.2", + "resolved": "https://registry.npmmirror.com/@types/crypto-js/-/crypto-js-4.2.2.tgz", + "integrity": "sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/draco3d": { + "version": "1.4.10", + "resolved": "https://registry.npmmirror.com/@types/draco3d/-/draco3d-1.4.10.tgz", + "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.7", + "resolved": "https://registry.npmmirror.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.7.tgz", + "integrity": "sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "hoist-non-react-statics": "^3.3.0" + }, + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/http-proxy": { + "version": "1.17.17", + "resolved": "https://registry.npmmirror.com/@types/http-proxy/-/http-proxy-1.17.17.tgz", + "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.2.1", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-25.2.1.tgz", + "integrity": "sha512-CPrnr8voK8vC6eEtyRzvMpgp3VyVRhgclonE7qYi6P9sXwYb59ucfrnmFBTaP0yUi8Gk4yZg/LlTJULGxvTNsg==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/nprogress": { + "version": "0.2.3", + "resolved": "https://registry.npmmirror.com/@types/nprogress/-/nprogress-0.2.3.tgz", + "integrity": "sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/offscreencanvas": { + "version": "2019.7.3", + "resolved": "https://registry.npmmirror.com/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.27", + "resolved": "https://registry.npmmirror.com/@types/react/-/react-18.3.27.tgz", + "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmmirror.com/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/stats.js": { + "version": "0.17.4", + "resolved": "https://registry.npmmirror.com/@types/stats.js/-/stats.js-0.17.4.tgz", + "integrity": "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==", + "license": "MIT" + }, + "node_modules/@types/styled-components": { + "version": "5.1.36", + "resolved": "https://registry.npmmirror.com/@types/styled-components/-/styled-components-5.1.36.tgz", + "integrity": "sha512-pGMRNY5G2rNDKEv2DOiFYa7Ft1r0jrhmgBwHhOMzPTgCjO76bCot0/4uEfqj7K0Jf1KdQmDtAuaDk9EAs9foSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hoist-non-react-statics": "*", + "@types/react": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/stylis": { + "version": "4.2.7", + "resolved": "https://registry.npmmirror.com/@types/stylis/-/stylis-4.2.7.tgz", + "integrity": "sha512-VgDNokpBoKF+wrdvhAAfS55OMQpL6QRglwTwNC3kIgBrzZxA4WsFj+2eLfEA/uMUDzBcEhYmjSbwQakn/i3ajA==", + "license": "MIT" + }, + "node_modules/@types/three": { + "version": "0.182.0", + "resolved": "https://registry.npmmirror.com/@types/three/-/three-0.182.0.tgz", + "integrity": "sha512-WByN9V3Sbwbe2OkWuSGyoqQO8Du6yhYaXtXLoA5FkKTUJorZ+yOHBZ35zUUPQXlAKABZmbYp5oAqpA4RBjtJ/Q==", + "license": "MIT", + "dependencies": { + "@dimforge/rapier3d-compat": "~0.12.0", + "@tweenjs/tween.js": "~23.1.3", + "@types/stats.js": "*", + "@types/webxr": ">=0.5.17", + "@webgpu/types": "*", + "fflate": "~0.8.2", + "meshoptimizer": "~0.22.0" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/webxr": { + "version": "0.5.24", + "resolved": "https://registry.npmmirror.com/@types/webxr/-/webxr-0.5.24.tgz", + "integrity": "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmmirror.com/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@upstash/redis": { + "version": "1.37.0", + "resolved": "https://registry.npmmirror.com/@upstash/redis/-/redis-1.37.0.tgz", + "integrity": "sha512-LqOJ3+XWPLSZ2rGSed5DYG3ixybxb8EhZu3yQqF7MdZX1wLBG/FRcI6xcUZXHy/SS7mmXWyadrud0HJHkOc+uw==", + "license": "MIT", + "dependencies": { + "uncrypto": "^0.1.3" + } + }, + "node_modules/@vercel/build-utils": { + "version": "13.8.0", + "resolved": "https://registry.npmmirror.com/@vercel/build-utils/-/build-utils-13.8.0.tgz", + "integrity": "sha512-moQS4Qd0pvluPd6WRTHxLN3Hh0oSObVNdFv3V0spiEmCk/wm6571up3n1th2PQFqf1a3gheNfxzL7h4I9CWs2A==", + "license": "Apache-2.0", + "dependencies": { + "@vercel/python-analysis": "0.9.1" + } + }, + "node_modules/@vercel/error-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/@vercel/error-utils/-/error-utils-2.0.3.tgz", + "integrity": "sha512-CqC01WZxbLUxoiVdh9B/poPbNpY9U+tO1N9oWHwTl5YAZxcqXmmWJ8KNMFItJCUUWdY3J3xv8LvAuQv2KZ5YdQ==", + "license": "Apache-2.0" + }, + "node_modules/@vercel/hono": { + "version": "0.2.51", + "resolved": "https://registry.npmmirror.com/@vercel/hono/-/hono-0.2.51.tgz", + "integrity": "sha512-iYEjjF4qR3gTZpVoB4sMQNm5OOdKw5/P2bL1CtolDTeGaea9KwqUrLyXmdK4N41HIRZr/wduID31mmHhSdC3sA==", + "license": "Apache-2.0", + "dependencies": { + "@vercel/nft": "1.1.1", + "@vercel/node": "5.6.15", + "@vercel/static-config": "3.2.0", + "fs-extra": "11.1.0", + "path-to-regexp": "8.3.0", + "ts-morph": "12.0.0", + "zod": "3.22.4" + } + }, + "node_modules/@vercel/hono/node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@vercel/hono/node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmmirror.com/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@vercel/nft": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/@vercel/nft/-/nft-1.1.1.tgz", + "integrity": "sha512-mKMGa7CEUcXU75474kOeqHbtvK1kAcu4wiahhmlUenB5JbTQB8wVlDI8CyHR3rpGo0qlzoRWqcDzI41FUoBJCA==", + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^2.0.0", + "@rollup/pluginutils": "^5.1.3", + "acorn": "^8.6.0", + "acorn-import-attributes": "^1.9.5", + "async-sema": "^3.1.1", + "bindings": "^1.4.0", + "estree-walker": "2.0.2", + "glob": "^13.0.0", + "graceful-fs": "^4.2.9", + "node-gyp-build": "^4.2.2", + "picomatch": "^4.0.2", + "resolve-from": "^5.0.0" + }, + "bin": { + "nft": "out/cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vercel/nft/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@vercel/nft/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@vercel/nft/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@vercel/nft/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmmirror.com/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vercel/nft/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vercel/nft/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@vercel/nft/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@vercel/node": { + "version": "5.6.15", + "resolved": "https://registry.npmmirror.com/@vercel/node/-/node-5.6.15.tgz", + "integrity": "sha512-xc5fxmdk8jtuUY8y9/8W5UhTn8R1Ii1Fb3q+V8Zv+2moU9enrrBADA9ercHgE0/DtoiNDpb9Wmvnrb4bUcFOzA==", + "license": "Apache-2.0", + "dependencies": { + "@edge-runtime/node-utils": "2.3.0", + "@edge-runtime/primitives": "4.1.0", + "@edge-runtime/vm": "3.2.0", + "@types/node": "20.11.0", + "@vercel/build-utils": "13.8.0", + "@vercel/error-utils": "2.0.3", + "@vercel/nft": "1.1.1", + "@vercel/static-config": "3.2.0", + "async-listen": "3.0.0", + "cjs-module-lexer": "1.2.3", + "edge-runtime": "2.5.9", + "es-module-lexer": "1.4.1", + "esbuild": "0.27.0", + "etag": "1.8.1", + "mime-types": "2.1.35", + "node-fetch": "2.6.9", + "path-to-regexp": "6.1.0", + "path-to-regexp-updated": "npm:path-to-regexp@6.3.0", + "ts-morph": "12.0.0", + "tsx": "4.21.0", + "typescript": "npm:typescript@5.9.3", + "undici": "5.28.4" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.0.tgz", + "integrity": "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/android-arm": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.27.0.tgz", + "integrity": "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/android-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.27.0.tgz", + "integrity": "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/android-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.27.0.tgz", + "integrity": "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.0.tgz", + "integrity": "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/darwin-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.27.0.tgz", + "integrity": "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.0.tgz", + "integrity": "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.0.tgz", + "integrity": "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-arm": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.27.0.tgz", + "integrity": "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.27.0.tgz", + "integrity": "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-ia32": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.27.0.tgz", + "integrity": "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-loong64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.27.0.tgz", + "integrity": "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.0.tgz", + "integrity": "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.0.tgz", + "integrity": "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.0.tgz", + "integrity": "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-s390x": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.27.0.tgz", + "integrity": "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.27.0.tgz", + "integrity": "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.0.tgz", + "integrity": "sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.0.tgz", + "integrity": "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.0.tgz", + "integrity": "sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.0.tgz", + "integrity": "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.0.tgz", + "integrity": "sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/sunos-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.27.0.tgz", + "integrity": "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/win32-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.27.0.tgz", + "integrity": "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/win32-ia32": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.27.0.tgz", + "integrity": "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/win32-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.27.0.tgz", + "integrity": "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@types/node": { + "version": "20.11.0", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.11.0.tgz", + "integrity": "sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@vercel/node/node_modules/esbuild": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.27.0.tgz", + "integrity": "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.0", + "@esbuild/android-arm": "0.27.0", + "@esbuild/android-arm64": "0.27.0", + "@esbuild/android-x64": "0.27.0", + "@esbuild/darwin-arm64": "0.27.0", + "@esbuild/darwin-x64": "0.27.0", + "@esbuild/freebsd-arm64": "0.27.0", + "@esbuild/freebsd-x64": "0.27.0", + "@esbuild/linux-arm": "0.27.0", + "@esbuild/linux-arm64": "0.27.0", + "@esbuild/linux-ia32": "0.27.0", + "@esbuild/linux-loong64": "0.27.0", + "@esbuild/linux-mips64el": "0.27.0", + "@esbuild/linux-ppc64": "0.27.0", + "@esbuild/linux-riscv64": "0.27.0", + "@esbuild/linux-s390x": "0.27.0", + "@esbuild/linux-x64": "0.27.0", + "@esbuild/netbsd-arm64": "0.27.0", + "@esbuild/netbsd-x64": "0.27.0", + "@esbuild/openbsd-arm64": "0.27.0", + "@esbuild/openbsd-x64": "0.27.0", + "@esbuild/openharmony-arm64": "0.27.0", + "@esbuild/sunos-x64": "0.27.0", + "@esbuild/win32-arm64": "0.27.0", + "@esbuild/win32-ia32": "0.27.0", + "@esbuild/win32-x64": "0.27.0" + } + }, + "node_modules/@vercel/node/node_modules/node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@vercel/node/node_modules/path-to-regexp": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-6.1.0.tgz", + "integrity": "sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==", + "license": "MIT" + }, + "node_modules/@vercel/node/node_modules/undici": { + "version": "5.28.4", + "resolved": "https://registry.npmmirror.com/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/@vercel/node/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" + }, + "node_modules/@vercel/python-analysis": { + "version": "0.9.1", + "resolved": "https://registry.npmmirror.com/@vercel/python-analysis/-/python-analysis-0.9.1.tgz", + "integrity": "sha512-ZwEi/F2DPxFPYmfjHFy7qM3+JTWRxD1EMpbIotNNhUyd/pnIG0wNt7S73RJSx62n1Y7pmFOFowoImnhULQgKvA==", + "license": "Apache-2.0", + "dependencies": { + "@bytecodealliance/preview2-shim": "0.17.6", + "@renovatebot/pep440": "4.2.1", + "fs-extra": "11.1.1", + "js-yaml": "4.1.1", + "minimatch": "10.1.1", + "pip-requirements-js": "1.0.3", + "smol-toml": "1.5.2", + "zod": "3.22.4" + } + }, + "node_modules/@vercel/python-analysis/node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@vercel/python-analysis/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vercel/python-analysis/node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmmirror.com/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@vercel/static-config": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/@vercel/static-config/-/static-config-3.2.0.tgz", + "integrity": "sha512-UpOEIgWxWx0M+mDe1IMdHS6JuWM/L5nNIJ4ixX8v9JgBAejymo88OkgnmfLCNMem0Wd+b5vcQPWLdZybCndlsA==", + "license": "Apache-2.0", + "dependencies": { + "ajv": "8.6.3", + "json-schema-to-ts": "1.6.4", + "ts-morph": "12.0.0" + } + }, + "node_modules/@vercel/static-config/node_modules/ajv": { + "version": "8.6.3", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@vercel/static-config/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@webgpu/types": { + "version": "0.1.69", + "resolved": "https://registry.npmmirror.com/@webgpu/types/-/types-0.1.69.tgz", + "integrity": "sha512-RPmm6kgRbI8e98zSD3RVACvnuktIja5+yLgDAkTmxLr90BEwdTXRQWNLF3ETTTyH/8mKhznZuN5AveXYFEsMGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmmirror.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/antd": { + "version": "5.29.3", + "resolved": "https://registry.npmmirror.com/antd/-/antd-5.29.3.tgz", + "integrity": "sha512-3DdbGCa9tWAJGcCJ6rzR8EJFsv2CtyEbkVabZE14pfgUHfCicWCj0/QzQVLDYg8CPfQk9BH7fHCoTXHTy7MP/A==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^7.2.1", + "@ant-design/cssinjs": "^1.23.0", + "@ant-design/cssinjs-utils": "^1.1.3", + "@ant-design/fast-color": "^2.0.6", + "@ant-design/icons": "^5.6.1", + "@ant-design/react-slick": "~1.1.2", + "@babel/runtime": "^7.26.0", + "@rc-component/color-picker": "~2.0.1", + "@rc-component/mutate-observer": "^1.1.0", + "@rc-component/qrcode": "~1.1.0", + "@rc-component/tour": "~1.15.1", + "@rc-component/trigger": "^2.3.0", + "classnames": "^2.5.1", + "copy-to-clipboard": "^3.3.3", + "dayjs": "^1.11.11", + "rc-cascader": "~3.34.0", + "rc-checkbox": "~3.5.0", + "rc-collapse": "~3.9.0", + "rc-dialog": "~9.6.0", + "rc-drawer": "~7.3.0", + "rc-dropdown": "~4.2.1", + "rc-field-form": "~2.7.1", + "rc-image": "~7.12.0", + "rc-input": "~1.8.0", + "rc-input-number": "~9.5.0", + "rc-mentions": "~2.20.0", + "rc-menu": "~9.16.1", + "rc-motion": "^2.9.5", + "rc-notification": "~5.6.4", + "rc-pagination": "~5.1.0", + "rc-picker": "~4.11.3", + "rc-progress": "~4.0.0", + "rc-rate": "~2.13.1", + "rc-resize-observer": "^1.4.3", + "rc-segmented": "~2.7.0", + "rc-select": "~14.16.8", + "rc-slider": "~11.1.9", + "rc-steps": "~6.0.1", + "rc-switch": "~4.1.0", + "rc-table": "~7.54.0", + "rc-tabs": "~15.7.0", + "rc-textarea": "~1.10.2", + "rc-tooltip": "~6.4.0", + "rc-tree": "~5.13.1", + "rc-tree-select": "~5.27.0", + "rc-upload": "~4.11.0", + "rc-util": "^5.44.4", + "scroll-into-view-if-needed": "^3.1.0", + "throttle-debounce": "^5.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/antd/node_modules/throttle-debounce": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "license": "MIT", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/as-table": { + "version": "1.0.55", + "resolved": "https://registry.npmmirror.com/as-table/-/as-table-1.0.55.tgz", + "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "printable-characters": "^1.0.42" + } + }, + "node_modules/async-listen": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/async-listen/-/async-listen-3.0.0.tgz", + "integrity": "sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/async-sema": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/async-sema/-/async-sema-3.1.1.tgz", + "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.24", + "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.24.tgz", + "integrity": "sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001766", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.13.4", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.13.4.tgz", + "integrity": "sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/better-sqlite3": { + "version": "12.6.2", + "resolved": "https://registry.npmmirror.com/better-sqlite3/-/better-sqlite3-12.6.2.tgz", + "integrity": "sha512-8VYKM3MjCa9WcaSAI3hzwhmyHVlH8tiGFwf0RlTsZPWJ1I5MkzjiudCo4KC4DxOaL/53A5B1sI/IbldNFDbsKA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.1" + }, + "engines": { + "node": "20.x || 22.x || 23.x || 24.x || 25.x" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/blake3-wasm": { + "version": "2.1.5", + "resolved": "https://registry.npmmirror.com/blake3-wasm/-/blake3-wasm-2.1.5.tgz", + "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001766", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", + "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "license": "MIT" + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/code-block-writer": { + "version": "10.1.1", + "resolved": "https://registry.npmmirror.com/code-block-writer/-/code-block-writer-10.1.1.tgz", + "integrity": "sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==", + "license": "MIT" + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colorjs.io": { + "version": "0.5.2", + "resolved": "https://registry.npmmirror.com/colorjs.io/-/colorjs.io-0.5.2.tgz", + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/compute-scroll-into-view": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", + "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmmirror.com/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/convert-hrtime": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/convert-hrtime/-/convert-hrtime-3.0.0.tgz", + "integrity": "sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmmirror.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "license": "MIT", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "license": "MIT", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/data-uri-to-buffer": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", + "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", + "dev": true, + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.19", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.19.tgz", + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/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/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmmirror.com/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "dev": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dompurify": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/dompurify/-/dompurify-3.2.7.tgz", + "integrity": "sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/draco3d": { + "version": "1.5.7", + "resolved": "https://registry.npmmirror.com/draco3d/-/draco3d-1.5.7.tgz", + "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==", + "license": "Apache-2.0" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/echarts": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/echarts/-/echarts-6.0.0.tgz", + "integrity": "sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "2.3.0", + "zrender": "6.0.0" + } + }, + "node_modules/echarts-for-react": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/echarts-for-react/-/echarts-for-react-3.0.6.tgz", + "integrity": "sha512-4zqLgTGWS3JvkQDXjzkR1k1CHRdpd6by0988TWMJgnvDytegWLbeP/VNZmMa+0VJx2eD7Y632bi2JquXDgiGJg==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "size-sensor": "^1.0.1" + }, + "peerDependencies": { + "echarts": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", + "react": "^15.0.0 || >=16.0.0" + } + }, + "node_modules/echarts/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "license": "0BSD" + }, + "node_modules/edge-runtime": { + "version": "2.5.9", + "resolved": "https://registry.npmmirror.com/edge-runtime/-/edge-runtime-2.5.9.tgz", + "integrity": "sha512-pk+k0oK0PVXdlT4oRp4lwh+unuKB7Ng4iZ2HB+EZ7QCEQizX360Rp/F4aRpgpRgdP2ufB35N+1KppHmYjqIGSg==", + "license": "MPL-2.0", + "dependencies": { + "@edge-runtime/format": "2.2.1", + "@edge-runtime/ponyfill": "2.4.2", + "@edge-runtime/vm": "3.2.0", + "async-listen": "3.0.1", + "mri": "1.2.0", + "picocolors": "1.0.0", + "pretty-ms": "7.0.1", + "signal-exit": "4.0.2", + "time-span": "4.0.0" + }, + "bin": { + "edge-runtime": "dist/cli/index.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/edge-runtime/node_modules/async-listen": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/async-listen/-/async-listen-3.0.1.tgz", + "integrity": "sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/edge-runtime/node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "license": "ISC" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.283", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.283.tgz", + "integrity": "sha512-3vifjt1HgrGW/h76UEeny+adYApveS9dH2h3p57JYzBSXJIKUJAvtmIytDKjcSCt9xHfrNCFJ7gts6vkhuq++w==", + "dev": true, + "license": "ISC" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.26", + "resolved": "https://registry.npmmirror.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz", + "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/exit-hook": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/exit-hook/-/exit-hook-2.2.1.tgz", + "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmmirror.com/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmmirror.com/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.npmmirror.com/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/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "11.1.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.1.0.tgz", + "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fundebug-javascript": { + "version": "2.8.8", + "resolved": "https://registry.npmmirror.com/fundebug-javascript/-/fundebug-javascript-2.8.8.tgz", + "integrity": "sha512-7F8usYnRfwIkYHDC2RGAyXQ/muE3+NRLjT9CxXUQH6JUSjewRPVqj9Eb7/McTc4ZtAGAdMlLk08vYK04uNyEEQ==", + "dependencies": { + "@bugsnag/safe-json-stringify": "^6.0.0" + } + }, + "node_modules/fundebug-revideo": { + "version": "0.8.0", + "resolved": "https://registry.npmmirror.com/fundebug-revideo/-/fundebug-revideo-0.8.0.tgz", + "integrity": "sha512-Wwo6/tr2YCtQ3WnjLrUht8ncGvQfsqEH1uiKWz6E/qHcP9Bk9xc6NdaXnV/lhdZilhlMo2ZD6ZLrK6+8tCB29Q==" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-source": { + "version": "2.0.12", + "resolved": "https://registry.npmmirror.com/get-source/-/get-source-2.0.12.tgz", + "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", + "dev": true, + "license": "Unlicense", + "dependencies": { + "data-uri-to-buffer": "^2.0.0", + "source-map": "^0.6.1" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.1", + "resolved": "https://registry.npmmirror.com/get-tsconfig/-/get-tsconfig-4.13.1.tgz", + "integrity": "sha512-EoY1N2xCn44xU6750Sx7OjOIT59FkmstNc3X6y5xpz7D5cBtZRe/3pSlTkDJgqsOk3WwZPkWfonhhUJfttQo3w==", + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmmirror.com/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/gsap": { + "version": "3.14.2", + "resolved": "https://registry.npmmirror.com/gsap/-/gsap-3.14.2.tgz", + "integrity": "sha512-P8/mMxVLU7o4+55+1TCnQrPmgjPKnwkzkXOK1asnR9Jg2lna4tEY5qBJjMmAaOBDDZWtlRjBXjLa0w53G/uBLA==", + "license": "Standard 'no charge' license: https://gsap.com/standard-license." + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/highlight.js": { + "version": "11.11.1", + "resolved": "https://registry.npmmirror.com/highlight.js/-/highlight.js-11.11.1.tgz", + "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmmirror.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hono": { + "version": "4.11.7", + "resolved": "https://registry.npmmirror.com/hono/-/hono-4.11.7.tgz", + "integrity": "sha512-l7qMiNee7t82bH3SeyUCt9UF15EVmaBvsppY2zQtrbIhl/yzBTny+YUxsVjSjQ6gaqaeVtZmGocom8TzBlA4Yw==", + "license": "MIT", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "license": "MIT", + "dependencies": { + "void-elements": "3.1.0" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmmirror.com/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/http-proxy-middleware/-/http-proxy-middleware-3.0.5.tgz", + "integrity": "sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.15", + "debug": "^4.3.6", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.3", + "is-plain-object": "^5.0.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/i18next": { + "version": "25.8.0", + "resolved": "https://registry.npmmirror.com/i18next/-/i18next-25.8.0.tgz", + "integrity": "sha512-urrg4HMFFMQZ2bbKRK7IZ8/CTE7D8H4JRlAwqA2ZwDRFfdd0K/4cdbNNLgfn9mo+I/h9wJu61qJzH7jCFAhUZQ==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4" + }, + "peerDependencies": { + "typescript": "^5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/i18next-browser-languagedetector": { + "version": "8.2.0", + "resolved": "https://registry.npmmirror.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.2.0.tgz", + "integrity": "sha512-P+3zEKLnOF0qmiesW383vsLdtQVyKtCNA9cjSoKCppTKPQVfKd2W8hbVo5ZhNJKDqeM7BOcvNoKJOjpHh4Js9g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "5.1.4", + "resolved": "https://registry.npmmirror.com/immutable/-/immutable-5.1.4.tgz", + "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/javascript-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz", + "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", + "license": "MIT" + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmmirror.com/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-to-ts": { + "version": "1.6.4", + "resolved": "https://registry.npmmirror.com/json-schema-to-ts/-/json-schema-to-ts-1.6.4.tgz", + "integrity": "sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.6", + "ts-toolbelt": "^6.15.5" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "license": "MIT", + "dependencies": { + "string-convert": "^0.2.0" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/less": { + "version": "4.1.3", + "resolved": "https://registry.npmmirror.com/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "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/less/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "dev": true, + "license": "MPL-2.0", + "optional": true, + "peer": true, + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmmirror.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmmirror.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmmirror.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/make-cancellable-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/make-cancellable-promise/-/make-cancellable-promise-2.0.0.tgz", + "integrity": "sha512-3SEQqTpV9oqVsIWqAcmDuaNeo7yBO3tqPtqGRcKkEo0lrzD3wqbKG9mkxO65KoOgXqj+zH2phJ2LiAsdzlogSw==", + "license": "MIT", + "funding": { + "url": "https://github.com/wojtekmaj/make-cancellable-promise?sponsor=1" + } + }, + "node_modules/make-event-props": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/make-event-props/-/make-event-props-2.0.0.tgz", + "integrity": "sha512-G/hncXrl4Qt7mauJEXSg3AcdYzmpkIITTNl5I+rH9sog5Yw0kK6vseJjCaPfOXqOqQuPUP89Rkhfz5kPS8ijtw==", + "license": "MIT", + "funding": { + "url": "https://github.com/wojtekmaj/make-event-props?sponsor=1" + } + }, + "node_modules/marked": { + "version": "11.2.0", + "resolved": "https://registry.npmmirror.com/marked/-/marked-11.2.0.tgz", + "integrity": "sha512-HR0m3bvu0jAPYiIvLUUQtdg1g6D247//lvcekpHO1WMvbwDlwSkZAX9Lw4F4YHE1T0HaaNve0tuAWuV1UJ6vtw==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge-refs": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/merge-refs/-/merge-refs-2.0.0.tgz", + "integrity": "sha512-3+B21mYK2IqUWnd2EivABLT7ueDhb0b8/dGK8LoFQPrU61YITeCMn14F7y7qZafWNZhUEKb24cJdiT5Wxs3prg==", + "license": "MIT", + "funding": { + "url": "https://github.com/wojtekmaj/merge-refs?sponsor=1" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/meshoptimizer": { + "version": "0.22.0", + "resolved": "https://registry.npmmirror.com/meshoptimizer/-/meshoptimizer-0.22.0.tgz", + "integrity": "sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==", + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/miniflare": { + "version": "3.20250718.3", + "resolved": "https://registry.npmmirror.com/miniflare/-/miniflare-3.20250718.3.tgz", + "integrity": "sha512-JuPrDJhwLrNLEJiNLWO7ZzJrv/Vv9kZuwMYCfv0LskQDM6Eonw4OvywO3CH/wCGjgHzha/qyjUh8JQ068TjDgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "0.8.1", + "acorn": "8.14.0", + "acorn-walk": "8.3.2", + "exit-hook": "2.2.1", + "glob-to-regexp": "0.4.1", + "stoppable": "1.1.0", + "undici": "^5.28.5", + "workerd": "1.20250718.0", + "ws": "8.18.0", + "youch": "3.3.4", + "zod": "3.22.3" + }, + "bin": { + "miniflare": "bootstrap.js" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/miniflare/node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/miniflare/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmmirror.com/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "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/miniflare/node_modules/zod": { + "version": "3.22.3", + "resolved": "https://registry.npmmirror.com/zod/-/zod-3.22.3.tgz", + "integrity": "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmmirror.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, + "node_modules/monaco-editor": { + "version": "0.55.1", + "resolved": "https://registry.npmmirror.com/monaco-editor/-/monaco-editor-0.55.1.tgz", + "integrity": "sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==", + "license": "MIT", + "dependencies": { + "dompurify": "3.2.7", + "marked": "14.0.0" + } + }, + "node_modules/monaco-editor/node_modules/marked": { + "version": "14.0.0", + "resolved": "https://registry.npmmirror.com/marked/-/marked-14.0.0.tgz", + "integrity": "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "dev": true, + "license": "MIT", + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmmirror.com/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/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/needle": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/needle/-/needle-3.2.0.tgz", + "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/needle/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-abi": { + "version": "3.87.0", + "resolved": "https://registry.npmmirror.com/node-abi/-/node-abi-3.87.0.tgz", + "integrity": "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmmirror.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-readable-to-web-readable-stream": { + "version": "0.4.2", + "resolved": "https://registry.npmmirror.com/node-readable-to-web-readable-stream/-/node-readable-to-web-readable-stream-0.4.2.tgz", + "integrity": "sha512-/cMZNI34v//jUTrI+UIo4ieHAB5EZRY/+7OmXZgBxaWBMcW2tGdceIw06RFxWxrKZ5Jp3sI2i5TsRo+CBhtVLQ==", + "license": "MIT", + "optional": true + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "license": "ISC", + "dependencies": { + "abbrev": "^3.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/oh-my-live2d": { + "version": "0.19.3", + "resolved": "https://registry.npmmirror.com/oh-my-live2d/-/oh-my-live2d-0.19.3.tgz", + "integrity": "sha512-EWva8OUmcExIFIhqGkeiVPQt44RvYYFg+nmpkrZgQVQ+xofVFq4SDYAg5NcdK40HxyV4vORBJEg4OHIHP96MrA==", + "license": "MIT" + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/ohm-js": { + "version": "17.5.0", + "resolved": "https://registry.npmmirror.com/ohm-js/-/ohm-js-17.5.0.tgz", + "integrity": "sha512-l4Sa7026+6jsvYbt0PXKmL+f+ML32fD++IznLgxDhx2t9Cx6NC7zwRqblCujPHGGmkQerHoeBzRutdxaw/S72g==", + "license": "MIT", + "engines": { + "node": ">=0.12.1" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/openai": { + "version": "6.25.0", + "resolved": "https://registry.npmmirror.com/openai/-/openai-6.25.0.tgz", + "integrity": "sha512-mEh6VZ2ds2AGGokWARo18aPISI1OhlgdEIC1ewhkZr8pSIT31dec0ecr9Nhxx0JlybyOgoAT1sWeKtwPZzJyww==", + "license": "Apache-2.0", + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "ws": "^8.18.0", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.2.6", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp-updated": { + "name": "path-to-regexp", + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pdfjs-dist": { + "version": "5.6.205", + "resolved": "https://registry.npmmirror.com/pdfjs-dist/-/pdfjs-dist-5.6.205.tgz", + "integrity": "sha512-tlUj+2IDa7G1SbvBNN74UHRLJybZDWYom+k6p5KIZl7huBvsA4APi6mKL+zCxd3tLjN5hOOEE9Tv7VdzO88pfg==", + "license": "Apache-2.0", + "engines": { + "node": ">=20.19.0 || >=22.13.0 || >=24" + }, + "optionalDependencies": { + "@napi-rs/canvas": "^0.1.96", + "node-readable-to-web-readable-stream": "^0.4.2" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pip-requirements-js": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/pip-requirements-js/-/pip-requirements-js-1.0.3.tgz", + "integrity": "sha512-1O9Bx0mPOZht3tW4LuxOA46qkD8A1AGymWXz3UwIMqGQgiTiOaFptsCf+9IE67qcbBrg8KHG6l8ePF7CoFRW/A==", + "license": "MPL-2.0", + "dependencies": { + "ohm-js": "^17.1.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmmirror.com/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmmirror.com/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/potpack": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/potpack/-/potpack-1.0.2.tgz", + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==", + "license": "ISC" + }, + "node_modules/prebuild-install": { + "version": "7.1.2", + "resolved": "https://registry.npmmirror.com/prebuild-install/-/prebuild-install-7.1.2.tgz", + "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-ms": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/pretty-ms/-/pretty-ms-7.0.1.tgz", + "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", + "license": "MIT", + "dependencies": { + "parse-ms": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/printable-characters": { + "version": "1.0.42", + "resolved": "https://registry.npmmirror.com/printable-characters/-/printable-characters-1.0.42.tgz", + "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", + "dev": true, + "license": "Unlicense" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc-cascader": { + "version": "3.34.0", + "resolved": "https://registry.npmmirror.com/rc-cascader/-/rc-cascader-3.34.0.tgz", + "integrity": "sha512-KpXypcvju9ptjW9FaN2NFcA2QH9E9LHKq169Y0eWtH4e/wHQ5Wh5qZakAgvb8EKZ736WZ3B0zLLOBsrsja5Dag==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "classnames": "^2.3.1", + "rc-select": "~14.16.2", + "rc-tree": "~5.13.0", + "rc-util": "^5.43.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-checkbox": { + "version": "3.5.0", + "resolved": "https://registry.npmmirror.com/rc-checkbox/-/rc-checkbox-3.5.0.tgz", + "integrity": "sha512-aOAQc3E98HteIIsSqm6Xk2FPKIER6+5vyEFMZfo73TqM+VVAIqOkHoPjgKLqSNtVLWScoaM7vY2ZrGEheI79yg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.25.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-collapse": { + "version": "3.9.0", + "resolved": "https://registry.npmmirror.com/rc-collapse/-/rc-collapse-3.9.0.tgz", + "integrity": "sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.3.4", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dialog": { + "version": "9.6.0", + "resolved": "https://registry.npmmirror.com/rc-dialog/-/rc-dialog-9.6.0.tgz", + "integrity": "sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-drawer": { + "version": "7.3.0", + "resolved": "https://registry.npmmirror.com/rc-drawer/-/rc-drawer-7.3.0.tgz", + "integrity": "sha512-DX6CIgiBWNpJIMGFO8BAISFkxiuKitoizooj4BDyee8/SnBn0zwO2FHrNDpqqepj0E/TFTDpmEBCyFuTgC7MOg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@rc-component/portal": "^1.1.1", + "classnames": "^2.2.6", + "rc-motion": "^2.6.1", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dropdown": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/rc-dropdown/-/rc-dropdown-4.2.1.tgz", + "integrity": "sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.6", + "rc-util": "^5.44.1" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" + } + }, + "node_modules/rc-field-form": { + "version": "2.7.1", + "resolved": "https://registry.npmmirror.com/rc-field-form/-/rc-field-form-2.7.1.tgz", + "integrity": "sha512-vKeSifSJ6HoLaAB+B8aq/Qgm8a3dyxROzCtKNCsBQgiverpc4kWDQihoUwzUj+zNWJOykwSY4dNX3QrGwtVb9A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/async-validator": "^5.0.3", + "rc-util": "^5.32.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-image": { + "version": "7.12.0", + "resolved": "https://registry.npmmirror.com/rc-image/-/rc-image-7.12.0.tgz", + "integrity": "sha512-cZ3HTyyckPnNnUb9/DRqduqzLfrQRyi+CdHjdqgsyDpI3Ln5UX1kXnAhPBSJj9pVRzwRFgqkN7p9b6HBDjmu/Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/portal": "^1.0.2", + "classnames": "^2.2.6", + "rc-dialog": "~9.6.0", + "rc-motion": "^2.6.2", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-input": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/rc-input/-/rc-input-1.8.0.tgz", + "integrity": "sha512-KXvaTbX+7ha8a/k+eg6SYRVERK0NddX8QX7a7AnRvUa/rEH0CNMlpcBzBkhI0wp2C8C4HlMoYl8TImSN+fuHKA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-input-number": { + "version": "9.5.0", + "resolved": "https://registry.npmmirror.com/rc-input-number/-/rc-input-number-9.5.0.tgz", + "integrity": "sha512-bKaEvB5tHebUURAEXw35LDcnRZLq3x1k7GxfAqBMzmpHkDGzjAtnUL8y4y5N15rIFIg5IJgwr211jInl3cipag==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/mini-decimal": "^1.0.1", + "classnames": "^2.2.5", + "rc-input": "~1.8.0", + "rc-util": "^5.40.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-mentions": { + "version": "2.20.0", + "resolved": "https://registry.npmmirror.com/rc-mentions/-/rc-mentions-2.20.0.tgz", + "integrity": "sha512-w8HCMZEh3f0nR8ZEd466ATqmXFCMGMN5UFCzEUL0bM/nGw/wOS2GgRzKBcm19K++jDyuWCOJOdgcKGXU3fXfbQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.6", + "rc-input": "~1.8.0", + "rc-menu": "~9.16.0", + "rc-textarea": "~1.10.0", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-menu": { + "version": "9.16.1", + "resolved": "https://registry.npmmirror.com/rc-menu/-/rc-menu-9.16.1.tgz", + "integrity": "sha512-ghHx6/6Dvp+fw8CJhDUHFHDJ84hJE3BXNCzSgLdmNiFErWSOaZNsihDAsKq9ByTALo/xkNIwtDFGIl6r+RPXBg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.0.0", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.3.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-motion": { + "version": "2.9.5", + "resolved": "https://registry.npmmirror.com/rc-motion/-/rc-motion-2.9.5.tgz", + "integrity": "sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.44.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-notification": { + "version": "5.6.4", + "resolved": "https://registry.npmmirror.com/rc-notification/-/rc-notification-5.6.4.tgz", + "integrity": "sha512-KcS4O6B4qzM3KH7lkwOB7ooLPZ4b6J+VMmQgT51VZCeEcmghdeR4IrMcFq0LG+RPdnbe/ArT086tGM8Snimgiw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.9.0", + "rc-util": "^5.20.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-overflow": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/rc-overflow/-/rc-overflow-1.5.0.tgz", + "integrity": "sha512-Lm/v9h0LymeUYJf0x39OveU52InkdRXqnn2aYXfWmo8WdOonIKB2kfau+GF0fWq6jPgtdO9yMqveGcK6aIhJmg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.37.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-pagination": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/rc-pagination/-/rc-pagination-5.1.0.tgz", + "integrity": "sha512-8416Yip/+eclTFdHXLKTxZvn70duYVGTvUUWbckCCZoIl3jagqke3GLsFrMs0bsQBikiYpZLD9206Ej4SOdOXQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.38.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-picker": { + "version": "4.11.3", + "resolved": "https://registry.npmmirror.com/rc-picker/-/rc-picker-4.11.3.tgz", + "integrity": "sha512-MJ5teb7FlNE0NFHTncxXQ62Y5lytq6sh5nUw0iH8OkHL/TjARSEvSHpr940pWgjGANpjCwyMdvsEV55l5tYNSg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.1", + "rc-overflow": "^1.3.2", + "rc-resize-observer": "^1.4.0", + "rc-util": "^5.43.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "date-fns": ">= 2.x", + "dayjs": ">= 1.x", + "luxon": ">= 3.x", + "moment": ">= 2.x", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + }, + "peerDependenciesMeta": { + "date-fns": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + } + } + }, + "node_modules/rc-progress": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/rc-progress/-/rc-progress-4.0.0.tgz", + "integrity": "sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-rate": { + "version": "2.13.1", + "resolved": "https://registry.npmmirror.com/rc-rate/-/rc-rate-2.13.1.tgz", + "integrity": "sha512-QUhQ9ivQ8Gy7mtMZPAjLbxBt5y9GRp65VcUyGUMF3N3fhiftivPHdpuDIaWIMOTEprAjZPC08bls1dQB+I1F2Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-resize-observer": { + "version": "1.4.3", + "resolved": "https://registry.npmmirror.com/rc-resize-observer/-/rc-resize-observer-1.4.3.tgz", + "integrity": "sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.44.1", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-segmented": { + "version": "2.7.1", + "resolved": "https://registry.npmmirror.com/rc-segmented/-/rc-segmented-2.7.1.tgz", + "integrity": "sha512-izj1Nw/Dw2Vb7EVr+D/E9lUTkBe+kKC+SAFSU9zqr7WV2W5Ktaa9Gc7cB2jTqgk8GROJayltaec+DBlYKc6d+g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-motion": "^2.4.4", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-select": { + "version": "14.16.8", + "resolved": "https://registry.npmmirror.com/rc-select/-/rc-select-14.16.8.tgz", + "integrity": "sha512-NOV5BZa1wZrsdkKaiK7LHRuo5ZjZYMDxPP6/1+09+FB4KoNi8jcG1ZqLE3AVCxEsYMBe65OBx71wFoHRTP3LRg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.1.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.3.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-slider": { + "version": "11.1.9", + "resolved": "https://registry.npmmirror.com/rc-slider/-/rc-slider-11.1.9.tgz", + "integrity": "sha512-h8IknhzSh3FEM9u8ivkskh+Ef4Yo4JRIY2nj7MrH6GQmrwV6mcpJf5/4KgH5JaVI1H3E52yCdpOlVyGZIeph5A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-steps": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/rc-steps/-/rc-steps-6.0.1.tgz", + "integrity": "sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.16.7", + "classnames": "^2.2.3", + "rc-util": "^5.16.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-switch": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/rc-switch/-/rc-switch-4.1.0.tgz", + "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0", + "classnames": "^2.2.1", + "rc-util": "^5.30.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-table": { + "version": "7.54.0", + "resolved": "https://registry.npmmirror.com/rc-table/-/rc-table-7.54.0.tgz", + "integrity": "sha512-/wDTkki6wBTjwylwAGjpLKYklKo9YgjZwAU77+7ME5mBoS32Q4nAwoqhA2lSge6fobLW3Tap6uc5xfwaL2p0Sw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/context": "^1.4.0", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.1.0", + "rc-util": "^5.44.3", + "rc-virtual-list": "^3.14.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tabs": { + "version": "15.7.0", + "resolved": "https://registry.npmmirror.com/rc-tabs/-/rc-tabs-15.7.0.tgz", + "integrity": "sha512-ZepiE+6fmozYdWf/9gVp7k56PKHB1YYoDsKeQA1CBlJ/POIhjkcYiv0AGP0w2Jhzftd3AVvZP/K+V+Lpi2ankA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.2.0", + "rc-menu": "~9.16.0", + "rc-motion": "^2.6.2", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.34.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-textarea": { + "version": "1.10.2", + "resolved": "https://registry.npmmirror.com/rc-textarea/-/rc-textarea-1.10.2.tgz", + "integrity": "sha512-HfaeXiaSlpiSp0I/pvWpecFEHpVysZ9tpDLNkxQbMvMz6gsr7aVZ7FpWP9kt4t7DB+jJXesYS0us1uPZnlRnwQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-input": "~1.8.0", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tooltip": { + "version": "6.4.0", + "resolved": "https://registry.npmmirror.com/rc-tooltip/-/rc-tooltip-6.4.0.tgz", + "integrity": "sha512-kqyivim5cp8I5RkHmpsp1Nn/Wk+1oeloMv9c7LXNgDxUpGm+RbXJGL+OPvDlcRnx9DBeOe4wyOIl4OKUERyH1g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.1", + "rc-util": "^5.44.3" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tree": { + "version": "5.13.1", + "resolved": "https://registry.npmmirror.com/rc-tree/-/rc-tree-5.13.1.tgz", + "integrity": "sha512-FNhIefhftobCdUJshO7M8uZTA9F4OPGVXqGfZkkD/5soDeOhwO06T/aKTrg0WD8gRg/pyfq+ql3aMymLHCTC4A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.1" + }, + "engines": { + "node": ">=10.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-tree-select": { + "version": "5.27.0", + "resolved": "https://registry.npmmirror.com/rc-tree-select/-/rc-tree-select-5.27.0.tgz", + "integrity": "sha512-2qTBTzwIT7LRI1o7zLyrCzmo5tQanmyGbSaGTIf7sYimCklAToVVfpMC6OAldSKolcnjorBYPNSKQqJmN3TCww==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "classnames": "2.x", + "rc-select": "~14.16.2", + "rc-tree": "~5.13.0", + "rc-util": "^5.43.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-upload": { + "version": "4.11.0", + "resolved": "https://registry.npmmirror.com/rc-upload/-/rc-upload-4.11.0.tgz", + "integrity": "sha512-ZUyT//2JAehfHzjWowqROcwYJKnZkIUGWaTE/VogVrepSl7AFNbQf4+zGfX4zl9Vrj/Jm8scLO0R6UlPDKK4wA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.5", + "rc-util": "^5.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util": { + "version": "5.44.4", + "resolved": "https://registry.npmmirror.com/rc-util/-/rc-util-5.44.4.tgz", + "integrity": "sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^18.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/rc-virtual-list": { + "version": "3.19.2", + "resolved": "https://registry.npmmirror.com/rc-virtual-list/-/rc-virtual-list-3.19.2.tgz", + "integrity": "sha512-Ys6NcjwGkuwkeaWBDqfI3xWuZ7rDiQXlH1o2zLfFzATfEgXcqpk8CkgMfbJD81McqjcJVez25a3kPxCR807evA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmmirror.com/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmmirror.com/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-i18next": { + "version": "16.5.4", + "resolved": "https://registry.npmmirror.com/react-i18next/-/react-i18next-16.5.4.tgz", + "integrity": "sha512-6yj+dcfMncEC21QPhOTsW8mOSO+pzFmT6uvU7XXdvM/Cp38zJkmTeMeKmTrmCMD5ToT79FmiE/mRWiYWcJYW4g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "html-parse-stringify": "^3.0.1", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "i18next": ">= 25.6.2", + "react": ">= 16.8.0", + "typescript": "^5" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/react-icons": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/react-icons/-/react-icons-5.5.0.tgz", + "integrity": "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==", + "license": "MIT", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmmirror.com/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-pdf": { + "version": "10.4.1", + "resolved": "https://registry.npmmirror.com/react-pdf/-/react-pdf-10.4.1.tgz", + "integrity": "sha512-kS/35staVCBqS29verTQJQZXw7RfsRCPO3fdJoW1KXylcv7A9dw6DZ3vJXC2w+bIBgLw5FN4pOFvKSQtkQhPfA==", + "license": "MIT", + "dependencies": { + "clsx": "^2.0.0", + "dequal": "^2.0.3", + "make-cancellable-promise": "^2.0.0", + "make-event-props": "^2.0.0", + "merge-refs": "^2.0.0", + "pdfjs-dist": "5.4.296", + "tiny-invariant": "^1.0.0", + "warning": "^4.0.0" + }, + "funding": { + "url": "https://github.com/wojtekmaj/react-pdf?sponsor=1" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-pdf/node_modules/pdfjs-dist": { + "version": "5.4.296", + "resolved": "https://registry.npmmirror.com/pdfjs-dist/-/pdfjs-dist-5.4.296.tgz", + "integrity": "sha512-DlOzet0HO7OEnmUmB6wWGJrrdvbyJKftI1bhMitK7O2N8W2gc757yyYBbINy9IDafXAV9wmKr9t7xsTaNKRG5Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=20.16.0 || >=22.3.0" + }, + "optionalDependencies": { + "@napi-rs/canvas": "^0.1.80" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.30.3", + "resolved": "https://registry.npmmirror.com/react-router/-/react-router-6.30.3.tgz", + "integrity": "sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.3", + "resolved": "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-6.30.3.tgz", + "integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.2", + "react-router": "6.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmmirror.com/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/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.57.1.tgz", + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + "devOptional": 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.57.1", + "@rollup/rollup-android-arm64": "4.57.1", + "@rollup/rollup-darwin-arm64": "4.57.1", + "@rollup/rollup-darwin-x64": "4.57.1", + "@rollup/rollup-freebsd-arm64": "4.57.1", + "@rollup/rollup-freebsd-x64": "4.57.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", + "@rollup/rollup-linux-arm64-gnu": "4.57.1", + "@rollup/rollup-linux-arm64-musl": "4.57.1", + "@rollup/rollup-linux-loong64-gnu": "4.57.1", + "@rollup/rollup-linux-loong64-musl": "4.57.1", + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", + "@rollup/rollup-linux-ppc64-musl": "4.57.1", + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", + "@rollup/rollup-linux-riscv64-musl": "4.57.1", + "@rollup/rollup-linux-s390x-gnu": "4.57.1", + "@rollup/rollup-linux-x64-gnu": "4.57.1", + "@rollup/rollup-linux-x64-musl": "4.57.1", + "@rollup/rollup-openbsd-x64": "4.57.1", + "@rollup/rollup-openharmony-arm64": "4.57.1", + "@rollup/rollup-win32-arm64-msvc": "4.57.1", + "@rollup/rollup-win32-ia32-msvc": "4.57.1", + "@rollup/rollup-win32-x64-gnu": "4.57.1", + "@rollup/rollup-win32-x64-msvc": "4.57.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-inject": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", + "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.", + "dev": true, + "license": "MIT", + "dependencies": { + "estree-walker": "^0.6.1", + "magic-string": "^0.25.3", + "rollup-pluginutils": "^2.8.1" + } + }, + "node_modules/rollup-plugin-node-polyfills": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", + "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", + "dev": true, + "license": "MIT", + "dependencies": { + "rollup-plugin-inject": "^3.0.0" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmmirror.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "estree-walker": "^0.6.1" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/sass": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass/-/sass-1.97.3.tgz", + "integrity": "sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass-embedded": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded/-/sass-embedded-1.97.3.tgz", + "integrity": "sha512-eKzFy13Nk+IRHhlAwP3sfuv+PzOrvzUkwJK2hdoCKYcWGSdmwFpeGpWmyewdw8EgBnsKaSBtgf/0b2K635ecSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bufbuild/protobuf": "^2.5.0", + "colorjs.io": "^0.5.0", + "immutable": "^5.0.2", + "rxjs": "^7.4.0", + "supports-color": "^8.1.1", + "sync-child-process": "^1.0.2", + "varint": "^6.0.0" + }, + "bin": { + "sass": "dist/bin/sass.js" + }, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "sass-embedded-all-unknown": "1.97.3", + "sass-embedded-android-arm": "1.97.3", + "sass-embedded-android-arm64": "1.97.3", + "sass-embedded-android-riscv64": "1.97.3", + "sass-embedded-android-x64": "1.97.3", + "sass-embedded-darwin-arm64": "1.97.3", + "sass-embedded-darwin-x64": "1.97.3", + "sass-embedded-linux-arm": "1.97.3", + "sass-embedded-linux-arm64": "1.97.3", + "sass-embedded-linux-musl-arm": "1.97.3", + "sass-embedded-linux-musl-arm64": "1.97.3", + "sass-embedded-linux-musl-riscv64": "1.97.3", + "sass-embedded-linux-musl-x64": "1.97.3", + "sass-embedded-linux-riscv64": "1.97.3", + "sass-embedded-linux-x64": "1.97.3", + "sass-embedded-unknown-all": "1.97.3", + "sass-embedded-win32-arm64": "1.97.3", + "sass-embedded-win32-x64": "1.97.3" + } + }, + "node_modules/sass-embedded-all-unknown": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.97.3.tgz", + "integrity": "sha512-t6N46NlPuXiY3rlmG6/+1nwebOBOaLFOOVqNQOC2cJhghOD4hh2kHNQQTorCsbY9S1Kir2la1/XLBwOJfui0xg==", + "cpu": [ + "!arm", + "!arm64", + "!riscv64", + "!x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "sass": "1.97.3" + } + }, + "node_modules/sass-embedded-android-arm": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-android-arm/-/sass-embedded-android-arm-1.97.3.tgz", + "integrity": "sha512-cRTtf/KV/q0nzGZoUzVkeIVVFv3L/tS1w4WnlHapphsjTXF/duTxI8JOU1c/9GhRPiMdfeXH7vYNcMmtjwX7jg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-arm64": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.97.3.tgz", + "integrity": "sha512-aiZ6iqiHsUsaDx0EFbbmmA0QgxicSxVVN3lnJJ0f1RStY0DthUkquGT5RJ4TPdaZ6ebeJWkboV4bra+CP766eA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-riscv64": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.97.3.tgz", + "integrity": "sha512-zVEDgl9JJodofGHobaM/q6pNETG69uuBIGQHRo789jloESxxZe82lI3AWJQuPmYCOG5ElfRthqgv89h3gTeLYA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-x64": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-android-x64/-/sass-embedded-android-x64-1.97.3.tgz", + "integrity": "sha512-3ke0le7ZKepyXn/dKKspYkpBC0zUk/BMciyP5ajQUDy4qJwobd8zXdAq6kOkdiMB+d9UFJOmEkvgFJHl3lqwcw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-arm64": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.97.3.tgz", + "integrity": "sha512-fuqMTqO4gbOmA/kC5b9y9xxNYw6zDEyfOtMgabS7Mz93wimSk2M1quQaTJnL98Mkcsl2j+7shNHxIS/qpcIDDA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-x64": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.97.3.tgz", + "integrity": "sha512-b/2RBs/2bZpP8lMkyZ0Px0vkVkT8uBd0YXpOwK7iOwYkAT8SsO4+WdVwErsqC65vI5e1e5p1bb20tuwsoQBMVA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.97.3.tgz", + "integrity": "sha512-2lPQ7HQQg4CKsH18FTsj2hbw5GJa6sBQgDsls+cV7buXlHjqF8iTKhAQViT6nrpLK/e8nFCoaRgSqEC8xMnXuA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm64": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.97.3.tgz", + "integrity": "sha512-IP1+2otCT3DuV46ooxPaOKV1oL5rLjteRzf8ldZtfIEcwhSgSsHgA71CbjYgLEwMY9h4jeal8Jfv3QnedPvSjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.97.3.tgz", + "integrity": "sha512-cBTMU68X2opBpoYsSZnI321gnoaiMBEtc+60CKCclN6PCL3W3uXm8g4TLoil1hDD6mqU9YYNlVG6sJ+ZNef6Lg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm64": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.97.3.tgz", + "integrity": "sha512-Lij0SdZCsr+mNRSyDZ7XtJpXEITrYsaGbOTz5e6uFLJ9bmzUbV7M8BXz2/cA7bhfpRPT7/lwRKPdV4+aR9Ozcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-riscv64": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.97.3.tgz", + "integrity": "sha512-sBeLFIzMGshR4WmHAD4oIM7WJVkSoCIEwutzptFtGlSlwfNiijULp+J5hA2KteGvI6Gji35apR5aWj66wEn/iA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-x64": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.97.3.tgz", + "integrity": "sha512-/oWJ+OVrDg7ADDQxRLC/4g1+Nsz1g4mkYS2t6XmyMJKFTFK50FVI2t5sOdFH+zmMp+nXHKM036W94y9m4jjEcw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-riscv64": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.97.3.tgz", + "integrity": "sha512-l3IfySApLVYdNx0Kjm7Zehte1CDPZVcldma3dZt+TfzvlAEerM6YDgsk5XEj3L8eHBCgHgF4A0MJspHEo2WNfA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-x64": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.97.3.tgz", + "integrity": "sha512-Kwqwc/jSSlcpRjULAOVbndqEy2GBzo6OBmmuBVINWUaJLJ8Kczz3vIsDUWLfWz/kTEw9FHBSiL0WCtYLVAXSLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-unknown-all": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.97.3.tgz", + "integrity": "sha512-/GHajyYJmvb0IABUQHbVHf1nuHPtIDo/ClMZ81IDr59wT5CNcMe7/dMNujXwWugtQVGI5UGmqXWZQCeoGnct8Q==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "!android", + "!darwin", + "!linux", + "!win32" + ], + "dependencies": { + "sass": "1.97.3" + } + }, + "node_modules/sass-embedded-win32-arm64": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.97.3.tgz", + "integrity": "sha512-RDGtRS1GVvQfMGAmVXNxYiUOvPzn9oO1zYB/XUM9fudDRnieYTcUytpNTQZLs6Y1KfJxgt5Y+giRceC92fT8Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-x64": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.97.3.tgz", + "integrity": "sha512-SFRa2lED9UEwV6vIGeBXeBOLKF+rowF3WmNfb/BzhxmdAsKofCXrJ8ePW7OcDVrvNEbTOGwhsReIsF5sH8fVaw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/scroll-into-view-if-needed": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", + "license": "MIT", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmmirror.com/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "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/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "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": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simplex-noise": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/simplex-noise/-/simplex-noise-4.0.3.tgz", + "integrity": "sha512-qSE2I4AngLQG7BXqoZj51jokT4WUXe8mOBrvfOXpci8+6Yu44+/dD5zqDpOx3Ux792eamTd2lLcI8jqFntk/lg==", + "license": "MIT" + }, + "node_modules/size-sensor": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/size-sensor/-/size-sensor-1.0.3.tgz", + "integrity": "sha512-+k9mJ2/rQMiRmQUcjn+qznch260leIXY8r4FyYKKyRBO/s5UoeMAHGkCJyE1R/4wrIhTJONfyloY55SkE7ve3A==", + "license": "ISC" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/smol-toml": { + "version": "1.5.2", + "resolved": "https://registry.npmmirror.com/smol-toml/-/smol-toml-1.5.2.tgz", + "integrity": "sha512-QlaZEqcAH3/RtNyet1IPIYPsEWAaYyXXv1Krsi+1L/QHppjX4Ifm8MQsBISz9vE8cHicIq3clogsheili5vhaQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/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/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true, + "license": "MIT" + }, + "node_modules/stacktracey": { + "version": "2.1.8", + "resolved": "https://registry.npmmirror.com/stacktracey/-/stacktracey-2.1.8.tgz", + "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", + "dev": true, + "license": "Unlicense", + "dependencies": { + "as-table": "^1.0.36", + "get-source": "^2.0.12" + } + }, + "node_modules/state-local": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/state-local/-/state-local-1.0.7.tgz", + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==", + "license": "MIT" + }, + "node_modules/stoppable": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/stoppable/-/stoppable-1.1.0.tgz", + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4", + "npm": ">=6" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/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/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==", + "license": "MIT" + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-components": { + "version": "6.3.8", + "resolved": "https://registry.npmmirror.com/styled-components/-/styled-components-6.3.8.tgz", + "integrity": "sha512-Kq/W41AKQloOqKM39zfaMdJ4BcYDw/N5CIq4/GTI0YjU6pKcZ1KKhk6b4du0a+6RA9pIfOP/eu94Ge7cu+PDCA==", + "license": "MIT", + "dependencies": { + "@emotion/is-prop-valid": "1.4.0", + "@emotion/unitless": "0.10.0", + "@types/stylis": "4.2.7", + "css-to-react-native": "3.2.0", + "csstype": "3.2.3", + "postcss": "8.4.49", + "shallowequal": "1.1.0", + "stylis": "4.3.6", + "tslib": "2.8.1" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/styled-components/node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmmirror.com/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/styled-components/node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "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.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmmirror.com/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT" + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmmirror.com/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sync-child-process": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/sync-child-process/-/sync-child-process-1.0.2.tgz", + "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sync-message-port": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/sync-message-port": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/sync-message-port/-/sync-message-port-1.2.0.tgz", + "integrity": "sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/tailwindcss/node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tailwindcss/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/tar": { + "version": "7.5.11", + "resolved": "https://registry.npmmirror.com/tar/-/tar-7.5.11.tgz", + "integrity": "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/terser": { + "version": "5.16.1", + "resolved": "https://registry.npmmirror.com/terser/-/terser-5.16.1.tgz", + "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/three": { + "version": "0.182.0", + "resolved": "https://registry.npmmirror.com/three/-/three-0.182.0.tgz", + "integrity": "sha512-GbHabT+Irv+ihI1/f5kIIsZ+Ef9Sl5A1Y7imvS5RQjWgtTPfPnZ43JmlYI7NtCRDK9zir20lQpfg8/9Yd02OvQ==", + "license": "MIT" + }, + "node_modules/three-stdlib": { + "version": "2.36.1", + "resolved": "https://registry.npmmirror.com/three-stdlib/-/three-stdlib-2.36.1.tgz", + "integrity": "sha512-XyGQrFmNQ5O/IoKm556ftwKsBg11TIb301MB5dWNicziQBEs2g3gtOYIf7pFiLa0zI2gUwhtCjv9fmjnxKZ1Cg==", + "license": "MIT", + "dependencies": { + "@types/draco3d": "^1.4.0", + "@types/offscreencanvas": "^2019.6.4", + "@types/webxr": "^0.5.2", + "draco3d": "^1.4.1", + "fflate": "^0.6.9", + "potpack": "^1.0.1" + }, + "peerDependencies": { + "three": ">=0.128.0" + } + }, + "node_modules/three-stdlib/node_modules/fflate": { + "version": "0.6.10", + "resolved": "https://registry.npmmirror.com/fflate/-/fflate-0.6.10.tgz", + "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==", + "license": "MIT" + }, + "node_modules/time-span": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/time-span/-/time-span-4.0.0.tgz", + "integrity": "sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==", + "license": "MIT", + "dependencies": { + "convert-hrtime": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "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/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", + "license": "MIT" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmmirror.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/ts-morph": { + "version": "12.0.0", + "resolved": "https://registry.npmmirror.com/ts-morph/-/ts-morph-12.0.0.tgz", + "integrity": "sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA==", + "license": "MIT", + "dependencies": { + "@ts-morph/common": "~0.11.0", + "code-block-writer": "^10.1.1" + } + }, + "node_modules/ts-toolbelt": { + "version": "6.15.5", + "resolved": "https://registry.npmmirror.com/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz", + "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==", + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmmirror.com/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "license": "MIT" + }, + "node_modules/undici": { + "version": "5.29.0", + "resolved": "https://registry.npmmirror.com/undici/-/undici-5.29.0.tgz", + "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + }, + "node_modules/unenv": { + "version": "2.0.0-rc.14", + "resolved": "https://registry.npmmirror.com/unenv/-/unenv-2.0.0-rc.14.tgz", + "integrity": "sha512-od496pShMen7nOy5VmVJCnq8rptd45vh6Nx/r2iPbrba6pa6p+tS2ywuIHRZ/OBvSbQZB0kWvpO9XBNVFXHD3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "defu": "^6.1.4", + "exsolve": "^1.0.1", + "ohash": "^2.0.10", + "pathe": "^2.0.3", + "ufo": "^1.5.4" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmmirror.com/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-oh-my-live2d": { + "version": "0.19.3", + "resolved": "https://registry.npmmirror.com/vite-plugin-oh-my-live2d/-/vite-plugin-oh-my-live2d-0.19.3.tgz", + "integrity": "sha512-pa3Ln5lXreI7ugLMZOI5h1XVtcHj6SSGgpiDAqXREj3TxubSxxK1UoltbsgWbCtpEkVld0cq1VT3LqBAX+uEUw==", + "license": "MIT", + "dependencies": { + "javascript-stringify": "^2.1.0", + "oh-my-live2d": "0.19.3" + } + }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerd": { + "version": "1.20250718.0", + "resolved": "https://registry.npmmirror.com/workerd/-/workerd-1.20250718.0.tgz", + "integrity": "sha512-kqkIJP/eOfDlUyBzU7joBg+tl8aB25gEAGqDap+nFWb+WHhnooxjGHgxPBy3ipw2hnShPFNOQt5lFRxbwALirg==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "bin": { + "workerd": "bin/workerd" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "@cloudflare/workerd-darwin-64": "1.20250718.0", + "@cloudflare/workerd-darwin-arm64": "1.20250718.0", + "@cloudflare/workerd-linux-64": "1.20250718.0", + "@cloudflare/workerd-linux-arm64": "1.20250718.0", + "@cloudflare/workerd-windows-64": "1.20250718.0" + } + }, + "node_modules/wrangler": { + "version": "3.114.17", + "resolved": "https://registry.npmmirror.com/wrangler/-/wrangler-3.114.17.tgz", + "integrity": "sha512-tAvf7ly+tB+zwwrmjsCyJ2pJnnc7SZhbnNwXbH+OIdVas3zTSmjcZOjmLKcGGptssAA3RyTKhcF9BvKZzMUycA==", + "dev": true, + "license": "MIT OR Apache-2.0", + "dependencies": { + "@cloudflare/kv-asset-handler": "0.3.4", + "@cloudflare/unenv-preset": "2.0.2", + "@esbuild-plugins/node-globals-polyfill": "0.2.3", + "@esbuild-plugins/node-modules-polyfill": "0.2.2", + "blake3-wasm": "2.1.5", + "esbuild": "0.17.19", + "miniflare": "3.20250718.3", + "path-to-regexp": "6.3.0", + "unenv": "2.0.0-rc.14", + "workerd": "1.20250718.0" + }, + "bin": { + "wrangler": "bin/wrangler.js", + "wrangler2": "bin/wrangler.js" + }, + "engines": { + "node": ">=16.17.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2", + "sharp": "^0.33.5" + }, + "peerDependencies": { + "@cloudflare/workers-types": "^4.20250408.0" + }, + "peerDependenciesMeta": { + "@cloudflare/workers-types": { + "optional": true + } + } + }, + "node_modules/wrangler/node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmmirror.com/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/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/youch": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/youch/-/youch-3.3.4.tgz", + "integrity": "sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cookie": "^0.7.1", + "mustache": "^4.2.0", + "stacktracey": "^2.1.8" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmmirror.com/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "license": "MIT", + "optional": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zrender": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/zrender/-/zrender-6.0.0.tgz", + "integrity": "sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==", + "license": "BSD-3-Clause", + "dependencies": { + "tslib": "2.3.0" + } + }, + "node_modules/zrender/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "license": "0BSD" + } + } +} diff --git a/goofish_backend/package.json b/goofish_backend/package.json new file mode 100644 index 0000000..5af8497 --- /dev/null +++ b/goofish_backend/package.json @@ -0,0 +1,90 @@ +{ + "name": "chattyplay-agent", + "private": true, + "author": { + "name": "P1Kaj1uu", + "email": "891523233@qq.com", + "url": "https://github.com/P1Kaj1uu" + }, + "version": "4.9.0", + "type": "module", + "scripts": { + "dev": "vite", + "dev:server": "tsx watch src/services/server.ts", + "build": "tsc && vite build", + "start": "tsx src/services/server.ts", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview", + "worker:dev": "wrangler dev src/services/worker.ts", + "worker:deploy": "wrangler deploy", + "worker:tail": "wrangler tail" + }, + "dependencies": { + "@emailjs/browser": "^4.4.1", + "@hcaptcha/react-hcaptcha": "^2.0.2", + "@hono/node-server": "^1.19.9", + "@hono/node-ws": "^1.3.0", + "@monaco-editor/react": "^4.7.0", + "@react-oauth/google": "^0.13.4", + "@types/better-sqlite3": "^7.6.13", + "@types/three": "^0.182.0", + "@types/ws": "^8.18.1", + "@upstash/redis": "^1.37.0", + "@vercel/hono": "^0.2.51", + "antd": "^5.12.0", + "axios": "^1.6.0", + "better-sqlite3": "^12.6.2", + "crypto-js": "^4.2.0", + "echarts": "^6.0.0", + "echarts-for-react": "^3.0.6", + "fflate": "^0.8.2", + "fundebug-javascript": "^2.8.8", + "fundebug-revideo": "^0.8.0", + "gsap": "^3.14.2", + "highlight.js": "^11.9.0", + "hono": "^4.11.7", + "http-proxy-middleware": "^3.0.5", + "i18next": "^25.8.0", + "i18next-browser-languagedetector": "^8.2.0", + "marked": "^11.1.0", + "monaco-editor": "^0.55.1", + "nprogress": "^0.2.0", + "oh-my-live2d": "^0.19.3", + "openai": "^6.25.0", + "pdfjs-dist": "^5.6.205", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-i18next": "^16.5.4", + "react-icons": "^5.5.0", + "react-pdf": "^10.4.1", + "react-router-dom": "^6.22.0", + "simplex-noise": "^4.0.3", + "styled-components": "^6.1.0", + "three": "^0.182.0", + "three-stdlib": "^2.36.1", + "vite-plugin-oh-my-live2d": "^0.19.3", + "ws": "^8.19.0" + }, + "devDependencies": { + "@types/crypto-js": "^4.2.2", + "@types/node": "^25.2.1", + "@types/nprogress": "^0.2.3", + "@types/react": "^18.2.43", + "@types/react-dom": "^18.2.17", + "@types/styled-components": "^5.1.34", + "@typescript-eslint/eslint-plugin": "^6.14.0", + "@typescript-eslint/parser": "^6.14.0", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.24", + "eslint": "^8.55.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.5", + "postcss": "^8.5.6", + "sass-embedded": "^1.97.3", + "tailwindcss": "^3.4.19", + "tsx": "^4.21.0", + "typescript": "^5.2.2", + "vite": "^5.0.8", + "wrangler": "^3.78.0" + } +} diff --git a/goofish_backend/src/goofish/ai-tools/chat-history.tool.ts b/goofish_backend/src/goofish/ai-tools/chat-history.tool.ts new file mode 100644 index 0000000..dce8655 --- /dev/null +++ b/goofish_backend/src/goofish/ai-tools/chat-history.tool.ts @@ -0,0 +1,48 @@ +/** + * AI 聊天历史工具 + * 获取当前会话的历史消息作为上下文 + */ + +import { db } from '../db/connection' + +export interface ChatHistoryContext { + accountId: string + chatId: string +} + +export interface ChatHistoryMessage { + role: 'user' | 'assistant' + content: string + time: string +} + +/** + * 获取会话历史消息 + * 返回最近的消息,按时间正序排列 + */ +export function getChatHistory(ctx: ChatHistoryContext, limit = 10): ChatHistoryMessage[] { + const { accountId, chatId } = ctx + + if (!accountId || !chatId) { + return [] + } + + try { + const rows = db.prepare(` + SELECT content, direction, msg_time + FROM conversation_messages + WHERE account_id = ? AND chat_id = ? + ORDER BY created_at DESC + LIMIT ? + `).all(accountId, chatId, limit) as any[] + + // 反转为时间正序 + return rows.reverse().map(row => ({ + role: row.direction === 'in' ? 'user' as const : 'assistant' as const, + content: row.content, + time: row.msg_time + })) + } catch { + return [] + } +} diff --git a/goofish_backend/src/goofish/ai-tools/index.ts b/goofish_backend/src/goofish/ai-tools/index.ts new file mode 100644 index 0000000..7583408 --- /dev/null +++ b/goofish_backend/src/goofish/ai-tools/index.ts @@ -0,0 +1,22 @@ +/** + * AI 工具模块 + * 导出可供 AI 使用的工具函数和定义 + */ + +export { + queryBuyerOrders, + orderQueryToolDefinition, + type OrderQueryContext, + type OrderQueryResult, +} from "./order-query.tool" + +export { + getChatHistory, + type ChatHistoryContext, + type ChatHistoryMessage, +} from "./chat-history.tool" + +import { orderQueryToolDefinition } from "./order-query.tool" + +// 所有可用的工具定义 +export const AI_TOOLS = [orderQueryToolDefinition] diff --git a/goofish_backend/src/goofish/ai-tools/order-query.tool.ts b/goofish_backend/src/goofish/ai-tools/order-query.tool.ts new file mode 100644 index 0000000..451d8d6 --- /dev/null +++ b/goofish_backend/src/goofish/ai-tools/order-query.tool.ts @@ -0,0 +1,87 @@ +/** + * AI 订单查询工具 + * 允许 AI 查询当前对话买家的订单信息 + */ + +import { db } from "../db/connection" +import { ORDER_STATUS_TEXT } from "../types/order.types" + +export interface OrderQueryContext { + accountId: string; // 卖家账号ID + buyerUserId: string; // 买家用户ID +} + +export interface OrderQueryResult { + success: boolean; + orders?: { + orderId: string; + itemTitle: string; + price: string; + status: string; + orderTime: string; + payTime: string | null; + shipTime: string | null; + }[]; + message?: string; +} + +/** + * 查询买家订单 + * 只返回当前对话买家在当前卖家账号下的订单 + */ +export function queryBuyerOrders(ctx: OrderQueryContext): OrderQueryResult { + const { accountId, buyerUserId } = ctx + + if (!accountId || !buyerUserId) { + return { success: false, message: "缺少必要参数" } + } + + try { + const rows = db + .prepare( + ` + SELECT order_id, item_title, price, status, status_text, + order_time, pay_time, ship_time + FROM orders + WHERE account_id = ? AND buyer_user_id = ? + ORDER BY order_time DESC + LIMIT 10 + `, + ) + .all(accountId, buyerUserId) as any[] + + if (rows.length === 0) { + return { success: true, orders: [], message: "该买家暂无订单记录" } + } + + const orders = rows.map((row) => ({ + orderId: row.order_id, + itemTitle: row.item_title || "未知商品", + price: row.price || "0", + status: row.status_text || ORDER_STATUS_TEXT[row.status] || "未知状态", + orderTime: row.order_time, + payTime: row.pay_time, + shipTime: row.ship_time, + })) + + return { success: true, orders } + } catch (e) { + return { success: false, message: "查询订单失败" } + } +} + +/** + * OpenAI Function Calling 工具定义 + */ +export const orderQueryToolDefinition = { + type: "function" as const, + function: { + name: "query_buyer_orders", + description: "查询当前对话买家的订单信息,包括订单号、商品、价格、状态等", + parameters: { + type: "object", + properties: {}, + required: [], + }, + }, +} diff --git a/goofish_backend/src/goofish/api/index.ts b/goofish_backend/src/goofish/api/index.ts new file mode 100644 index 0000000..8f24bac --- /dev/null +++ b/goofish_backend/src/goofish/api/index.ts @@ -0,0 +1,7 @@ +/** + * API 模块统一导出 + */ + +export { startServer, setClientManager, createApp } from './server.js' +export { messageStore } from './stores/message.store.js' +export { conversationStore } from './stores/conversation.store.js' diff --git a/goofish_backend/src/goofish/api/middlewares/auth.middleware.ts b/goofish_backend/src/goofish/api/middlewares/auth.middleware.ts new file mode 100644 index 0000000..33884da --- /dev/null +++ b/goofish_backend/src/goofish/api/middlewares/auth.middleware.ts @@ -0,0 +1,45 @@ +import type { Context, Next } from "hono"; +import { verifyToken } from "../../utils/jwt.util"; + +const adminUsers = new Set( + (process.env.GOOFISH_ADMIN_USERS || "") + .split(",") + .map((username) => username.trim()) + .filter(Boolean), +); + +function extractToken(c: Context): string | null { + const authorization = c.req.header("Authorization"); + if (authorization?.startsWith("Bearer ")) { + return authorization.slice("Bearer ".length).trim(); + } + + const protocolHeader = c.req.header("Sec-WebSocket-Protocol") || ""; + const authProtocol = protocolHeader + .split(",") + .map((protocol) => protocol.trim()) + .find((protocol) => protocol.startsWith("chattyplay.jwt.")); + return authProtocol?.slice("chattyplay.jwt.".length) || null; +} + +export function isAuthorizedGoofishRequest(c: Context): boolean { + if (process.env.NODE_ENV !== "production") return true; + + const token = extractToken(c); + if (!token) return false; + + const payload = verifyToken(token); + if (!payload) return false; + return adminUsers.size === 0 || adminUsers.has(payload.username); +} + +export async function goofishAuthMiddleware(c: Context, next: Next) { + if (c.req.method === "OPTIONS") return next(); + if (!isAuthorizedGoofishRequest(c)) { + return c.json({ + error: "Unauthorized", + message: "请使用站点账号登录;管理员可通过 GOOFISH_ADMIN_USERS 限制访问。", + }, 401); + } + return next(); +} diff --git a/goofish_backend/src/goofish/api/middlewares/index.ts b/goofish_backend/src/goofish/api/middlewares/index.ts new file mode 100644 index 0000000..22781e2 --- /dev/null +++ b/goofish_backend/src/goofish/api/middlewares/index.ts @@ -0,0 +1,2 @@ +export { securityMiddleware } from './security.middleware' +export { goofishAuthMiddleware, isAuthorizedGoofishRequest } from './auth.middleware' diff --git a/goofish_backend/src/goofish/api/middlewares/security.middleware.ts b/goofish_backend/src/goofish/api/middlewares/security.middleware.ts new file mode 100644 index 0000000..6662858 --- /dev/null +++ b/goofish_backend/src/goofish/api/middlewares/security.middleware.ts @@ -0,0 +1,70 @@ +/** + * 安全中间件 + * 使用 Hono 内置 CSRF 中间件限制 API 只能从同源请求 + */ + +import { csrf } from "hono/csrf"; +import type { Context, Next } from "hono"; + +import { createLogger } from "../../core/logger"; +import { isAllowedFrontendOrigin } from "../../core/frontend-origin"; + +const logger = createLogger("Api:Security"); + +// 白名单路径(不需要验证来源)- 仅开发环境使用 +const WHITELIST_PATHS: string[] = []; + +/** + * 创建安全中间件 + * 使用 Hono CSRF 中间件验证 Origin 和 Sec-Fetch-Site 头 + */ +export function createSecurityMiddleware() { + // Hono CSRF 中间件 - 验证同源请求 + const csrfMiddleware = csrf({ + // 动态验证 Origin(同源或本地开发) + origin: (origin, c) => { + const host = c.req.header("host"); + if (!origin || !host) return false; + + // 提取 origin 的 host 部分 + try { + const originUrl = new URL(origin); + // 同源检查 + if (originUrl.host === host) return true; + if (isAllowedFrontendOrigin(originUrl.origin)) return true; + } catch { + return false; + } + return false; + }, + // 允许同源和直接访问(浏览器地址栏) + // 独立部署的前端访问后端属于 cross-site,具体 Origin 仍由上方白名单校验。 + secFetchSite: ["same-origin", "cross-site", "none"], + }); + + return async (c: Context, next: Next) => { + const path = c.req.path; + + // 白名单路径直接放行 + if (WHITELIST_PATHS.some((p) => path.startsWith(p))) { + return next(); + } + + // GET/HEAD/OPTIONS 请求放行(CSRF 只保护修改操作) + const method = c.req.method; + if (method === "GET" || method === "HEAD" || method === "OPTIONS") { + return next(); + } + + // 使用 CSRF 中间件验证 + try { + return await csrfMiddleware(c, next); + } catch { + logger.warn(`拒绝非法请求: ${method} ${path}`); + return c.json({ error: "Forbidden" }, 403); + } + }; +} + +// 兼容旧的导出方式 +export const securityMiddleware = createSecurityMiddleware(); diff --git a/goofish_backend/src/goofish/api/routes/accounts.ts b/goofish_backend/src/goofish/api/routes/accounts.ts new file mode 100644 index 0000000..2bdc1f8 --- /dev/null +++ b/goofish_backend/src/goofish/api/routes/accounts.ts @@ -0,0 +1,193 @@ +import { Hono } from "hono"; + +import { createLogger } from "../../core/logger"; +import { CookiesManager } from "../../core/cookies.manager"; +import { + getAllAccounts, + getAccount, + upsertAccount, + deleteAccount, + updateAccountEnabled, + getAccountStatus, + updateAccountUserInfo, +} from "../../db/index"; +import { fetchUserInfo } from "../../services/index"; +import { parseCookies } from "../../utils/cookies"; +import type { ClientManager } from "../../websocket/client.manager"; + +const logger = createLogger("Api:Account"); + +export function createAccountRoutes( + getClientManager: () => ClientManager | null, +) { + const router = new Hono(); + + // 获取所有账号 + router.get("/", (c) => { + const accounts = getAllAccounts().map((a) => ({ + ...a, + cookies: a.cookies.substring(0, 50) + "...", + status: getAccountStatus(a.id), + })); + return c.json({ accounts }); + }); + + // 获取单个账号 + router.get("/:id", (c) => { + const id = c.req.param("id"); + const account = getAccount(id); + if (!account) { + return c.json({ error: "Account not found" }, 404); + } + return c.json({ + ...account, + cookies: account.cookies.substring(0, 50) + "...", + status: getAccountStatus(id), + }); + }); + + // 添加/更新账号 + router.post("/", async (c) => { + const body = await c.req.json(); + const { id, cookies, remark, enabled } = body; + + if (cookies) { + // 新账号:先从 cookies 中提取 userId 作为临时 accountId + const cookiesObj = parseCookies(cookies); + const tempAccountId = cookiesObj["unb"]; + if (!tempAccountId) { + return c.json({ error: "Cookie中缺少必需的unb字段" }, 400); + } + + // 先保存账号到数据库(这样 CookiesManager 才能工作) + upsertAccount({ + id: tempAccountId, + cookies, + remark, + enabled, + }); + + // 然后获取用户信息 + const userInfo = await fetchUserInfo(tempAccountId); + if (!userInfo) { + // 删除刚创建的账号 + deleteAccount(tempAccountId); + return c.json({ error: "Cookie无效或已过期,无法获取用户信息" }, 400); + } + + logger.info(`获取用户信息: ${userInfo.displayName} (${tempAccountId})`); + + // 更新用户信息 + updateAccountUserInfo( + tempAccountId, + userInfo.displayName, + userInfo.avatar, + ); + + return c.json({ success: true, accountId: tempAccountId }); + } + + if (!id) { + return c.json({ error: "Missing id" }, 400); + } + + const existing = getAccount(id); + if (!existing) { + return c.json({ error: "Account not found" }, 404); + } + const success = upsertAccount({ + id, + cookies: existing.cookies, + nickname: existing.nickname, + avatar: existing.avatar, + remark, + enabled, + }); + return c.json({ success }); + }); + + // 刷新账号用户信息 + router.post("/:id/refresh-info", async (c) => { + const id = c.req.param("id"); + const account = getAccount(id); + if (!account) { + return c.json({ error: "Account not found" }, 404); + } + + const userInfo = await fetchUserInfo(id); + + if (userInfo) { + updateAccountUserInfo(id, userInfo.displayName, userInfo.avatar); + return c.json({ success: true, userInfo }); + } + return c.json({ success: false, error: "Failed to fetch user info" }); + }); + + // 删除账号 + router.delete("/:id", (c) => { + const id = c.req.param("id"); + getClientManager()?.stopClient(id); + const success = deleteAccount(id); + return c.json({ success }); + }); + + // 启用/禁用账号 + router.patch("/:id/enabled", async (c) => { + const id = c.req.param("id"); + const body = await c.req.json(); + const { enabled } = body; + const success = updateAccountEnabled(id, enabled); + const clientManager = getClientManager(); + if (enabled && clientManager) { + await clientManager.startClient(id); + } else if (!enabled && clientManager) { + clientManager.stopClient(id); + } + return c.json({ success }); + }); + + // 启动账号 + router.post("/:id/start", async (c) => { + const id = c.req.param("id"); + const clientManager = getClientManager(); + if (!clientManager) { + return c.json({ error: "ClientManager not initialized" }, 500); + } + const account = getAccount(id); + if (!account) { + return c.json({ error: "Account not found" }, 404); + } + const success = await clientManager.startClient(id); + if (success) { + updateAccountEnabled(id, true); + } + return c.json({ success }); + }); + + // 停止账号 + router.post("/:id/stop", (c) => { + const id = c.req.param("id"); + const clientManager = getClientManager(); + if (!clientManager) { + return c.json({ error: "ClientManager not initialized" }, 500); + } + const success = clientManager.stopClient(id); + if (success) { + updateAccountEnabled(id, false); + } + return c.json({ success }); + }); + + // 重启账号 + router.post("/:id/restart", async (c) => { + const id = c.req.param("id"); + const clientManager = getClientManager(); + if (!clientManager) { + return c.json({ error: "ClientManager not initialized" }, 500); + } + const success = await clientManager.restartClient(id); + return c.json({ success }); + }); + + return router; +} diff --git a/goofish_backend/src/goofish/api/routes/auth.route.ts b/goofish_backend/src/goofish/api/routes/auth.route.ts new file mode 100644 index 0000000..40c41f3 --- /dev/null +++ b/goofish_backend/src/goofish/api/routes/auth.route.ts @@ -0,0 +1,143 @@ +/** + * 用户认证路由 + */ + +import { Hono } from 'hono' +import { register, login, getUserByToken } from '../../services/auth.service' +import { createLogger } from '../../core/logger' +import { verifyTurnstileToken } from '../../../services/turnstile' + +const logger = createLogger('AuthRoute') +const authRoute = new Hono() + +/** + * 用户注册 + * POST /api/auth/register + */ +authRoute.post('/register', async (c) => { + try { + const body = await c.req.json() + const { username, password, email, 'cf-turnstile-response': turnstileToken } = body + + const isDev = process.env.NODE_ENV !== 'production' + + // 验证 Turnstile token(开发环境跳过) + if (turnstileToken && !isDev) { + const verifyResult = await verifyTurnstileToken(turnstileToken) + if (!verifyResult.success) { + return c.json({ + success: false, + message: `人机验证失败: ${verifyResult.error}`, + }, 403) + } + } + + if (!username || !password) { + return c.json({ + success: false, + message: '用户名和密码不能为空' + }, 400) + } + + const result = await register({ username, password, email }) + + if (result.success) { + return c.json(result) + } else { + return c.json(result, 400) + } + } catch (error) { + // @ts-ignore + logger.error('注册接口错误:', error) + return c.json({ + success: false, + message: '服务器错误' + }, 500) + } +}) + +/** + * 用户登录 + * POST /api/auth/login + */ +authRoute.post('/login', async (c) => { + try { + const body = await c.req.json() + const { username, password, 'cf-turnstile-response': turnstileToken } = body + + const isDev = process.env.NODE_ENV !== 'production' + + // 验证 Turnstile token(开发环境跳过) + if (turnstileToken && !isDev) { + const verifyResult = await verifyTurnstileToken(turnstileToken) + if (!verifyResult.success) { + return c.json({ + success: false, + message: `人机验证失败: ${verifyResult.error}`, + }, 403) + } + } + + if (!username || !password) { + return c.json({ + success: false, + message: '用户名和密码不能为空' + }, 400) + } + + const result = await login({ username, password }) + + if (result.success) { + return c.json(result) + } else { + return c.json(result, 400) + } + } catch (error) { + // @ts-ignore + logger.error('登录接口错误:', error) + return c.json({ + success: false, + message: '服务器错误' + }, 500) + } +}) + +/** + * 验证 token 并获取用户信息 + * GET /api/auth/me + */ +authRoute.get('/me', async (c) => { + try { + const token = c.req.header('Authorization')?.replace('Bearer ', '') + + if (!token) { + return c.json({ + success: false, + message: '未提供认证令牌' + }, 401) + } + + const user = getUserByToken(token) + + if (!user) { + return c.json({ + success: false, + message: '无效的认证令牌' + }, 401) + } + + return c.json({ + success: true, + user + }) + } catch (error) { + // @ts-ignore + logger.error('获取用户信息接口错误:', error) + return c.json({ + success: false, + message: '服务器错误' + }, 500) + } +}) + +export { authRoute } diff --git a/goofish_backend/src/goofish/api/routes/autoreply.ts b/goofish_backend/src/goofish/api/routes/autoreply.ts new file mode 100644 index 0000000..d882b32 --- /dev/null +++ b/goofish_backend/src/goofish/api/routes/autoreply.ts @@ -0,0 +1,216 @@ +import { Hono } from "hono"; +import { readFileSync } from "fs"; +import { fileURLToPath } from "url"; +import { dirname, join } from "path"; + +import { + getAutoReplyRules, + getAutoReplyRule, + createAutoReplyRule, + updateAutoReplyRule, + deleteAutoReplyRule, + toggleAutoReplyRule, + getAISettings, + saveAISettings, +} from "../../db/index"; +import { testAIConnection } from "../../services/index"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +// 读取默认提示词 +function getDefaultPrompt(): string { + try { + const promptPath = join(__dirname, "../../assets/default-prompt.md"); + return readFileSync(promptPath, "utf-8"); + } catch { + return "你是一个闲鱼卖家的智能客服助手,请用简洁友好的语气回复买家的消息。"; + } +} + +export function createAutoReplyRoutes() { + const router = new Hono(); + + // ========== AI 设置 ========== + + // 获取 AI 设置 + router.get("/ai", (c) => { + const settings = getAISettings(); + return c.json({ + baseUrl: settings.baseUrl, + apiKey: settings.apiKey ? "******" : "", + hasApiKey: !!settings.apiKey, + model: settings.model, + systemPrompt: settings.systemPrompt, + }); + }); + + // 保存 AI 设置 + router.put("/ai", async (c) => { + const body = await c.req.json(); + const { baseUrl, apiKey, model, systemPrompt } = body; + + const updates: any = {}; + if (baseUrl !== undefined) updates.baseUrl = baseUrl; + if (apiKey !== undefined && apiKey !== "******") updates.apiKey = apiKey; + if (model !== undefined) updates.model = model; + if (systemPrompt !== undefined) updates.systemPrompt = systemPrompt; + + saveAISettings(updates); + return c.json({ success: true }); + }); + + // 测试 AI 连接 + router.post("/ai/test", async (c) => { + const result = await testAIConnection(); + return c.json(result); + }); + + // 获取默认提示词 + router.get("/ai/default-prompt", (c) => { + return c.json({ prompt: getDefaultPrompt() }); + }); + + // ========== 规则管理 ========== + + // 获取所有规则 + router.get("/", (c) => { + const rules = getAutoReplyRules(); + return c.json({ + rules: rules.map((r) => ({ + id: r.id, + name: r.name, + enabled: r.enabled === 1, + priority: r.priority, + matchType: r.match_type, + matchPattern: r.match_pattern, + replyContent: r.reply_content, + accountId: r.account_id, + excludeMatch: r.exclude_match === 1, + createdAt: r.created_at, + updatedAt: r.updated_at, + })), + }); + }); + + // 获取单个规则 + router.get("/:id", (c) => { + const id = parseInt(c.req.param("id")); + const rule = getAutoReplyRule(id); + if (!rule) { + return c.json({ error: "Rule not found" }, 404); + } + return c.json({ + id: rule.id, + name: rule.name, + enabled: rule.enabled === 1, + priority: rule.priority, + matchType: rule.match_type, + matchPattern: rule.match_pattern, + replyContent: rule.reply_content, + accountId: rule.account_id, + excludeMatch: rule.exclude_match === 1, + createdAt: rule.created_at, + updatedAt: rule.updated_at, + }); + }); + + // 创建规则 + router.post("/", async (c) => { + const body = await c.req.json(); + const { + name, + enabled, + priority, + matchType, + matchPattern, + replyContent, + accountId, + excludeMatch, + } = body; + + if (!name || !matchType) { + return c.json({ error: "Missing required fields" }, 400); + } + + // 排除匹配规则不需要匹配内容,AI 类型也不需要强制填写 + if ( + !excludeMatch && + matchType !== "ai" && + (!matchPattern || !replyContent) + ) { + return c.json({ error: "Missing required fields" }, 400); + } + + if (!["exact", "contains", "regex", "ai"].includes(matchType)) { + return c.json({ error: "Invalid matchType" }, 400); + } + + // AI 规则:如果提示词为空,填入全局提示词 + let finalReplyContent = replyContent || ""; + if (matchType === "ai" && !finalReplyContent) { + const aiSettings = getAISettings(); + finalReplyContent = aiSettings.systemPrompt || ""; + } + + const id = createAutoReplyRule({ + name, + enabled: enabled !== false, + priority: priority || 0, + matchType, + matchPattern: matchPattern || "", + replyContent: finalReplyContent, + accountId: accountId || null, + excludeMatch: excludeMatch || false, + }); + + return c.json({ success: true, id }); + }); + + // 更新规则 + router.put("/:id", async (c) => { + const id = parseInt(c.req.param("id")); + const body = await c.req.json(); + + if ( + body.matchType && + !["exact", "contains", "regex", "ai"].includes(body.matchType) + ) { + return c.json({ error: "Invalid matchType" }, 400); + } + + // AI 规则:如果提示词为空,填入全局提示词 + if (body.matchType === "ai" && !body.replyContent) { + const aiSettings = getAISettings(); + body.replyContent = aiSettings.systemPrompt || ""; + } + + const success = updateAutoReplyRule(id, body); + if (!success) { + return c.json({ error: "Rule not found" }, 404); + } + + return c.json({ success: true }); + }); + + // 删除规则 + router.delete("/:id", (c) => { + const id = parseInt(c.req.param("id")); + const success = deleteAutoReplyRule(id); + if (!success) { + return c.json({ error: "Rule not found" }, 404); + } + return c.json({ success: true }); + }); + + // 切换规则启用状态 + router.post("/:id/toggle", (c) => { + const id = parseInt(c.req.param("id")); + const success = toggleAutoReplyRule(id); + if (!success) { + return c.json({ error: "Rule not found" }, 404); + } + return c.json({ success: true }); + }); + + return router; +} diff --git a/goofish_backend/src/goofish/api/routes/autosell.ts b/goofish_backend/src/goofish/api/routes/autosell.ts new file mode 100644 index 0000000..84711b1 --- /dev/null +++ b/goofish_backend/src/goofish/api/routes/autosell.ts @@ -0,0 +1,139 @@ +/** + * 自动发货 API 路由 + */ + +import { Hono } from "hono"; + +import { + getAutoSellRules, + getAutoSellRule, + createAutoSellRule, + updateAutoSellRule, + deleteAutoSellRule, + toggleAutoSellRule, + getStockItems, + getStockStats, + addStockItems, + clearStock, + getDeliveryLogs, +} from "../../db/index"; + +export function createAutoSellRoutes() { + const router = new Hono(); + + // ========== 规则管理 ========== + + // 获取所有规则 + router.get("/", (c) => { + const rules = getAutoSellRules(); + // 附加库存统计 + const rulesWithStats = rules.map((r) => { + if (r.deliveryType === "stock") { + const stats = getStockStats(r.id); + return { ...r, stockCount: stats.total, usedCount: stats.used }; + } + return r; + }); + return c.json({ rules: rulesWithStats }); + }); + + // 获取单个规则 + router.get("/:id", (c) => { + const id = parseInt(c.req.param("id")); + const rule = getAutoSellRule(id); + if (!rule) { + return c.json({ error: "规则不存在" }, 404); + } + if (rule.deliveryType === "stock") { + const stats = getStockStats(id); + return c.json({ + ...rule, + stockCount: stats.total, + usedCount: stats.used, + }); + } + return c.json(rule); + }); + + // 创建规则 + router.post("/", async (c) => { + const body = await c.req.json(); + const id = createAutoSellRule(body); + return c.json({ success: true, id }); + }); + + // 更新规则 + router.put("/:id", async (c) => { + const id = parseInt(c.req.param("id")); + const body = await c.req.json(); + const success = updateAutoSellRule(id, body); + return c.json({ success }); + }); + + // 删除规则 + router.delete("/:id", (c) => { + const id = parseInt(c.req.param("id")); + const success = deleteAutoSellRule(id); + return c.json({ success }); + }); + + // 切换规则状态 + router.post("/:id/toggle", (c) => { + const id = parseInt(c.req.param("id")); + const success = toggleAutoSellRule(id); + return c.json({ success }); + }); + + // ========== 库存管理 ========== + + // 获取规则库存 + router.get("/:id/stock", (c) => { + const id = parseInt(c.req.param("id")); + const includeUsed = c.req.query("includeUsed") === "true"; + const items = getStockItems(id, includeUsed); + const stats = getStockStats(id); + return c.json({ items, stats }); + }); + + // 添加库存 + router.post("/:id/stock", async (c) => { + const id = parseInt(c.req.param("id")); + const body = await c.req.json(); + const contents = body.contents as string[]; + if (!Array.isArray(contents) || contents.length === 0) { + return c.json({ error: "请提供库存内容" }, 400); + } + const count = addStockItems(id, contents); + return c.json({ success: true, count }); + }); + + // 清空库存 + router.delete("/:id/stock", (c) => { + const id = parseInt(c.req.param("id")); + const onlyUsed = c.req.query("onlyUsed") === "true"; + const count = clearStock(id, onlyUsed); + return c.json({ success: true, count }); + }); + + // ========== 发货记录 ========== + + // 获取发货记录 + router.get("/logs", (c) => { + const ruleId = c.req.query("ruleId"); + const orderId = c.req.query("orderId"); + const accountId = c.req.query("accountId"); + const limit = parseInt(c.req.query("limit") || "50"); + const offset = parseInt(c.req.query("offset") || "0"); + + const result = getDeliveryLogs({ + ruleId: ruleId ? parseInt(ruleId) : undefined, + orderId: orderId || undefined, + accountId: accountId || undefined, + limit, + offset, + }); + return c.json(result); + }); + + return router; +} diff --git a/goofish_backend/src/goofish/api/routes/conversations.ts b/goofish_backend/src/goofish/api/routes/conversations.ts new file mode 100644 index 0000000..0ce7d0c --- /dev/null +++ b/goofish_backend/src/goofish/api/routes/conversations.ts @@ -0,0 +1,92 @@ +import { Hono } from "hono"; + +import { conversationStore } from "../stores/conversation.store"; +import { fetchUserHead } from "../../services/index"; +import { getAccount } from "../../db/index"; + +export function createConversationRoutes() { + const router = new Hono(); + + // 获取对话列表(分页) + router.get("/", (c) => { + const limit = parseInt(c.req.query("limit") || "20"); + const offset = parseInt(c.req.query("offset") || "0"); + const { conversations, total } = conversationStore.getAll(limit, offset); + return c.json({ conversations, total, limit, offset }); + }); + + // 获取单个对话详情(只需要 chatId) + router.get("/:chatId", (c) => { + const chatId = c.req.param("chatId"); + const limit = parseInt(c.req.query("limit") || "50"); + const beforeId = c.req.query("beforeId") + ? parseInt(c.req.query("beforeId")!) + : undefined; + + // 尝试从所有账号中查找对话 + const { conversations } = conversationStore.getAll(1000, 0); // 获取最多1000个对话 + const conv = conversations.find((c) => c.chatId === chatId); + + if (!conv) { + return c.json({ error: "Conversation not found" }, 404); + } + + // 使用找到的 accountId 获取完整对话详情 + const fullConv = conversationStore.get( + conv.accountId, + chatId, + limit, + beforeId, + ); + if (!fullConv) { + return c.json({ error: "Conversation details not found" }, 404); + } + + return c.json(fullConv); + }); + + // 获取单个对话详情(分页消息) + // 路径格式: /:accountId/:chatId + router.get("/:accountId/:chatId", (c) => { + const accountId = c.req.param("accountId"); + const chatId = c.req.param("chatId"); + const limit = parseInt(c.req.query("limit") || "50"); + const beforeId = c.req.query("beforeId") + ? parseInt(c.req.query("beforeId")!) + : undefined; + const conv = conversationStore.get(accountId, chatId, limit, beforeId); + if (!conv) { + return c.json({ error: "Conversation not found" }, 404); + } + return c.json(conv); + }); + + // 标记对话已读 + router.post("/:accountId/:chatId/read", (c) => { + const accountId = c.req.param("accountId"); + const chatId = c.req.param("chatId"); + conversationStore.markRead(accountId, chatId); + return c.json({ success: true }); + }); + + // 获取用户头像 + router.get("/user/:userId/avatar", async (c) => { + const userId = c.req.param("userId"); + const accountId = c.req.query("accountId"); + + const accounts = accountId ? [getAccount(accountId)] : []; + if (accounts.length === 0 || !accounts[0]) { + return c.json({ error: "No account available" }, 400); + } + + const account = accounts[0]; + const { userHead } = await fetchUserHead(account.id, userId); + + if (userHead) { + return c.json(userHead); + } + return c.json({ error: "Failed to fetch user info" }, 404); + }); + + return router; +} diff --git a/goofish_backend/src/goofish/api/routes/dev-messages.route.ts b/goofish_backend/src/goofish/api/routes/dev-messages.route.ts new file mode 100644 index 0000000..9cce6b8 --- /dev/null +++ b/goofish_backend/src/goofish/api/routes/dev-messages.route.ts @@ -0,0 +1,268 @@ +import { Hono } from "hono"; +import { + existsSync, + mkdirSync, + writeFileSync, + readdirSync, + unlinkSync, + statSync, +} from "fs"; +import { join } from "path"; + +import { createLogger } from "../../core/logger"; +import { decryptMessagePack } from "../../utils/msgpack"; + +const logger = createLogger("Api:DevMsg"); + +// raw 日志目录 +const RAW_LOG_DIR = join(process.cwd(), "logs", "raw"); +const RAW_RETENTION_DAYS = 3; + +// 存储原始消息的缓冲区 +interface RawMessage { + accountId: string; + timestamp: string; + lwp: string; + data: any; + decoded: any[] | null; +} + +const messageBuffer: RawMessage[] = []; +const MAX_BUFFER_SIZE = 500; + +// 解码消息数据 +function decodeMessageData(msgData: any): any[] | null { + try { + const body = msgData.body || {}; + let dataList: any[] = []; + + if (body.syncPushPackage?.data) { + dataList = body.syncPushPackage.data; + } else if (Array.isArray(body.data)) { + dataList = body.data; + } else if (Array.isArray(body)) { + dataList = body; + } + + if (dataList.length === 0) return null; + + const decoded: any[] = []; + for (const item of dataList) { + const data = typeof item === "object" ? item.data || item : item; + if (!data) continue; + + try { + const result = decryptMessagePack(data); + if (result) { + decoded.push(result); + } + } catch { + // 尝试 base64 + JSON + try { + const str = Buffer.from(data, "base64").toString("utf-8"); + const parsed = JSON.parse(str); + decoded.push(parsed); + } catch { + decoded.push({ raw: data }); + } + } + } + + return decoded.length > 0 ? decoded : null; + } catch { + return null; + } +} + +// 保存原始消息到文件 +function saveRawToFile(accountId: string, data: any, decoded: any[] | null) { + try { + // 确保目录存在 + if (!existsSync(RAW_LOG_DIR)) { + mkdirSync(RAW_LOG_DIR, { recursive: true }); + } + + const now = new Date(); + const dateStr = now.toISOString().slice(0, 10); // YYYY-MM-DD + const timeStr = now.toISOString().slice(11, 19).replace(/:/g, ""); // HHMMSS + const ms = now.getMilliseconds().toString().padStart(3, "0"); + const filename = `${dateStr}_${timeStr}_${ms}_${accountId}.json`; + const filepath = join(RAW_LOG_DIR, filename); + + // 保存原始数据和解码后的数据 + const content = { + accountId, + timestamp: now.toISOString(), + raw: data, + decoded, + }; + + writeFileSync(filepath, JSON.stringify(content, null, 2), "utf-8"); + } catch (e) { + logger.debug(`保存原始消息到文件失败: ${e}`); + } +} + +// 添加原始消息到缓冲区 +export function addRawMessage(accountId: string, data: any) { + const decoded = decodeMessageData(data); + + // 保存到文件(包含解码后的数据) + saveRawToFile(accountId, data, decoded); + + const msg: RawMessage = { + accountId, + timestamp: new Date().toISOString(), + lwp: data.lwp || "", + data, + decoded, + }; + messageBuffer.unshift(msg); + + if (messageBuffer.length > MAX_BUFFER_SIZE) { + messageBuffer.pop(); + } +} + +// 清空缓冲区 +export function clearMessageBuffer() { + messageBuffer.length = 0; +} + +// 清理过期的原始消息文件 +export function cleanOldRawMessages() { + try { + if (!existsSync(RAW_LOG_DIR)) return; + + const now = Date.now(); + const maxAge = RAW_RETENTION_DAYS * 24 * 60 * 60 * 1000; + const files = readdirSync(RAW_LOG_DIR); + let cleanedCount = 0; + + for (const file of files) { + if (!file.endsWith(".json")) continue; + + const filepath = join(RAW_LOG_DIR, file); + try { + const stat = statSync(filepath); + if (now - stat.mtimeMs > maxAge) { + unlinkSync(filepath); + cleanedCount++; + } + } catch { + // 忽略单个文件错误 + } + } + + if (cleanedCount > 0) { + logger.info(`清理了 ${cleanedCount} 个过期的原始消息文件`); + } + } catch (e) { + logger.debug(`清理原始消息文件失败: ${e}`); + } +} + +// 启动时清理一次,之后每小时清理 +cleanOldRawMessages(); +setInterval(cleanOldRawMessages, 60 * 60 * 1000); + +export function createDevMessageRoutes() { + const router = new Hono(); + + // 获取所有原始消息 + router.get("/", (c) => { + const accountId = c.req.query("accountId"); + const limit = parseInt(c.req.query("limit") || "100"); + + let messages = messageBuffer; + + if (accountId) { + messages = messages.filter((m) => m.accountId === accountId); + } + + return c.json({ + total: messages.length, + messages: messages.slice(0, limit), + }); + }); + + // 获取指定账号的原始消息 + router.get("/:accountId", (c) => { + const accountId = c.req.param("accountId"); + const limit = parseInt(c.req.query("limit") || "100"); + + const messages = messageBuffer.filter((m) => m.accountId === accountId); + + return c.json({ + accountId, + total: messages.length, + messages: messages.slice(0, limit), + }); + }); + + // 清空消息缓冲区 + router.delete("/", (c) => { + clearMessageBuffer(); + logger.info("消息缓冲区已清空"); + return c.json({ success: true }); + }); + + // SSE 实时推送消息 + router.get("/stream", async (c) => { + const accountId = c.req.query("accountId"); + + c.header("Content-Type", "text/event-stream"); + c.header("Cache-Control", "no-cache"); + c.header("Connection", "keep-alive"); + + let lastIndex = 0; + + const stream = new ReadableStream({ + start(controller) { + const encoder = new TextEncoder(); + + controller.enqueue( + encoder.encode( + `data: ${JSON.stringify({ type: "connected", accountId: accountId || "all" })}\n\n`, + ), + ); + + const interval = setInterval(() => { + const currentLength = messageBuffer.length; + + if (currentLength > lastIndex) { + const newMessages = messageBuffer.slice( + 0, + currentLength - lastIndex, + ); + + for (const msg of newMessages.reverse()) { + if (!accountId || msg.accountId === accountId) { + controller.enqueue( + encoder.encode(`data: ${JSON.stringify(msg)}\n\n`), + ); + } + } + + lastIndex = currentLength; + } + }, 500); + + setTimeout(() => { + clearInterval(interval); + controller.close(); + }, 30000); + }, + }); + + return new Response(stream, { + headers: { + "Content-Type": "text/event-stream", + "Cache-Control": "no-cache", + Connection: "keep-alive", + }, + }); + }); + + return router; +} diff --git a/goofish_backend/src/goofish/api/routes/goods.ts b/goofish_backend/src/goofish/api/routes/goods.ts new file mode 100644 index 0000000..7b79ad8 --- /dev/null +++ b/goofish_backend/src/goofish/api/routes/goods.ts @@ -0,0 +1,81 @@ +import { Hono } from "hono"; + +import { getAllAccounts, getAccount } from "../../db/index"; +import { fetchGoodsList } from "../../services/index"; +import type { ClientManager } from "../../websocket/client.manager"; + +export function createGoodsRoutes( + getClientManager: () => ClientManager | null, +) { + const router = new Hono(); + + // 获取所有账号的商品列表(只获取在线账号) + router.get("/", async (c) => { + const accountId = c.req.query("accountId"); + const page = parseInt(c.req.query("page") || "1"); + + if (accountId) { + const account = getAccount(accountId); + if (!account) { + return c.json({ error: "Account not found" }, 404); + } + const result = await fetchGoodsList(accountId, accountId, page); + + return c.json({ + items: result.items.map((item) => ({ ...item, accountId })), + nextPage: result.nextPage, + totalCount: result.totalCount, + }); + } + + // 获取所有账号,但只处理在线的 + const accounts = getAllAccounts(); + const clientManager = getClientManager(); + const allItems: any[] = []; + let totalCount = 0; + + for (const account of accounts) { + // 检查账号是否在线 + const client = clientManager?.getClient(account.id); + if (!client || !client.isConnected()) { + continue; // 跳过离线账号 + } + + const result = await fetchGoodsList(account.id, account.id, page); + + const itemsWithAccount = result.items.map((item) => ({ + ...item, + accountId: account.id, + accountNickname: account.nickname, + })); + allItems.push(...itemsWithAccount); + totalCount += result.totalCount; + } + + return c.json({ + items: allItems, + totalCount, + }); + }); + + // 获取单个账号的商品列表 + router.get("/account/:id", async (c) => { + const id = c.req.param("id"); + const page = parseInt(c.req.query("page") || "1"); + + const account = getAccount(id); + if (!account) { + return c.json({ error: "Account not found" }, 404); + } + + const result = await fetchGoodsList(id, id, page); + + return c.json({ + items: result.items, + nextPage: result.nextPage, + totalCount: result.totalCount, + }); + }); + + return router; +} diff --git a/goofish_backend/src/goofish/api/routes/index.ts b/goofish_backend/src/goofish/api/routes/index.ts new file mode 100644 index 0000000..603c6f8 --- /dev/null +++ b/goofish_backend/src/goofish/api/routes/index.ts @@ -0,0 +1,11 @@ +export { createAccountRoutes } from './accounts' +export { createGoodsRoutes } from './goods' +export { createMessageRoutes } from './messages' +export { createStatusRoutes } from './status' +export { createConversationRoutes } from './conversations' +export { createLogsRoutes } from './logs' +export { createAutoReplyRoutes } from './autoreply' +export { createOrderRoutes } from './order.route' +export { createAutoSellRoutes } from './autosell' +export { createWorkflowRoutes } from './workflow.route' +export { authRoute } from './auth.route' diff --git a/goofish_backend/src/goofish/api/routes/logs.ts b/goofish_backend/src/goofish/api/routes/logs.ts new file mode 100644 index 0000000..4caddac --- /dev/null +++ b/goofish_backend/src/goofish/api/routes/logs.ts @@ -0,0 +1,166 @@ +import { Hono } from "hono"; +import fs from "fs"; +import path from "path"; +import { GOOFISH_LOG_DIR } from "../../core/storage-paths"; + +const logsDir = GOOFISH_LOG_DIR; + +export function createLogsRoutes() { + const app = new Hono(); + + // 根路径 - 返回日志信息 + app.get("/", (c) => { + try { + if (!fs.existsSync(logsDir)) { + return c.json({ + message: "日志目录不存在", + logsDir, + endpoints: { + "/api/logs/dates": "获取所有日志日期列表", + "/api/logs/current": "获取当前运行的日志", + "/api/logs/files/:date": "获取指定日期的日志文件列表", + "/api/logs/content/:date/:file": "获取指定日志文件内容", + }, + }); + } + + const entries = fs.readdirSync(logsDir, { withFileTypes: true }); + const dates = entries + .filter((e) => e.isDirectory() && /^\d{4}-\d{2}-\d{2}$/.test(e.name)) + .map((e) => e.name) + .sort((a, b) => b.localeCompare(a)); + + return c.json({ + message: "Goofish 日志 API", + logsDir, + availableDates: dates.slice(0, 5), + totalCount: dates.length, + endpoints: { + "/api/logs/dates": "获取所有日志日期列表", + "/api/logs/current": "获取当前运行的日志", + "/api/logs/files/:date": "获取指定日期的日志文件列表", + "/api/logs/content/:date/:file": "获取指定日志文件内容", + }, + }); + } catch (error) { + return c.json({ error: "获取日志信息失败" }, 500); + } + }); + + // 获取日志日期列表 + app.get("/dates", (c) => { + try { + if (!fs.existsSync(logsDir)) { + return c.json({ dates: [] }); + } + const entries = fs.readdirSync(logsDir, { withFileTypes: true }); + const dates = entries + .filter((e) => e.isDirectory() && /^\d{4}-\d{2}-\d{2}$/.test(e.name)) + .map((e) => e.name) + .sort((a, b) => b.localeCompare(a)); + return c.json({ dates }); + } catch { + return c.json({ error: "获取日志日期失败" }, 500); + } + }); + + // 获取指定日期的日志文件列表 + app.get("/files/:date", (c) => { + try { + const date = c.req.param("date"); + const dayDir = path.join(logsDir, date); + if (!fs.existsSync(dayDir)) { + return c.json({ files: [] }); + } + const files = fs + .readdirSync(dayDir) + .filter((f) => f.endsWith(".log")) + .map((f) => { + const stat = fs.statSync(path.join(dayDir, f)); + return { name: f, size: stat.size, mtime: stat.mtimeMs }; + }) + .sort((a, b) => b.mtime - a.mtime); + return c.json({ files }); + } catch { + return c.json({ error: "获取日志文件列表失败" }, 500); + } + }); + + // 获取日志文件内容 + app.get("/content/:date/:file", (c) => { + try { + const date = c.req.param("date"); + const file = c.req.param("file"); + const level = c.req.query("level"); + const limit = c.req.query("limit") || "500"; + const filePath = path.join(logsDir, date, file); + + if (!fs.existsSync(filePath)) { + return c.json({ error: "日志文件不存在" }, 404); + } + + const content = fs.readFileSync(filePath, "utf-8"); + let lines = content.split("\n").filter((l) => l.trim()); + + if (level && level !== "ALL") { + lines = lines.filter((l) => l.includes(`| ${level} `)); + } + + const maxLines = parseInt(limit, 10) || 500; + const total = lines.length; + lines = lines.slice(-maxLines); + + return c.json({ lines, total, filtered: total > maxLines }); + } catch { + return c.json({ error: "读取日志文件失败" }, 500); + } + }); + + // 获取当前运行日志(实时) + app.get("/current", (c) => { + try { + const level = c.req.query("level"); + const limit = c.req.query("limit") || "100"; + + const now = new Date(); + const dateStr = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}-${String(now.getDate()).padStart(2, "0")}`; + const dayDir = path.join(logsDir, dateStr); + + if (!fs.existsSync(dayDir)) { + return c.json({ lines: [], total: 0, file: null }); + } + + const files = fs + .readdirSync(dayDir) + .filter((f) => f.endsWith(".log")) + .map((f) => ({ + name: f, + mtime: fs.statSync(path.join(dayDir, f)).mtimeMs, + })) + .sort((a, b) => b.mtime - a.mtime); + + if (files.length === 0) { + return c.json({ lines: [], total: 0, file: null }); + } + + const latestFile = files[0].name; + const filePath = path.join(dayDir, latestFile); + const content = fs.readFileSync(filePath, "utf-8"); + let lines = content.split("\n").filter((l) => l.trim()); + + if (level && level !== "ALL") { + lines = lines.filter((l) => l.includes(`| ${level} `)); + } + + const maxLines = parseInt(limit, 10) || 100; + const total = lines.length; + lines = lines.slice(-maxLines); + + return c.json({ lines, total, file: latestFile, date: dateStr }); + } catch { + return c.json({ error: "读取当前日志失败" }, 500); + } + }); + + return app; +} diff --git a/goofish_backend/src/goofish/api/routes/messages.ts b/goofish_backend/src/goofish/api/routes/messages.ts new file mode 100644 index 0000000..76ce30d --- /dev/null +++ b/goofish_backend/src/goofish/api/routes/messages.ts @@ -0,0 +1,42 @@ +import { Hono } from "hono"; +import { messageStore } from "../stores/message.store"; +import type { ClientManager } from "../../websocket/client.manager"; + +export function createMessageRoutes( + getClientManager: () => ClientManager | null, +) { + const router = new Hono(); + + // 获取消息列表 + router.get("/", (c) => { + const limit = parseInt(c.req.query("limit") || "20"); + return c.json({ + messages: messageStore.getRecent(limit), + total: messageStore.count(), + }); + }); + + // 发送消息 + router.post("/send", async (c) => { + const clientManager = getClientManager(); + if (!clientManager) { + return c.json({ error: "ClientManager not initialized" }, 500); + } + const body = await c.req.json(); + const { accountId, chatId, toUserId, text } = body; + if (!accountId || !chatId || !toUserId || !text) { + return c.json( + { error: "Missing accountId, chatId, toUserId or text" }, + 400, + ); + } + const client = clientManager.getClient(accountId); + if (!client) { + return c.json({ error: "Account not connected" }, 400); + } + const success = await client.sendMessage(chatId, toUserId, text); + return c.json({ success }); + }); + + return router; +} diff --git a/goofish_backend/src/goofish/api/routes/order.route.ts b/goofish_backend/src/goofish/api/routes/order.route.ts new file mode 100644 index 0000000..fc14696 --- /dev/null +++ b/goofish_backend/src/goofish/api/routes/order.route.ts @@ -0,0 +1,208 @@ +/** + * 订单 API 路由 + */ + +import { Hono } from "hono"; + +import { + getOrderList, + getOrder, + fetchAndUpdateOrderDetail, +} from "../../services/order.service"; +import { updateOrderStatus, deleteOrder } from "../../db/order.repository"; +import { OrderStatus, ORDER_STATUS_TEXT } from "../../types/order.types"; +import type { ClientManager } from "../../websocket/client.manager"; + +export function createOrderRoutes( + getClientManager: () => ClientManager | null, +) { + const app = new Hono(); + + // 获取订单列表 + app.get("/", async (c) => { + const accountId = c.req.query("accountId"); + const status = c.req.query("status"); + const limit = parseInt(c.req.query("limit") || "50"); + const offset = parseInt(c.req.query("offset") || "0"); + + const result = getOrderList({ + accountId: accountId || undefined, + status: status ? parseInt(status) : undefined, + limit, + offset, + }); + + return c.json(result); + }); + + // 获取单个订单 + app.get("/:orderId", async (c) => { + const orderId = c.req.param("orderId"); + const order = getOrder(orderId); + + if (!order) { + return c.json({ error: "订单不存在" }, 404); + } + + return c.json({ order }); + }); + + // 刷新订单详情 + app.post("/:orderId/refresh", async (c) => { + const orderId = c.req.param("orderId"); + const clientManager = getClientManager(); + + if (!clientManager) { + return c.json({ error: "ClientManager 未初始化" }, 500); + } + + const localOrder = getOrder(orderId); + if (!localOrder) { + return c.json({ error: "订单不存在" }, 404); + } + + const client = clientManager.getClient(localOrder.accountId); + if (!client) { + return c.json({ error: "账号未连接" }, 400); + } + + const detail = await fetchAndUpdateOrderDetail(client, orderId); + if (!detail) { + return c.json({ error: "获取订单详情失败" }, 500); + } + + const updatedOrder = getOrder(orderId); + return c.json({ success: true, order: updatedOrder }); + }); + + // 通过账号获取订单详情 + app.post("/fetch", async (c) => { + const body = await c.req.json(); + const { accountId, orderId } = body; + + if (!accountId || !orderId) { + return c.json({ error: "缺少 accountId 或 orderId" }, 400); + } + + const clientManager = getClientManager(); + if (!clientManager) { + return c.json({ error: "ClientManager 未初始化" }, 500); + } + + const client = clientManager.getClient(accountId); + if (!client) { + return c.json({ error: "账号未连接" }, 400); + } + + const detail = await fetchAndUpdateOrderDetail(client, orderId); + if (!detail) { + return c.json({ error: "获取订单详情失败" }, 500); + } + + const order = getOrder(orderId); + return c.json({ success: true, order }); + }); + + // 确认发货 + app.post("/:orderId/ship", async (c) => { + const orderId = c.req.param("orderId"); + const clientManager = getClientManager(); + + if (!clientManager) { + return c.json({ error: "ClientManager 未初始化" }, 500); + } + + const localOrder = getOrder(orderId); + if (!localOrder) { + return c.json({ error: "订单不存在" }, 404); + } + + if (localOrder.status !== OrderStatus.PENDING_SHIPMENT) { + return c.json({ error: "只有待发货状态的订单才能执行发货" }, 400); + } + + const client = clientManager.getClient(localOrder.accountId); + if (!client) { + return c.json({ error: "账号未连接" }, 400); + } + + const result = await client.confirmShipment(orderId); + if (result.success) { + updateOrderStatus( + orderId, + OrderStatus.PENDING_RECEIPT, + ORDER_STATUS_TEXT[OrderStatus.PENDING_RECEIPT], + "ship_time", + ); + const updatedOrder = getOrder(orderId); + return c.json({ success: true, order: updatedOrder }); + } + + return c.json({ success: false, error: result.error }, 500); + }); + + // 免拼发货 + app.post("/:orderId/freeship", async (c) => { + const orderId = c.req.param("orderId"); + const clientManager = getClientManager(); + + if (!clientManager) { + return c.json({ error: "ClientManager 未初始化" }, 500); + } + + const localOrder = getOrder(orderId); + if (!localOrder) { + return c.json({ error: "订单不存在" }, 404); + } + + if (localOrder.status !== OrderStatus.PENDING_SHIPMENT) { + return c.json({ error: "只有待发货状态的订单才能执行发货" }, 400); + } + + if (!localOrder.itemId || !localOrder.buyerUserId) { + return c.json({ error: "订单缺少商品ID或买家ID,请先刷新订单详情" }, 400); + } + + const client = clientManager.getClient(localOrder.accountId); + if (!client) { + return c.json({ error: "账号未连接" }, 400); + } + + const result = await client.freeShipping( + orderId, + localOrder.itemId, + localOrder.buyerUserId, + ); + if (result.success) { + updateOrderStatus( + orderId, + OrderStatus.PENDING_RECEIPT, + ORDER_STATUS_TEXT[OrderStatus.PENDING_RECEIPT], + "ship_time", + ); + const updatedOrder = getOrder(orderId); + return c.json({ success: true, order: updatedOrder }); + } + + return c.json({ success: false, error: result.error }, 500); + }); + + // 删除订单记录 + app.delete("/:orderId", async (c) => { + const orderId = c.req.param("orderId"); + + const localOrder = getOrder(orderId); + if (!localOrder) { + return c.json({ error: "订单不存在" }, 404); + } + + const success = deleteOrder(orderId); + if (success) { + return c.json({ success: true, message: "订单记录已删除" }); + } + + return c.json({ success: false, error: "删除失败" }, 500); + }); + + return app; +} diff --git a/goofish_backend/src/goofish/api/routes/status.ts b/goofish_backend/src/goofish/api/routes/status.ts new file mode 100644 index 0000000..db2bed8 --- /dev/null +++ b/goofish_backend/src/goofish/api/routes/status.ts @@ -0,0 +1,30 @@ +import { Hono } from "hono"; +import { messageStore } from "../stores/message.store"; +import { getAllMessagesCount } from "../../db/conversation.repository"; +import type { ClientManager } from "../../websocket/client.manager"; + +export function createStatusRoutes( + getClientManager: () => ClientManager | null, +) { + const router = new Hono(); + + // 健康检查 + router.get("/health", (c) => { + return c.json({ status: "ok", timestamp: Date.now() }); + }); + + // 获取整体状态 + router.get("/status", (c) => { + const clientManager = getClientManager(); + if (!clientManager) { + return c.json({ error: "ClientManager not initialized" }, 500); + } + return c.json({ + clients: clientManager.getStatus(), + activeCount: clientManager.getActiveCount(), + messageCount: getAllMessagesCount(), + }); + }); + + return router; +} diff --git a/goofish_backend/src/goofish/api/routes/workflow.route.ts b/goofish_backend/src/goofish/api/routes/workflow.route.ts new file mode 100644 index 0000000..c6e9059 --- /dev/null +++ b/goofish_backend/src/goofish/api/routes/workflow.route.ts @@ -0,0 +1,80 @@ +/** + * 发货流程 API 路由 + */ + +import { Hono } from "hono"; + +import { + getWorkflows, + getWorkflowById, + createWorkflow, + updateWorkflow, + deleteWorkflow, +} from "../../db/index"; + +export function createWorkflowRoutes() { + const app = new Hono(); + + // 获取所有流程 + app.get("/", (c) => { + const workflows = getWorkflows(); + return c.json({ workflows }); + }); + + // 获取单个流程 + app.get("/:id", (c) => { + const id = parseInt(c.req.param("id")); + const workflow = getWorkflowById(id); + if (!workflow) { + return c.json({ error: "流程不存在" }, 404); + } + return c.json({ workflow }); + }); + + // 创建流程 + app.post("/", async (c) => { + const body = await c.req.json(); + const { name, description, definition, isDefault } = body; + + if (!name || !definition) { + return c.json({ error: "缺少必要参数" }, 400); + } + + const id = createWorkflow({ name, description, definition, isDefault }); + return c.json({ success: true, id }); + }); + + // 更新流程 + app.put("/:id", async (c) => { + const id = parseInt(c.req.param("id")); + const body = await c.req.json(); + + const success = updateWorkflow(id, body); + if (!success) { + return c.json({ error: "更新失败" }, 400); + } + return c.json({ success: true }); + }); + + // 删除流程 + app.delete("/:id", (c) => { + const id = parseInt(c.req.param("id")); + const success = deleteWorkflow(id); + if (!success) { + return c.json({ error: "删除失败,默认流程不能删除" }, 400); + } + return c.json({ success: true }); + }); + + // 设为默认流程 + app.post("/:id/default", (c) => { + const id = parseInt(c.req.param("id")); + const success = updateWorkflow(id, { isDefault: true }); + if (!success) { + return c.json({ error: "设置失败" }, 400); + } + return c.json({ success: true }); + }); + + return app; +} diff --git a/goofish_backend/src/goofish/api/routes/ws-push.route.ts b/goofish_backend/src/goofish/api/routes/ws-push.route.ts new file mode 100644 index 0000000..f35d6f1 --- /dev/null +++ b/goofish_backend/src/goofish/api/routes/ws-push.route.ts @@ -0,0 +1,224 @@ +/** + * WebSocket 推送路由 + * 替代 SSE,使用 WebSocket 实现实时数据推送 + */ + +import { Hono } from "hono"; +import type { WSContext } from "hono/ws"; + +import { createLogger } from "../../core/logger"; +import { appEvents, Events } from "../../core/event-emitter"; +import { getOrders, getOrderCount } from "../../db/order.repository"; +import { getAllAccounts } from "../../db/account.repository"; +import { getAllConversations } from "../../services/conversation.service"; +import type { ClientManager } from "../../websocket/client.manager"; + +const logger = createLogger("Api:WS"); + +// 存储所有 WebSocket 连接 +const wsClients = new Set<{ + ws: WSContext; + subscriptions: Set; + params: Record; +}>(); + +// 发送数据到订阅了特定事件的客户端 +function broadcast( + event: string, + getData: (params: Record) => unknown, +) { + // @ts-ignore + for (const client of wsClients) { + if (client.subscriptions.has(event)) { + try { + const data = getData(client.params); + client.ws.send(JSON.stringify({ event, data })); + } catch (e) { + logger.debug(`WebSocket 推送失败: ${e}`); + } + } + } +} + +// 初始化事件监听(只需要一次) +let eventsInitialized = false; + +export function initWSEvents(getClientManager: () => ClientManager | null) { + if (eventsInitialized) return; + eventsInitialized = true; + + // 订单更新 + appEvents.on(Events.ORDERS_UPDATED, () => { + broadcast("orders", (params) => { + const orders = getOrders({ + accountId: params.accountId as string | undefined, + status: params.status as number | undefined, + limit: 50, + offset: 0, + }); + const total = getOrderCount({ + accountId: params.accountId as string | undefined, + status: params.status as number | undefined, + }); + return { orders, total }; + }); + }); + + // 账号更新 + appEvents.on(Events.ACCOUNTS_UPDATED, () => { + broadcast("accounts", () => { + const accounts = getAllAccounts(); + const clientManager = getClientManager(); + const clients = clientManager?.getStatus() || []; + return { accounts, clients }; + }); + }); + + // 对话更新 + appEvents.on(Events.CONVERSATIONS_UPDATED, () => { + broadcast("conversations", (params) => { + const limit = (params.limit as number) || 20; + const { conversations, total } = getAllConversations(limit, 0); + return { conversations, total }; + }); + }); + + logger.info("WebSocket 事件监听已初始化"); +} + +export function createWSPushHandler( + getClientManager: () => ClientManager | null, +) { + // 确保事件监听已初始化 + initWSEvents(getClientManager); + + return { + onOpen(_event: Event, ws: WSContext) { + const client = { + ws, + subscriptions: new Set(), + params: {} as Record, + }; + wsClients.add(client); + logger.debug(`WebSocket 连接建立,当前连接数: ${wsClients.size}`); + }, + + onMessage(event: MessageEvent, ws: WSContext) { + try { + const msg = JSON.parse(event.data as string); + // @ts-ignore + const client = [...wsClients].find((c) => c.ws === ws); + if (!client) return; + + // 订阅消息格式: { action: 'subscribe', events: ['orders', 'accounts'], params: { accountId: '...' } } + if (msg.action === "subscribe" && Array.isArray(msg.events)) { + for (const evt of msg.events) { + client.subscriptions.add(evt); + } + if (msg.params) { + Object.assign(client.params, msg.params); + } + + // 立即发送当前数据 + for (const evt of msg.events) { + sendInitialData(ws, evt, client.params, getClientManager); + } + + logger.debug(`客户端订阅: ${msg.events.join(", ")}`); + } + + // 取消订阅: { action: 'unsubscribe', events: ['orders'] } + if (msg.action === "unsubscribe" && Array.isArray(msg.events)) { + for (const evt of msg.events) { + client.subscriptions.delete(evt); + } + } + + // 更新参数: { action: 'updateParams', params: { accountId: '...' } } + if (msg.action === "updateParams" && msg.params) { + Object.assign(client.params, msg.params); + // 重新发送订阅的数据 + for (const evt of client.subscriptions) { + sendInitialData(ws, evt, client.params, getClientManager); + } + } + } catch { + // 忽略解析错误 + } + }, + + onClose() { + // @ts-ignore + for (const client of wsClients) { + if (client.ws.readyState >= 2) { + // CLOSING or CLOSED + wsClients.delete(client); + } + } + logger.debug(`WebSocket 连接关闭,当前连接数: ${wsClients.size}`); + }, + + onError() { + // 清理已关闭的连接 + // @ts-ignore + for (const client of wsClients) { + if (client.ws.readyState >= 2) { + wsClients.delete(client); + } + } + }, + }; +} + +// 发送初始数据 +function sendInitialData( + ws: WSContext, + event: string, + params: Record, + getClientManager: () => ClientManager | null, +) { + try { + let data: unknown; + + switch (event) { + case "orders": { + const orders = getOrders({ + accountId: params.accountId as string | undefined, + status: params.status as number | undefined, + limit: 50, + offset: 0, + }); + const total = getOrderCount({ + accountId: params.accountId as string | undefined, + status: params.status as number | undefined, + }); + data = { orders, total }; + break; + } + case "accounts": { + const accounts = getAllAccounts(); + const clientManager = getClientManager(); + const clients = clientManager?.getStatus() || []; + data = { accounts, clients }; + break; + } + case "conversations": { + const limit = (params.limit as number) || 20; + const { conversations, total } = getAllConversations(limit, 0); + data = { conversations, total }; + break; + } + default: + return; + } + + ws.send(JSON.stringify({ event, data })); + } catch (e) { + logger.debug(`发送初始数据失败: ${e}`); + } +} + +// 获取当前连接数(用于调试) +export function getWSClientCount() { + return wsClients.size; +} diff --git a/goofish_backend/src/goofish/api/server.ts b/goofish_backend/src/goofish/api/server.ts new file mode 100644 index 0000000..774fb5f --- /dev/null +++ b/goofish_backend/src/goofish/api/server.ts @@ -0,0 +1,158 @@ +import { serve } from "@hono/node-server"; +import { createNodeWebSocket } from "@hono/node-ws"; +import { Hono } from "hono"; +import { cors } from "hono/cors"; + +import { createLogger } from "../core/logger"; +import { SERVER_CONFIG, ENV } from "../core/constants"; +import { isAllowedFrontendOrigin, resolveCorsOrigin } from "../core/frontend-origin"; +import { goofishAuthMiddleware, isAuthorizedGoofishRequest, securityMiddleware } from "./middlewares"; +import { + createAccountRoutes, + createGoodsRoutes, + createMessageRoutes, + createStatusRoutes, + createConversationRoutes, + createLogsRoutes, + createAutoReplyRoutes, + createOrderRoutes, + createAutoSellRoutes, + createWorkflowRoutes, + authRoute, +} from "./routes"; +import { createDevMessageRoutes } from "./routes/dev-messages.route"; +import { createWSPushHandler } from "./routes/ws-push.route"; +import type { ClientManager } from "../websocket/client.manager"; + +const logger = createLogger("Goofish:Api:Server"); +const apiLogger = createLogger("Goofish:Api:Request"); + +let clientManager: ClientManager | null = null; + +export function setClientManager(cm: ClientManager) { + clientManager = cm; +} + +function getClientManager() { + return clientManager; +} + +// WebSocket 相关 +let upgradeWebSocket: + | ReturnType["upgradeWebSocket"] + | null = null; +let injectWebSocket: + | ReturnType["injectWebSocket"] + | null = null; + +export function createApp() { + const app = new Hono(); + + // 创建 WebSocket 支持 + const nodeWS = createNodeWebSocket({ app }); + upgradeWebSocket = nodeWS.upgradeWebSocket; + injectWebSocket = nodeWS.injectWebSocket; + + app.use("*", cors({ + origin: ENV.IS_DEV ? "*" : (origin) => resolveCorsOrigin(origin), + allowMethods: ["GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH"], + allowHeaders: ["Content-Type", "Authorization", "X-Requested-With"], + credentials: true, + })); + + app.use("/ws", async (c, next) => { + const origin = c.req.header("Origin"); + if (!ENV.IS_DEV && (!origin || !isAllowedFrontendOrigin(origin) || !isAuthorizedGoofishRequest(c))) { + return c.json({ error: "Forbidden WebSocket request" }, 403); + } + return next(); + }); + + // 安全中间件 - 限制 API 只能从前端请求(排除 WebSocket) + app.use("/api/*", goofishAuthMiddleware); + app.use("/api/*", securityMiddleware); + + // API 日志 - 只记录非 GET 请求,减少日志量 + app.use("/api/*", async (c, next) => { + await next(); + if (c.req.method !== "GET") { + apiLogger.info(`${c.req.method} ${c.req.path}`); + } + }); + + // WebSocket 推送端点 + app.get( + "/ws", + upgradeWebSocket(() => createWSPushHandler(getClientManager)), + ); + + // 挂载路由模块 + const statusRoutes = createStatusRoutes(getClientManager); + app.route("/", statusRoutes); + app.route("/api", statusRoutes); + + app.route("/api/accounts", createAccountRoutes(getClientManager)); + app.route("/api/goods", createGoodsRoutes(getClientManager)); + app.route("/api/messages", createMessageRoutes(getClientManager)); + app.route("/api/conversations", createConversationRoutes()); + app.route("/api/logs", createLogsRoutes()); + app.route("/api/autoreply", createAutoReplyRoutes()); + app.route("/api/orders", createOrderRoutes(getClientManager)); + app.route("/api/autosell", createAutoSellRoutes()); + app.route("/api/workflows", createWorkflowRoutes()); + app.route("/api/auth", authRoute); + + // 开发环境才注册调试路由 + if (ENV.IS_DEV) { + app.route("/api/dev/messages", createDevMessageRoutes()); + logger.info("开发模式:已启用调试路由 /api/dev/messages"); + } + + // 兼容旧的发送消息接口 + app.post("/api/send", async (c) => { + if (!clientManager) { + return c.json({ error: "ClientManager not initialized" }, 500); + } + const body = await c.req.json(); + const { accountId, chatId, toUserId, text } = body; + if (!accountId || !chatId || !toUserId || !text) { + return c.json( + { error: "Missing accountId, chatId, toUserId or text" }, + 400, + ); + } + const client = clientManager.getClient(accountId); + if (!client) { + return c.json({ error: "Account not connected" }, 400); + } + const success = await client.sendMessage(chatId, toUserId, text); + return c.json({ success }); + }); + + // 兼容旧的账号商品接口 + app.get("/api/accounts/:id/goods", async (c) => { + const id = c.req.param("id"); + const page = c.req.query("page") || "1"; + const url = new URL(c.req.url); + url.pathname = `/api/goods/account/${id}`; + return c.redirect(url.pathname + `?page=${page}`); + }); + + return app; +} + +export function startServer(port = SERVER_CONFIG.PORT) { + const app = createApp(); + + const server = serve({ fetch: app.fetch, port }, () => { + logger.info(`Goofish 服务器启动在端口 ${port}`); + }); + + // 注入 WebSocket 支持 + if (injectWebSocket) { + injectWebSocket(server); + logger.info("WebSocket 推送已启用"); + } + + return server; +} diff --git a/goofish_backend/src/goofish/api/stores/conversation.store.ts b/goofish_backend/src/goofish/api/stores/conversation.store.ts new file mode 100644 index 0000000..a3947be --- /dev/null +++ b/goofish_backend/src/goofish/api/stores/conversation.store.ts @@ -0,0 +1,55 @@ +/** + * 对话存储(兼容层) + * 委托给 conversation.service 处理 + */ + +import { + addIncomingMessage, + addOutgoingMessage, + updateUserAvatar as updateAvatar, + getAllConversations, + getConversationDetail, + markAsRead, +} from "../../services/index"; +import type { ChatMessage, Conversation } from "../../types/index"; + +class ConversationStore { + addIncoming(accountId: string, msg: ChatMessage) { + addIncomingMessage(accountId, msg); + } + + addOutgoing( + accountId: string, + chatId: string, + toUserId: string, + content: string, + ) { + addOutgoingMessage(accountId, chatId, toUserId, content); + } + + updateUserAvatar(accountId: string, chatId: string, avatar: string) { + updateAvatar(accountId, chatId, avatar); + } + + getAll( + limit = 20, + offset = 0, + ): { conversations: Conversation[]; total: number } { + return getAllConversations(limit, offset); + } + + get( + accountId: string, + chatId: string, + messageLimit = 50, + beforeId?: number, + ): Conversation | undefined { + return getConversationDetail(accountId, chatId, messageLimit, beforeId); + } + + markRead(accountId: string, chatId: string) { + markAsRead(accountId, chatId); + } +} + +export const conversationStore = new ConversationStore(); diff --git a/goofish_backend/src/goofish/api/stores/message.store.ts b/goofish_backend/src/goofish/api/stores/message.store.ts new file mode 100644 index 0000000..2d52c25 --- /dev/null +++ b/goofish_backend/src/goofish/api/stores/message.store.ts @@ -0,0 +1,37 @@ +/** + * 消息存储(兼容层) + * 委托给 message.service 处理 + */ + +import { + addMessage, + getRecentMessages, + getAllMessages, + getMessageCount, + clearMessages, +} from "../../services/index"; +import type { StoredMessage, ChatMessage } from "../../types/index"; + +class MessageStore { + add(msg: ChatMessage) { + addMessage(msg); + } + + getRecent(limit = 20): StoredMessage[] { + return getRecentMessages(limit); + } + + getAll(): StoredMessage[] { + return getAllMessages(); + } + + count(): number { + return getMessageCount(); + } + + clear() { + clearMessages(); + } +} + +export const messageStore = new MessageStore(); diff --git a/goofish_backend/src/goofish/core/constants.ts b/goofish_backend/src/goofish/core/constants.ts new file mode 100644 index 0000000..65edbc6 --- /dev/null +++ b/goofish_backend/src/goofish/core/constants.ts @@ -0,0 +1,92 @@ +import { GOOFISH_DB_PATH } from "./storage-paths"; + +// WebSocket 配置 +export const WS_CONFIG = { + URL: "wss://wss-goofish.dingtalk.com/", + HEARTBEAT_INTERVAL: 15, // 心跳间隔(秒) + HEARTBEAT_TIMEOUT: 30, // 心跳超时(秒) + TOKEN_REFRESH_INTERVAL: 3600, // Token刷新间隔(秒)- 1小时 + TOKEN_RETRY_INTERVAL: 300, // Token刷新失败重试间隔(秒)- 5分钟 + MAX_RECONNECT_ATTEMPTS: 5, // 最大重连次数 + RECONNECT_DELAY: 5000, // 重连延迟(毫秒) + APP_KEY: "444e9908a51d1cb236a27862abc769c9", + SIGN_APP_KEY: "34839810", +}; + +// API 配置 +export const API_CONFIG = { + BASE_URL: "https://h5api.m.goofish.com/h5", + VERSION: "1.0", +}; + +// API 方法 +export const API_METHODS = { + TOKEN: "mtop.taobao.idlemessage.pc.login.token", + USER_INFO: "mtop.idle.web.user.page.nav", + LOGIN_USER: "mtop.taobao.idlemessage.pc.loginuser.get", + ITEM_LIST: "mtop.idle.web.xyh.item.list", + USER_HEAD: "mtop.idle.web.user.page.head", + HAS_LOGIN: "newlogin/hasLogin.do", + ORDER_DETAIL: "mtop.idle.web.trade.order.detail", + CONFIRM_SHIPMENT: "mtop.taobao.idle.logistic.consign.dummy", + FREE_SHIPPING: "mtop.idle.groupon.activity.seller.freeshipping", +}; + +// Passport API 配置 +export const PASSPORT_CONFIG = { + BASE_URL: "https://passport.goofish.com", +}; + +// 构建完整 API URL +export function buildApiUrl( + method: string, + version = API_CONFIG.VERSION, +): string { + return `${API_CONFIG.BASE_URL}/${method}/${version}/`; +} + +// API 端点(兼容旧代码) +export const API_ENDPOINTS = { + TOKEN: buildApiUrl(API_METHODS.TOKEN), + USER_INFO: buildApiUrl(API_METHODS.USER_INFO), + LOGIN_USER: buildApiUrl(API_METHODS.LOGIN_USER), + ITEM_LIST: buildApiUrl(API_METHODS.ITEM_LIST), + USER_HEAD: buildApiUrl(API_METHODS.USER_HEAD), + ORDER_DETAIL: buildApiUrl(API_METHODS.ORDER_DETAIL), + CONFIRM_SHIPMENT: buildApiUrl(API_METHODS.CONFIRM_SHIPMENT), + FREE_SHIPPING: buildApiUrl(API_METHODS.FREE_SHIPPING), +}; + +// WebSocket 请求头 +export const WS_HEADERS = { + "Accept-Encoding": "gzip, deflate, br, zstd", + "Accept-Language": "zh-CN,zh;q=0.9", + "Cache-Control": "no-cache", + Connection: "Upgrade", + Host: "wss-goofish.dingtalk.com", + Origin: "https://www.goofish.com", + Pragma: "no-cache", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", +}; + +// 日志配置 +export const LOG_CONFIG = { + LEVEL: "INFO" as const, + RETENTION_DAYS: 7, +}; + +// 环境配置 +export const ENV = { + IS_DEV: process.env.NODE_ENV !== "production", +}; + +// API 服务器配置 +export const SERVER_CONFIG = { + PORT: 3001, + STATIC_DIR: "public", +}; + +// 数据库配置 +export const DB_CONFIG = { + PATH: GOOFISH_DB_PATH, +}; diff --git a/goofish_backend/src/goofish/core/cookies.manager.ts b/goofish_backend/src/goofish/core/cookies.manager.ts new file mode 100644 index 0000000..898b765 --- /dev/null +++ b/goofish_backend/src/goofish/core/cookies.manager.ts @@ -0,0 +1,125 @@ +import { getAccount, updateAccountCookies } from "../db/index"; +import { + parseCookies, + mergeCookies, + parseSetCookieHeaders, +} from "../utils/cookies"; +import { createLogger } from "./logger"; + +const logger = createLogger("Core:Cookies"); + +/** + * Cookies 管理器 + * 统一管理 cookies 的读取和写入,确保所有地方使用最新的 cookies + * + * 设计原则: + * 1. 读取:始终从数据库读取,保证获取最新值 + * 2. 写入:增量合并后写入数据库,任何地方都可以更新 + * 3. 不在内存中缓存 cookies,避免状态不一致 + */ +export class CookiesManager { + /** + * 获取账号的最新 cookies 字符串 + */ + static getCookies(accountId: string): string | null { + const account = getAccount(accountId); + return account?.cookies || null; + } + + /** + * 获取账号的最新 cookies 对象 + */ + static getCookiesObject(accountId: string): Record { + const cookiesStr = this.getCookies(accountId); + return cookiesStr ? parseCookies(cookiesStr) : {}; + } + + /** + * 获取指定的 cookie 值 + */ + static getCookie(accountId: string, name: string): string | undefined { + const cookies = this.getCookiesObject(accountId); + return cookies[name]; + } + + /** + * 更新 cookies(增量合并) + * @param accountId 账号ID + * @param newCookies 新的 cookies(可以是字符串或对象) + * @returns 合并后的完整 cookies 字符串,如果没有实际更新则返回 null + */ + static updateCookies( + accountId: string, + newCookies: string | Record, + ): string | null { + const currentCookies = this.getCookies(accountId); + if (!currentCookies) { + logger.warn(`[${accountId}] 账号不存在,无法更新 cookies`); + return null; + } + + const currentCookiesObj = parseCookies(currentCookies); + const newCookiesObj = + typeof newCookies === "string" ? parseCookies(newCookies) : newCookies; + + // 检查哪些字段实际发生了变化 + const changedFields: string[] = []; + for (const [key, value] of Object.entries(newCookiesObj)) { + if (currentCookiesObj[key] !== value) { + changedFields.push(key); + } + } + + // 如果没有实际变化,不更新不输出日志 + if (changedFields.length === 0) { + return null; + } + + const mergedCookies = mergeCookies(currentCookies, newCookiesObj); + + if (updateAccountCookies(accountId, mergedCookies)) { + logger.info( + `[${accountId}] Cookies 已更新 | 变更字段: ${changedFields.join(", ")}`, + ); + return mergedCookies; + } + + return null; + } + + /** + * 处理 HTTP 响应中的 Set-Cookie,自动更新到数据库 + * @param accountId 账号ID + * @param response HTTP 响应对象 + * @returns 是否有更新 + */ + static handleResponseCookies(accountId: string, response: Response): boolean { + const setCookieHeaders = response.headers.getSetCookie?.() || []; + if (setCookieHeaders.length === 0) { + return false; + } + + const newCookies = parseSetCookieHeaders(setCookieHeaders); + if (Object.keys(newCookies).length === 0) { + return false; + } + + const result = this.updateCookies(accountId, newCookies); + return result !== null; + } + + /** + * 获取用于 API 签名的 h5 token + */ + static getH5Token(accountId: string): string { + const h5tk = this.getCookie(accountId, "_m_h5_tk"); + return h5tk?.split("_")[0] || ""; + } + + /** + * 获取用户 ID (unb) + */ + static getUserId(accountId: string): string | undefined { + return this.getCookie(accountId, "unb"); + } +} diff --git a/goofish_backend/src/goofish/core/event-emitter.ts b/goofish_backend/src/goofish/core/event-emitter.ts new file mode 100644 index 0000000..220a4e3 --- /dev/null +++ b/goofish_backend/src/goofish/core/event-emitter.ts @@ -0,0 +1,62 @@ +/** + * 全局事件发射器 + * 用于数据变化时通知 SSE 推送 + * 使用防抖机制避免频繁触发 + */ + +import { EventEmitter } from "events"; + +export const appEvents = new EventEmitter(); + +// 增加最大监听器数量(SSE 连接可能较多) +appEvents.setMaxListeners(50); + +// 事件类型 +export const Events = { + ORDERS_UPDATED: "orders:updated", + ACCOUNTS_UPDATED: "accounts:updated", + CONVERSATIONS_UPDATED: "conversations:updated", +} as const; + +// 防抖定时器 +const debounceTimers: Record = { + orders: null, + accounts: null, + conversations: null, +}; + +// 防抖延迟(毫秒) +const DEBOUNCE_DELAY = 100; + +// 触发订单更新事件(防抖) +export function emitOrdersUpdated() { + if (debounceTimers.orders) { + clearTimeout(debounceTimers.orders); + } + debounceTimers.orders = setTimeout(() => { + appEvents.emit(Events.ORDERS_UPDATED); + debounceTimers.orders = null; + }, DEBOUNCE_DELAY); +} + +// 触发账号更新事件(防抖) +export function emitAccountsUpdated() { + if (debounceTimers.accounts) { + clearTimeout(debounceTimers.accounts); + } + debounceTimers.accounts = setTimeout(() => { + appEvents.emit(Events.ACCOUNTS_UPDATED); + debounceTimers.accounts = null; + }, DEBOUNCE_DELAY); +} + +// 触发对话更新事件(防抖) +export function emitConversationsUpdated() { + if (debounceTimers.conversations) { + clearTimeout(debounceTimers.conversations); + } + debounceTimers.conversations = setTimeout(() => { + appEvents.emit(Events.CONVERSATIONS_UPDATED); + debounceTimers.conversations = null; + }, DEBOUNCE_DELAY); +} diff --git a/goofish_backend/src/goofish/core/frontend-origin.ts b/goofish_backend/src/goofish/core/frontend-origin.ts new file mode 100644 index 0000000..6f6d7d9 --- /dev/null +++ b/goofish_backend/src/goofish/core/frontend-origin.ts @@ -0,0 +1,23 @@ +const configuredOrigins = (process.env.GOOFISH_ALLOWED_ORIGINS || '') + .split(',') + .map((origin) => origin.trim().replace(/\/$/, '')) + .filter(Boolean) + +const allowVercelPreviews = process.env.GOOFISH_ALLOW_VERCEL_PREVIEWS === 'true' + +export function isAllowedFrontendOrigin(origin: string): boolean { + try { + const url = new URL(origin) + const normalizedOrigin = url.origin.replace(/\/$/, '') + + if (url.hostname === 'localhost' || url.hostname === '127.0.0.1') return true + if (configuredOrigins.includes(normalizedOrigin)) return true + return allowVercelPreviews && url.protocol === 'https:' && url.hostname.endsWith('.vercel.app') + } catch { + return false + } +} + +export function resolveCorsOrigin(origin: string): string | undefined { + return isAllowedFrontendOrigin(origin) ? origin : undefined +} diff --git a/goofish_backend/src/goofish/core/logger.ts b/goofish_backend/src/goofish/core/logger.ts new file mode 100644 index 0000000..b1d99c5 --- /dev/null +++ b/goofish_backend/src/goofish/core/logger.ts @@ -0,0 +1,149 @@ +import fs from "fs"; +import path from "path"; +import { GOOFISH_LOG_DIR } from "./storage-paths"; + +const logsDir = GOOFISH_LOG_DIR; + +export type LogLevel = "DEBUG" | "INFO" | "WARN" | "ERROR"; + +const levelPriority: Record = { + DEBUG: 0, + INFO: 1, + WARN: 2, + ERROR: 3, +}; + +let currentLevel: LogLevel = "INFO"; +let currentLogFile: string = ""; + +export function setLogLevel(level: LogLevel) { + currentLevel = level; +} + +function formatTime(): string { + const now = new Date(); + const y = now.getFullYear(); + const m = String(now.getMonth() + 1).padStart(2, "0"); + const d = String(now.getDate()).padStart(2, "0"); + const h = String(now.getHours()).padStart(2, "0"); + const min = String(now.getMinutes()).padStart(2, "0"); + const s = String(now.getSeconds()).padStart(2, "0"); + return `${y}-${m}-${d} ${h}:${min}:${s}`; +} + +function getDateStr(): string { + const now = new Date(); + const y = now.getFullYear(); + const m = String(now.getMonth() + 1).padStart(2, "0"); + const d = String(now.getDate()).padStart(2, "0"); + return `${y}-${m}-${d}`; +} + +function getTimestampStr(): string { + const now = new Date(); + const y = now.getFullYear(); + const m = String(now.getMonth() + 1).padStart(2, "0"); + const d = String(now.getDate()).padStart(2, "0"); + const h = String(now.getHours()).padStart(2, "0"); + const min = String(now.getMinutes()).padStart(2, "0"); + const s = String(now.getSeconds()).padStart(2, "0"); + return `${y}${m}${d}_${h}${min}${s}`; +} + +// 初始化日志文件(每次启动创建新文件) +function initLogFile(): string { + const dateStr = getDateStr(); + const dayDir = path.join(logsDir, dateStr); + + // 确保日期目录存在 + if (!fs.existsSync(dayDir)) { + fs.mkdirSync(dayDir, { recursive: true }); + } + + // 以启动时间戳命名日志文件 + const timestamp = getTimestampStr(); + return path.join(dayDir, `${timestamp}.log`); +} + +// 日志队列,确保顺序 +const logQueue: string[] = []; +let isWriting = false; + +function flushLogs() { + if (isWriting || logQueue.length === 0) return; + isWriting = true; + + const content = logQueue.splice(0, logQueue.length).join("\n") + "\n"; + + fs.appendFile(currentLogFile, content, "utf-8", () => { + isWriting = false; + if (logQueue.length > 0) flushLogs(); + }); +} + +export function log(level: LogLevel, module: string, message: string) { + if (levelPriority[level] < levelPriority[currentLevel]) return; + + const time = formatTime(); + const logLine = `${time} | ${level.padEnd(5)} | ${module.padEnd(12)} | ${message}`; + + const colors: Record = { + DEBUG: "\x1b[90m", + INFO: "\x1b[36m", + WARN: "\x1b[33m", + ERROR: "\x1b[31m", + }; + process.stdout.write(`${colors[level]}${logLine}\x1b[0m\n`); + + logQueue.push(logLine); + flushLogs(); +} + +export function cleanOldLogs(retentionDays = 7) { + if (!fs.existsSync(logsDir)) return; + + const now = Date.now(); + const maxAge = retentionDays * 24 * 60 * 60 * 1000; + + // 遍历日期文件夹 + const entries = fs.readdirSync(logsDir, { withFileTypes: true }); + + for (const entry of entries) { + const entryPath = path.join(logsDir, entry.name); + + if (entry.isDirectory()) { + // 检查文件夹日期 + const stat = fs.statSync(entryPath); + if (now - stat.mtimeMs > maxAge) { + fs.rmSync(entryPath, { recursive: true, force: true }); + log("INFO", "Logger", `已删除过期日志目录: ${entry.name}`); + } + } else if (entry.name.endsWith(".log")) { + // 兼容旧的日志文件(直接在logs目录下的) + const stat = fs.statSync(entryPath); + if (now - stat.mtimeMs > maxAge) { + fs.unlinkSync(entryPath); + log("INFO", "Logger", `已删除过期日志: ${entry.name}`); + } + } + } +} + +export interface Logger { + debug: (msg: string) => void; + info: (msg: string) => void; + warn: (msg: string) => void; + error: (msg: string) => void; +} + +export function createLogger(module: string): Logger { + return { + debug: (msg: string) => log("DEBUG", module, msg), + info: (msg: string) => log("INFO", module, msg), + warn: (msg: string) => log("WARN", module, msg), + error: (msg: string) => log("ERROR", module, msg), + }; +} + +// 初始化 +currentLogFile = initLogFile(); diff --git a/goofish_backend/src/goofish/core/storage-paths.ts b/goofish_backend/src/goofish/core/storage-paths.ts new file mode 100644 index 0000000..5224a1e --- /dev/null +++ b/goofish_backend/src/goofish/core/storage-paths.ts @@ -0,0 +1,17 @@ +import path from "path"; + +function resolvePath(value: string): string { + return path.isAbsolute(value) ? value : path.join(process.cwd(), value); +} + +export const GOOFISH_DATA_DIR = resolvePath( + process.env.GOOFISH_DATA_DIR || "data", +); + +export const GOOFISH_LOG_DIR = resolvePath( + process.env.GOOFISH_LOG_DIR || "logs", +); + +export const GOOFISH_DB_PATH = resolvePath( + process.env.GOOFISH_DB_PATH || path.join(GOOFISH_DATA_DIR, "goofishcbot.db"), +); diff --git a/goofish_backend/src/goofish/db/account.repository.ts b/goofish_backend/src/goofish/db/account.repository.ts new file mode 100644 index 0000000..db3d366 --- /dev/null +++ b/goofish_backend/src/goofish/db/account.repository.ts @@ -0,0 +1,209 @@ +/** + * 账号数据仓库 + */ + +import { db } from "./connection"; +import { createLogger } from "../core/logger"; +import { nowLocalString } from "../utils/date"; +import { emitAccountsUpdated } from "../core/event-emitter"; +import type { + Account, + AccountStatus, + UpsertAccountParams, + UpdateAccountStatusParams, +} from "../types/index"; + +const logger = createLogger("Db:Account"); + +// 获取所有启用的账号 +export function getEnabledAccounts(): Account[] { + const stmt = db.prepare(` + SELECT id, cookies, user_id as userId, nickname, avatar, enabled, remark, + created_at as createdAt, updated_at as updatedAt + FROM accounts WHERE enabled = 1 + `); + return stmt.all() as Account[]; +} + +// 获取所有账号 +export function getAllAccounts(): Account[] { + const stmt = db.prepare(` + SELECT id, cookies, user_id as userId, nickname, avatar, enabled, remark, + created_at as createdAt, updated_at as updatedAt + FROM accounts + `); + return stmt.all() as Account[]; +} + +// 获取单个账号 +export function getAccount(id: string): Account | null { + const stmt = db.prepare(` + SELECT id, cookies, user_id as userId, nickname, avatar, enabled, remark, + created_at as createdAt, updated_at as updatedAt + FROM accounts WHERE id = ? + `); + return stmt.get(id) as Account | null; +} + +// 添加或更新账号 +export function upsertAccount(account: UpsertAccountParams): boolean { + try { + const now = nowLocalString(); + const stmt = db.prepare(` + INSERT INTO accounts (id, cookies, user_id, nickname, avatar, enabled, remark, updated_at) + VALUES (?, ?, ?, ?, ?, ?, ?, ?) + ON CONFLICT(id) DO UPDATE SET + cookies = excluded.cookies, + user_id = COALESCE(excluded.user_id, user_id), + nickname = COALESCE(excluded.nickname, nickname), + avatar = COALESCE(excluded.avatar, avatar), + enabled = COALESCE(excluded.enabled, enabled), + remark = COALESCE(excluded.remark, remark), + updated_at = excluded.updated_at + `); + stmt.run( + account.id, + account.cookies, + account.userId || null, + account.nickname || null, + account.avatar || null, + account.enabled !== false ? 1 : 0, + account.remark || "", + now, + ); + logger.info(`账号已保存: ${account.id}`); + emitAccountsUpdated(); + return true; + } catch (e) { + logger.error(`保存账号失败: ${e}`); + return false; + } +} + +// 更新账号用户信息 +export function updateAccountUserInfo( + id: string, + nickname: string, + avatar: string, +): boolean { + try { + const now = nowLocalString(); + const stmt = db.prepare(` + UPDATE accounts SET nickname = ?, avatar = ?, updated_at = ? WHERE id = ? + `); + stmt.run(nickname, avatar, now, id); + logger.info(`账号用户信息已更新: ${id} -> ${nickname}`); + emitAccountsUpdated(); + return true; + } catch (e) { + logger.error(`更新账号用户信息失败: ${e}`); + return false; + } +} + +// 更新账号 cookies +export function updateAccountCookies(id: string, cookies: string): boolean { + try { + const now = nowLocalString(); + const stmt = db.prepare(` + UPDATE accounts SET cookies = ?, updated_at = ? WHERE id = ? + `); + stmt.run(cookies, now, id); + logger.info(`账号 cookies 已更新: ${id}`); + emitAccountsUpdated(); + return true; + } catch (e) { + logger.error(`更新账号 cookies 失败: ${e}`); + return false; + } +} + +// 更新账号启用状态 +export function updateAccountEnabled(id: string, enabled: boolean): boolean { + try { + const now = nowLocalString(); + const stmt = db.prepare(` + UPDATE accounts SET enabled = ?, updated_at = ? WHERE id = ? + `); + stmt.run(enabled ? 1 : 0, now, id); + emitAccountsUpdated(); + return true; + } catch (e) { + logger.error(`更新账号状态失败: ${e}`); + return false; + } +} + +// 删除账号 +export function deleteAccount(id: string): boolean { + try { + const stmt = db.prepare("DELETE FROM accounts WHERE id = ?"); + stmt.run(id); + logger.info(`账号已删除: ${id}`); + emitAccountsUpdated(); + return true; + } catch (e) { + logger.error(`删除账号失败: ${e}`); + return false; + } +} + +// 更新账号连接状态(只在连接状态变化时触发事件) +export function updateAccountStatus( + status: UpdateAccountStatusParams, +): boolean { + try { + const now = nowLocalString(); + + // 检查连接状态是否变化 + const shouldEmit = status.connected !== undefined; + let statusChanged = false; + + if (shouldEmit) { + const current = getAccountStatus(status.accountId); + statusChanged = !current || current.connected !== status.connected; + } + + const stmt = db.prepare(` + INSERT INTO account_status (account_id, connected, last_heartbeat, last_token_refresh, error_message, updated_at) + VALUES (?, ?, ?, ?, ?, ?) + ON CONFLICT(account_id) DO UPDATE SET + connected = COALESCE(excluded.connected, connected), + last_heartbeat = COALESCE(excluded.last_heartbeat, last_heartbeat), + last_token_refresh = COALESCE(excluded.last_token_refresh, last_token_refresh), + error_message = excluded.error_message, + updated_at = excluded.updated_at + `); + stmt.run( + status.accountId, + status.connected !== undefined ? (status.connected ? 1 : 0) : null, + status.lastHeartbeat || null, + status.lastTokenRefresh || null, + status.errorMessage ?? null, + now, + ); + + // 只在连接状态变化时触发事件 + if (statusChanged) { + emitAccountsUpdated(); + } + return true; + } catch (e) { + logger.error(`更新账号状态失败: ${e}`); + return false; + } +} + +// 获取账号状态 +export function getAccountStatus(accountId: string): AccountStatus | null { + const stmt = db.prepare(` + SELECT account_id as accountId, connected, last_heartbeat as lastHeartbeat, + last_token_refresh as lastTokenRefresh, error_message as errorMessage + FROM account_status WHERE account_id = ? + `); + const result = stmt.get(accountId) as any; + if (result) { + result.connected = !!result.connected; + } + return result; +} diff --git a/goofish_backend/src/goofish/db/autoreply.repository.ts b/goofish_backend/src/goofish/db/autoreply.repository.ts new file mode 100644 index 0000000..cf0bdb1 --- /dev/null +++ b/goofish_backend/src/goofish/db/autoreply.repository.ts @@ -0,0 +1,112 @@ +/** + * 自动回复规则数据仓库 + */ + +import { db } from "./connection"; +import type { + DbAutoReplyRule, + CreateAutoReplyRuleParams, + UpdateAutoReplyRuleParams, +} from "../types/index"; + +// 获取所有规则 +export function getAutoReplyRules(): DbAutoReplyRule[] { + const stmt = db.prepare( + "SELECT * FROM autoreply_rules ORDER BY priority DESC, id ASC", + ); + return stmt.all() as DbAutoReplyRule[]; +} + +// 获取启用的规则 +export function getEnabledAutoReplyRules( + accountId?: string, +): DbAutoReplyRule[] { + if (accountId) { + const stmt = db.prepare(` + SELECT * FROM autoreply_rules + WHERE enabled = 1 AND (account_id IS NULL OR account_id = ?) + ORDER BY priority DESC, id ASC + `); + return stmt.all(accountId) as DbAutoReplyRule[]; + } + const stmt = db.prepare(` + SELECT * FROM autoreply_rules + WHERE enabled = 1 + ORDER BY priority DESC, id ASC + `); + return stmt.all() as DbAutoReplyRule[]; +} + +// 获取单个规则 +export function getAutoReplyRule(id: number): DbAutoReplyRule | undefined { + const stmt = db.prepare("SELECT * FROM autoreply_rules WHERE id = ?"); + return stmt.get(id) as DbAutoReplyRule | undefined; +} + +// 创建规则 +export function createAutoReplyRule(rule: CreateAutoReplyRuleParams): number { + const stmt = db.prepare(` + INSERT INTO autoreply_rules (name, enabled, priority, match_type, match_pattern, reply_content, account_id, exclude_match) + VALUES (?, ?, ?, ?, ?, ?, ?, ?) + `); + const result = stmt.run( + rule.name, + rule.enabled !== false ? 1 : 0, + rule.priority || 0, + rule.matchType, + rule.matchPattern, + rule.replyContent, + rule.accountId || null, + rule.excludeMatch ? 1 : 0, + ); + return result.lastInsertRowid as number; +} + +// 更新规则 +export function updateAutoReplyRule( + id: number, + rule: UpdateAutoReplyRuleParams, +): boolean { + const existing = getAutoReplyRule(id); + if (!existing) return false; + + const stmt = db.prepare(` + UPDATE autoreply_rules SET + name = ?, enabled = ?, priority = ?, match_type = ?, + match_pattern = ?, reply_content = ?, account_id = ?, exclude_match = ?, + updated_at = CURRENT_TIMESTAMP + WHERE id = ? + `); + stmt.run( + rule.name ?? existing.name, + rule.enabled !== undefined ? (rule.enabled ? 1 : 0) : existing.enabled, + rule.priority ?? existing.priority, + rule.matchType ?? existing.match_type, + rule.matchPattern ?? existing.match_pattern, + rule.replyContent ?? existing.reply_content, + rule.accountId !== undefined ? rule.accountId : existing.account_id, + rule.excludeMatch !== undefined + ? rule.excludeMatch + ? 1 + : 0 + : existing.exclude_match || 0, + id, + ); + return true; +} + +// 删除规则 +export function deleteAutoReplyRule(id: number): boolean { + const stmt = db.prepare("DELETE FROM autoreply_rules WHERE id = ?"); + const result = stmt.run(id); + return result.changes > 0; +} + +// 切换规则启用状态 +export function toggleAutoReplyRule(id: number): boolean { + const stmt = db.prepare( + "UPDATE autoreply_rules SET enabled = 1 - enabled, updated_at = CURRENT_TIMESTAMP WHERE id = ?", + ); + const result = stmt.run(id); + return result.changes > 0; +} diff --git a/goofish_backend/src/goofish/db/autosell.repository.ts b/goofish_backend/src/goofish/db/autosell.repository.ts new file mode 100644 index 0000000..d6882c7 --- /dev/null +++ b/goofish_backend/src/goofish/db/autosell.repository.ts @@ -0,0 +1,337 @@ +/** + * 自动发货数据仓库 + */ + +import { db } from "./connection"; +import type { + DbAutoSellRule, + DbStockItem, + DbDeliveryLog, + CreateAutoSellRuleParams, + UpdateAutoSellRuleParams, + AutoSellRule, + StockItem, + DeliveryLog, +} from "../types/index"; + +// ========== 规则管理 ========== + +// 转换数据库规则到业务对象 +function toRule(row: any): AutoSellRule { + return { + id: row.id, + name: row.name, + enabled: row.enabled === 1, + itemId: row.item_id, + accountId: row.account_id, + deliveryType: row.delivery_type, + deliveryContent: row.delivery_content, + apiConfig: row.api_config ? JSON.parse(row.api_config) : null, + triggerOn: row.trigger_on, + workflowId: row.workflow_id || null, + createdAt: row.created_at, + updatedAt: row.updated_at, + }; +} + +// 获取所有规则 +export function getAutoSellRules(): AutoSellRule[] { + const stmt = db.prepare("SELECT * FROM autosell_rules ORDER BY id DESC"); + const rows = stmt.all() as DbAutoSellRule[]; + return rows.map(toRule); +} + +// 获取启用的规则 +export function getEnabledAutoSellRules( + accountId?: string, + itemId?: string, +): AutoSellRule[] { + let sql = "SELECT * FROM autosell_rules WHERE enabled = 1"; + const params: any[] = []; + + if (accountId) { + sql += " AND (account_id IS NULL OR account_id = ?)"; + params.push(accountId); + } + if (itemId) { + sql += " AND (item_id IS NULL OR item_id = ?)"; + params.push(itemId); + } + + sql += " ORDER BY id ASC"; + const stmt = db.prepare(sql); + const rows = stmt.all(...params) as DbAutoSellRule[]; + return rows.map(toRule); +} + +// 获取单个规则 +export function getAutoSellRule(id: number): AutoSellRule | undefined { + const stmt = db.prepare("SELECT * FROM autosell_rules WHERE id = ?"); + const row = stmt.get(id) as DbAutoSellRule | undefined; + return row ? toRule(row) : undefined; +} + +// 创建规则 +export function createAutoSellRule(rule: CreateAutoSellRuleParams): number { + const stmt = db.prepare(` + INSERT INTO autosell_rules (name, enabled, item_id, account_id, delivery_type, delivery_content, api_config, trigger_on, workflow_id) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) + `); + const result = stmt.run( + rule.name, + rule.enabled !== false ? 1 : 0, + rule.itemId || null, + rule.accountId || null, + rule.deliveryType, + rule.deliveryContent || null, + rule.apiConfig ? JSON.stringify(rule.apiConfig) : null, + rule.triggerOn || "paid", + rule.workflowId || null, + ); + return result.lastInsertRowid as number; +} + +// 更新规则 +export function updateAutoSellRule( + id: number, + rule: UpdateAutoSellRuleParams, +): boolean { + const existing = getAutoSellRule(id); + if (!existing) return false; + + const stmt = db.prepare(` + UPDATE autosell_rules SET + name = ?, enabled = ?, item_id = ?, account_id = ?, + delivery_type = ?, delivery_content = ?, api_config = ?, trigger_on = ?, workflow_id = ?, + updated_at = CURRENT_TIMESTAMP + WHERE id = ? + `); + stmt.run( + rule.name ?? existing.name, + rule.enabled !== undefined + ? rule.enabled + ? 1 + : 0 + : existing.enabled + ? 1 + : 0, + rule.itemId !== undefined ? rule.itemId : existing.itemId, + rule.accountId !== undefined ? rule.accountId : existing.accountId, + rule.deliveryType ?? existing.deliveryType, + rule.deliveryContent !== undefined + ? rule.deliveryContent + : existing.deliveryContent, + rule.apiConfig !== undefined + ? rule.apiConfig + ? JSON.stringify(rule.apiConfig) + : null + : existing.apiConfig + ? JSON.stringify(existing.apiConfig) + : null, + rule.triggerOn ?? existing.triggerOn, + rule.workflowId !== undefined ? rule.workflowId : existing.workflowId, + id, + ); + return true; +} + +// 删除规则 +export function deleteAutoSellRule(id: number): boolean { + const stmt = db.prepare("DELETE FROM autosell_rules WHERE id = ?"); + const result = stmt.run(id); + return result.changes > 0; +} + +// 切换规则启用状态 +export function toggleAutoSellRule(id: number): boolean { + const stmt = db.prepare( + "UPDATE autosell_rules SET enabled = 1 - enabled, updated_at = CURRENT_TIMESTAMP WHERE id = ?", + ); + const result = stmt.run(id); + return result.changes > 0; +} + +// ========== 库存管理 ========== + +// 转换库存项 +function toStockItem(row: DbStockItem): StockItem { + return { + id: row.id, + ruleId: row.rule_id, + content: row.content, + used: row.used === 1, + usedOrderId: row.used_order_id, + createdAt: row.created_at, + usedAt: row.used_at, + }; +} + +// 获取规则的库存 +export function getStockItems( + ruleId: number, + includeUsed = false, +): StockItem[] { + const sql = includeUsed + ? "SELECT * FROM autosell_stock WHERE rule_id = ? ORDER BY id ASC" + : "SELECT * FROM autosell_stock WHERE rule_id = ? AND used = 0 ORDER BY id ASC"; + const stmt = db.prepare(sql); + const rows = stmt.all(ruleId) as DbStockItem[]; + return rows.map(toStockItem); +} + +// 获取库存统计 +export function getStockStats(ruleId: number): { + total: number; + used: number; + available: number; +} { + const stmt = db.prepare(` + SELECT + COUNT(*) as total, + SUM(CASE WHEN used = 1 THEN 1 ELSE 0 END) as used + FROM autosell_stock WHERE rule_id = ? + `); + const row = stmt.get(ruleId) as { total: number; used: number }; + return { + total: row.total, + used: row.used || 0, + available: row.total - (row.used || 0), + }; +} + +// 添加库存 +export function addStockItems(ruleId: number, contents: string[]): number { + const stmt = db.prepare( + "INSERT INTO autosell_stock (rule_id, content) VALUES (?, ?)", + ); + const insertMany = db.transaction((items: string[]) => { + for (const content of items) { + stmt.run(ruleId, content); + } + return items.length; + }); + return insertMany(contents); +} + +// 取出一个库存(标记为已使用) +export function consumeStock( + ruleId: number, + orderId: string, +): StockItem | null { + const selectStmt = db.prepare( + "SELECT * FROM autosell_stock WHERE rule_id = ? AND used = 0 ORDER BY id ASC LIMIT 1", + ); + const row = selectStmt.get(ruleId) as DbStockItem | undefined; + if (!row) return null; + + const updateStmt = db.prepare( + "UPDATE autosell_stock SET used = 1, used_order_id = ?, used_at = CURRENT_TIMESTAMP WHERE id = ?", + ); + updateStmt.run(orderId, row.id); + + return toStockItem({ ...row, used: 1, used_order_id: orderId }); +} + +// 清空规则库存 +export function clearStock(ruleId: number, onlyUsed = false): number { + const sql = onlyUsed + ? "DELETE FROM autosell_stock WHERE rule_id = ? AND used = 1" + : "DELETE FROM autosell_stock WHERE rule_id = ?"; + const stmt = db.prepare(sql); + const result = stmt.run(ruleId); + return result.changes; +} + +// ========== 发货记录 ========== + +// 转换发货记录 +function toDeliveryLog(row: DbDeliveryLog): DeliveryLog { + return { + id: row.id, + ruleId: row.rule_id, + orderId: row.order_id, + accountId: row.account_id, + deliveryType: row.delivery_type, + content: row.content, + status: row.status as "success" | "failed", + errorMessage: row.error_message, + createdAt: row.created_at, + }; +} + +// 添加发货记录 +export function addDeliveryLog(log: { + ruleId?: number | null; + orderId: string; + accountId: string; + deliveryType: string; + content: string; + status: "success" | "failed"; + errorMessage?: string | null; +}): number { + const stmt = db.prepare(` + INSERT INTO autosell_logs (rule_id, order_id, account_id, delivery_type, content, status, error_message) + VALUES (?, ?, ?, ?, ?, ?, ?) + `); + const result = stmt.run( + log.ruleId || null, + log.orderId, + log.accountId, + log.deliveryType, + log.content, + log.status, + log.errorMessage || null, + ); + return result.lastInsertRowid as number; +} + +// 获取发货记录 +export function getDeliveryLogs(params: { + ruleId?: number; + orderId?: string; + accountId?: string; + limit?: number; + offset?: number; +}): { logs: DeliveryLog[]; total: number } { + let whereClauses: string[] = []; + const queryParams: any[] = []; + + if (params.ruleId) { + whereClauses.push("rule_id = ?"); + queryParams.push(params.ruleId); + } + if (params.orderId) { + whereClauses.push("order_id = ?"); + queryParams.push(params.orderId); + } + if (params.accountId) { + whereClauses.push("account_id = ?"); + queryParams.push(params.accountId); + } + + const whereClause = + whereClauses.length > 0 ? `WHERE ${whereClauses.join(" AND ")}` : ""; + + const countStmt = db.prepare( + `SELECT COUNT(*) as total FROM autosell_logs ${whereClause}`, + ); + const { total } = countStmt.get(...queryParams) as { total: number }; + + const limit = params.limit || 50; + const offset = params.offset || 0; + const dataStmt = db.prepare( + `SELECT * FROM autosell_logs ${whereClause} ORDER BY id DESC LIMIT ? OFFSET ?`, + ); + const rows = dataStmt.all(...queryParams, limit, offset) as DbDeliveryLog[]; + + return { logs: rows.map(toDeliveryLog), total }; +} + +// 检查订单是否已发货 +export function hasDelivered(orderId: string): boolean { + const stmt = db.prepare( + "SELECT id FROM autosell_logs WHERE order_id = ? AND status = ? LIMIT 1", + ); + const row = stmt.get(orderId, "success"); + return !!row; +} diff --git a/goofish_backend/src/goofish/db/connection.ts b/goofish_backend/src/goofish/db/connection.ts new file mode 100644 index 0000000..2247749 --- /dev/null +++ b/goofish_backend/src/goofish/db/connection.ts @@ -0,0 +1,39 @@ +/** + * 数据库连接管理 + */ + +import Database from "better-sqlite3"; +import path from "path"; +import fs from "fs"; + +import { DB_CONFIG } from "../core/constants"; +import { createLogger } from "../core/logger"; + +const logger = createLogger("Db"); + +// 确保数据目录存在 +const dbPath = path.isAbsolute(DB_CONFIG.PATH) + ? DB_CONFIG.PATH + : path.join(process.cwd(), DB_CONFIG.PATH); +const dbDir = path.dirname(dbPath); +if (!fs.existsSync(dbDir)) { + fs.mkdirSync(dbDir, { recursive: true }); +} + +export const db = new Database(dbPath); + +// Space 的 /data 可能是网络挂载;DELETE 模式比 WAL 更适合单实例网络卷。 +const journalMode = process.env.GOOFISH_SQLITE_JOURNAL_MODE + || (process.env.SPACE_ID ? "DELETE" : "WAL"); +db.pragma(`journal_mode = ${journalMode}`); +db.pragma("busy_timeout = 5000"); +db.pragma("foreign_keys = ON"); + +export function closeDatabase() { + db.close(); + logger.info("数据库连接已关闭"); +} + +export function getDbPath(): string { + return dbPath; +} diff --git a/goofish_backend/src/goofish/db/conversation.repository.ts b/goofish_backend/src/goofish/db/conversation.repository.ts new file mode 100644 index 0000000..9cdfced --- /dev/null +++ b/goofish_backend/src/goofish/db/conversation.repository.ts @@ -0,0 +1,172 @@ +/** + * 对话数据仓库 + */ + +import { db } from "./connection"; +import { emitConversationsUpdated } from "../core/event-emitter"; +import type { + DbConversation, + DbConversationMessage, + UpsertConversationParams, + AddConversationMessageParams, +} from "../types/index"; + +// 获取对话列表(分页) +export function getConversations(limit = 20, offset = 0): DbConversation[] { + const stmt = db.prepare(` + SELECT account_id, chat_id, user_id, user_name, user_avatar, last_message, last_time, unread + FROM conversations ORDER BY last_time DESC LIMIT ? OFFSET ? + `); + return stmt.all(limit, offset) as DbConversation[]; +} + +// 获取对话总数 +export function getConversationCount(): number { + const stmt = db.prepare("SELECT COUNT(*) as count FROM conversations"); + return (stmt.get() as { count: number }).count; +} + +// 获取单个对话 +export function getConversation( + accountId: string, + chatId: string, +): DbConversation | undefined { + const stmt = db.prepare( + "SELECT * FROM conversations WHERE account_id = ? AND chat_id = ?", + ); + return stmt.get(accountId, chatId) as DbConversation | undefined; +} + +// 创建或更新对话(不触发事件,由调用方统一触发) +export function upsertConversation( + conv: UpsertConversationParams, + emitEvent = true, +) { + const existing = getConversation(conv.accountId, conv.chatId); + if (existing) { + const stmt = db.prepare(` + UPDATE conversations SET + user_name = ?, user_avatar = COALESCE(?, user_avatar), + last_message = ?, last_time = ?, unread = unread + ?, + updated_at = CURRENT_TIMESTAMP + WHERE account_id = ? AND chat_id = ? + `); + stmt.run( + conv.userName, + conv.userAvatar, + conv.lastMessage, + conv.lastTime, + conv.unread || 0, + conv.accountId, + conv.chatId, + ); + } else { + const stmt = db.prepare(` + INSERT INTO conversations (account_id, chat_id, user_id, user_name, user_avatar, last_message, last_time, unread) + VALUES (?, ?, ?, ?, ?, ?, ?, ?) + `); + stmt.run( + conv.accountId, + conv.chatId, + conv.userId, + conv.userName, + conv.userAvatar || null, + conv.lastMessage, + conv.lastTime, + conv.unread || 0, + ); + } + if (emitEvent) { + emitConversationsUpdated(); + } +} + +// 更新用户头像 +export function updateConversationAvatar( + accountId: string, + chatId: string, + avatar: string, +) { + const stmt = db.prepare( + "UPDATE conversations SET user_avatar = ? WHERE account_id = ? AND chat_id = ?", + ); + stmt.run(avatar, accountId, chatId); +} + +// 标记已读 +export function markConversationRead(accountId: string, chatId: string) { + const stmt = db.prepare( + "UPDATE conversations SET unread = 0 WHERE account_id = ? AND chat_id = ?", + ); + stmt.run(accountId, chatId); + emitConversationsUpdated(); +} + +// 获取对话消息(分页) +export function getConversationMessages( + accountId: string, + chatId: string, + limit = 50, + beforeId?: number, +): DbConversationMessage[] { + if (beforeId) { + const stmt = db.prepare(` + SELECT * FROM conversation_messages + WHERE account_id = ? AND chat_id = ? AND id < ? + ORDER BY created_at DESC LIMIT ? + `); + return ( + stmt.all(accountId, chatId, beforeId, limit) as DbConversationMessage[] + ).reverse(); + } + const stmt = db.prepare(` + SELECT * FROM conversation_messages + WHERE account_id = ? AND chat_id = ? + ORDER BY created_at DESC LIMIT ? + `); + return ( + stmt.all(accountId, chatId, limit) as DbConversationMessage[] + ).reverse(); +} + +// 获取对话消息总数 +export function getConversationMessageCount( + accountId: string, + chatId: string, +): number { + const stmt = db.prepare( + "SELECT COUNT(*) as count FROM conversation_messages WHERE account_id = ? AND chat_id = ?", + ); + return (stmt.get(accountId, chatId) as { count: number }).count; +} + +// 获取所有消息总数 +export function getAllMessagesCount(): number { + const stmt = db.prepare( + "SELECT COUNT(*) as count FROM conversation_messages", + ); + return (stmt.get() as { count: number }).count; +} + +// 添加消息 +export function addConversationMessage( + msg: AddConversationMessageParams, +): number { + const stmt = db.prepare(` + INSERT INTO conversation_messages (account_id, chat_id, sender_id, sender_name, content, msg_time, msg_id, direction, created_at) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) + `); + const result = stmt.run( + msg.accountId, + msg.chatId, + msg.senderId, + msg.senderName, + msg.content, + msg.msgTime, + msg.msgId || null, + msg.direction, + Date.now(), + ); + emitConversationsUpdated(); + return result.lastInsertRowid as number; +} diff --git a/goofish_backend/src/goofish/db/index.ts b/goofish_backend/src/goofish/db/index.ts new file mode 100644 index 0000000..17e3f22 --- /dev/null +++ b/goofish_backend/src/goofish/db/index.ts @@ -0,0 +1,112 @@ +/** + * 数据库模块统一导出 + */ + +import { db, closeDatabase, getDbPath } from "./connection"; +import { runMigrations } from "./migrations"; +import { createLogger } from "../core/logger"; + +const logger = createLogger("Db"); + +// 初始化数据库 +export function initDatabase() { + logger.info(`初始化数据库: ${getDbPath()}`); + runMigrations(); + logger.info("数据库初始化完成"); +} + +// 导出连接 +export { db, closeDatabase }; + +// 导出仓库函数 +export { + getEnabledAccounts, + getAllAccounts, + getAccount, + upsertAccount, + updateAccountUserInfo, + updateAccountCookies, + updateAccountEnabled, + deleteAccount, + updateAccountStatus, + getAccountStatus, +} from "./account.repository"; + +export { + getConversations, + getConversationCount, + getConversation, + upsertConversation, + updateConversationAvatar, + markConversationRead, + getConversationMessages, + getConversationMessageCount, + addConversationMessage, +} from "./conversation.repository"; + +export { + getAutoReplyRules, + getEnabledAutoReplyRules, + getAutoReplyRule, + createAutoReplyRule, + updateAutoReplyRule, + deleteAutoReplyRule, + toggleAutoReplyRule, +} from "./autoreply.repository"; + +export { + getUserAvatar, + saveUserAvatar, + hasUserAvatar, +} from "./user-avatar.repository"; + +export { + getOrders, + getOrderCount, + getOrderById, + upsertOrder, + updateOrderStatus, + deleteOrder, +} from "./order.repository"; + +export { + getSetting, + setSetting, + deleteSetting, + getSettings, + getAISettings, + saveAISettings, + AI_SETTINGS_KEYS, +} from "./settings.repository"; + +export { + getAutoSellRules, + getEnabledAutoSellRules, + getAutoSellRule, + createAutoSellRule, + updateAutoSellRule, + deleteAutoSellRule, + toggleAutoSellRule, + getStockItems, + getStockStats, + addStockItems, + consumeStock, + clearStock, + addDeliveryLog, + getDeliveryLogs, + hasDelivered, +} from "./autosell.repository"; + +export { + getWorkflows, + getWorkflowById, + getDefaultWorkflow, + createWorkflow, + updateWorkflow, + deleteWorkflow, + createWorkflowExecution, + getWorkflowExecution, + getWorkflowExecutionByOrderId, + getWaitingExecutions, + updateWorkflowExecution, +} from "./workflow.repository"; diff --git a/goofish_backend/src/goofish/db/migrations.ts b/goofish_backend/src/goofish/db/migrations.ts new file mode 100644 index 0000000..e3b6df4 --- /dev/null +++ b/goofish_backend/src/goofish/db/migrations.ts @@ -0,0 +1,371 @@ +/** + * 数据库迁移和表结构初始化 + */ + +import { db } from './connection' +import { createLogger } from '../core/logger' + +const logger = createLogger('Db:Migration') + +// 安全添加列(如果不存在) +function safeAddColumn(table: string, column: string, type: string) { + try { + db.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${type}`) + } catch { + // 列已存在,忽略 + } +} + +// 创建账号相关表 +function createAccountTables() { + db.exec(` + CREATE TABLE IF NOT EXISTS accounts ( + id TEXT PRIMARY KEY, + cookies TEXT NOT NULL, + user_id TEXT, + nickname TEXT, + avatar TEXT, + enabled INTEGER DEFAULT 1, + remark TEXT DEFAULT '', + created_at TEXT DEFAULT CURRENT_TIMESTAMP, + updated_at TEXT DEFAULT CURRENT_TIMESTAMP + ) + `) + + safeAddColumn('accounts', 'avatar', 'TEXT') + + db.exec(` + CREATE TABLE IF NOT EXISTS account_status ( + account_id TEXT PRIMARY KEY, + connected INTEGER DEFAULT 0, + last_heartbeat TEXT, + last_token_refresh TEXT, + error_message TEXT, + updated_at TEXT DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (account_id) REFERENCES accounts(id) ON DELETE CASCADE + ) + `) +} + +// 创建消息相关表 +function createMessageTables() { + db.exec(` + CREATE TABLE IF NOT EXISTS messages ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + account_id TEXT NOT NULL, + chat_id TEXT, + sender_id TEXT, + sender_name TEXT, + content TEXT, + raw TEXT, + created_at TEXT DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (account_id) REFERENCES accounts(id) ON DELETE CASCADE + ) + `) +} + +// 创建对话相关表 +function createConversationTables() { + db.exec(` + CREATE TABLE IF NOT EXISTS conversations ( + account_id TEXT NOT NULL, + chat_id TEXT NOT NULL, + user_id TEXT NOT NULL, + user_name TEXT NOT NULL, + user_avatar TEXT, + last_message TEXT, + last_time INTEGER DEFAULT 0, + unread INTEGER DEFAULT 0, + created_at TEXT DEFAULT CURRENT_TIMESTAMP, + updated_at TEXT DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (account_id, chat_id) + ) + `) + + safeAddColumn('conversations', 'account_id', "TEXT DEFAULT ''") + + db.exec(` + CREATE TABLE IF NOT EXISTS conversation_messages ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + account_id TEXT NOT NULL, + chat_id TEXT NOT NULL, + sender_id TEXT NOT NULL, + sender_name TEXT NOT NULL, + content TEXT NOT NULL, + msg_time TEXT, + msg_id TEXT, + direction TEXT NOT NULL, + created_at INTEGER NOT NULL + ) + `) + + safeAddColumn('conversation_messages', 'msg_id', 'TEXT') + safeAddColumn('conversation_messages', 'account_id', "TEXT DEFAULT ''") + + // 创建索引 + db.exec(`CREATE INDEX IF NOT EXISTS idx_conv_msg_account_chat + ON conversation_messages(account_id, chat_id)`) + db.exec(`CREATE INDEX IF NOT EXISTS idx_conv_msg_created_at + ON conversation_messages(created_at)`) + db.exec(`CREATE INDEX IF NOT EXISTS idx_conversations_last_time + ON conversations(last_time DESC)`) + db.exec(`CREATE INDEX IF NOT EXISTS idx_conversations_account + ON conversations(account_id)`) +} + +// 创建自动回复表 +function createAutoReplyTables() { + db.exec(` + CREATE TABLE IF NOT EXISTS autoreply_rules ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + enabled INTEGER DEFAULT 1, + priority INTEGER DEFAULT 0, + match_type TEXT NOT NULL, + match_pattern TEXT NOT NULL, + reply_content TEXT NOT NULL, + account_id TEXT, + exclude_match INTEGER DEFAULT 0, + created_at TEXT DEFAULT CURRENT_TIMESTAMP, + updated_at TEXT DEFAULT CURRENT_TIMESTAMP + ) + `) + + // 添加 exclude_match 列(如果不存在) + safeAddColumn('autoreply_rules', 'exclude_match', 'INTEGER DEFAULT 0') + + // 插入默认测试规则 + const testRule = db.prepare( + 'SELECT id FROM autoreply_rules WHERE match_pattern = ?' + ).get('123') + + if (!testRule) { + db.prepare(` + INSERT INTO autoreply_rules (name, enabled, priority, match_type, match_pattern, reply_content) + VALUES (?, ?, ?, ?, ?, ?) + `).run('测试规则', 1, 100, 'exact', '123', '456') + logger.info('已创建默认测试自动回复规则') + } +} + +// 创建用户头像缓存表 +function createUserAvatarTables() { + db.exec(` + CREATE TABLE IF NOT EXISTS user_avatars ( + user_id TEXT PRIMARY KEY, + display_name TEXT, + avatar TEXT NOT NULL, + ip_location TEXT, + introduction TEXT, + created_at TEXT DEFAULT CURRENT_TIMESTAMP, + updated_at TEXT DEFAULT CURRENT_TIMESTAMP + ) + `) +} + +// 创建订单表 +function createOrderTables() { + db.exec(` + CREATE TABLE IF NOT EXISTS orders ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + order_id TEXT UNIQUE NOT NULL, + account_id TEXT NOT NULL, + item_id TEXT, + item_title TEXT, + item_pic_url TEXT, + price TEXT, + buyer_user_id TEXT, + buyer_nickname TEXT, + chat_id TEXT, + status INTEGER DEFAULT 0, + status_text TEXT, + order_time TEXT, + pay_time TEXT, + ship_time TEXT, + complete_time TEXT, + created_at TEXT DEFAULT CURRENT_TIMESTAMP, + updated_at TEXT DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (account_id) REFERENCES accounts(id) ON DELETE CASCADE + ) + `) + + // 添加 chat_id 列(如果不存在) + safeAddColumn('orders', 'chat_id', 'TEXT') + + // 创建索引 + db.exec(`CREATE INDEX IF NOT EXISTS idx_orders_account + ON orders(account_id)`) + db.exec(`CREATE INDEX IF NOT EXISTS idx_orders_status + ON orders(status)`) + db.exec(`CREATE INDEX IF NOT EXISTS idx_orders_updated + ON orders(updated_at DESC)`) +} + +// 创建系统设置表 +function createSettingsTables() { + db.exec(` + CREATE TABLE IF NOT EXISTS settings ( + key TEXT PRIMARY KEY, + value TEXT NOT NULL, + updated_at TEXT DEFAULT CURRENT_TIMESTAMP + ) + `) +} + +// 创建 ChattyPlay 用户表 +function createChattyplayUserTables() { + db.exec(` + CREATE TABLE IF NOT EXISTS chattyplay_user ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + username TEXT UNIQUE NOT NULL, + password TEXT NOT NULL, + email TEXT UNIQUE, + avatar TEXT, + created_at TEXT DEFAULT CURRENT_TIMESTAMP, + updated_at TEXT DEFAULT CURRENT_TIMESTAMP, + last_login TEXT + ) + `) + + // 创建索引 + db.exec(`CREATE INDEX IF NOT EXISTS idx_chattyplay_user_username + ON chattyplay_user(username)`) + db.exec(`CREATE INDEX IF NOT EXISTS idx_chattyplay_user_email + ON chattyplay_user(email)`) +} + +// 创建自动发货表 +function createAutoSellTables() { + db.exec(` + CREATE TABLE IF NOT EXISTS autosell_rules ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + enabled INTEGER DEFAULT 1, + item_id TEXT, + account_id TEXT, + delivery_type TEXT NOT NULL, + delivery_content TEXT, + api_config TEXT, + trigger_on TEXT DEFAULT 'paid', + workflow_id INTEGER, + created_at TEXT DEFAULT CURRENT_TIMESTAMP, + updated_at TEXT DEFAULT CURRENT_TIMESTAMP + ) + `) + + safeAddColumn('autosell_rules', 'workflow_id', 'INTEGER') + + db.exec(` + CREATE TABLE IF NOT EXISTS autosell_stock ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + rule_id INTEGER NOT NULL, + content TEXT NOT NULL, + used INTEGER DEFAULT 0, + used_order_id TEXT, + created_at TEXT DEFAULT CURRENT_TIMESTAMP, + used_at TEXT, + FOREIGN KEY (rule_id) REFERENCES autosell_rules(id) ON DELETE CASCADE + ) + `) + + db.exec(` + CREATE TABLE IF NOT EXISTS autosell_logs ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + rule_id INTEGER, + order_id TEXT NOT NULL, + account_id TEXT NOT NULL, + delivery_type TEXT NOT NULL, + content TEXT NOT NULL, + status TEXT DEFAULT 'success', + error_message TEXT, + created_at TEXT DEFAULT CURRENT_TIMESTAMP + ) + `) + + // 创建索引 + db.exec(`CREATE INDEX IF NOT EXISTS idx_autosell_stock_rule + ON autosell_stock(rule_id, used)`) + db.exec(`CREATE INDEX IF NOT EXISTS idx_autosell_logs_order + ON autosell_logs(order_id)`) +} + +// 创建发货流程表 +function createWorkflowTables() { + db.exec(` + CREATE TABLE IF NOT EXISTS workflows ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + description TEXT, + definition TEXT NOT NULL, + is_default INTEGER DEFAULT 0, + enabled INTEGER DEFAULT 1, + created_at TEXT DEFAULT CURRENT_TIMESTAMP, + updated_at TEXT DEFAULT CURRENT_TIMESTAMP + ) + `) + + db.exec(` + CREATE TABLE IF NOT EXISTS workflow_executions ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + workflow_id INTEGER NOT NULL, + order_id TEXT NOT NULL, + account_id TEXT NOT NULL, + rule_id INTEGER NOT NULL, + status TEXT DEFAULT 'pending', + current_node_id TEXT, + waiting_for_reply INTEGER DEFAULT 0, + expected_keywords TEXT, + context TEXT DEFAULT '{}', + created_at TEXT DEFAULT CURRENT_TIMESTAMP, + updated_at TEXT DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (workflow_id) REFERENCES workflows(id) ON DELETE CASCADE + ) + `) + + // 创建索引 + db.exec(`CREATE INDEX IF NOT EXISTS idx_workflow_exec_order + ON workflow_executions(order_id)`) + db.exec(`CREATE INDEX IF NOT EXISTS idx_workflow_exec_waiting + ON workflow_executions(account_id, waiting_for_reply, status)`) + + // 插入默认流程 + const defaultWorkflow = db.prepare( + 'SELECT id FROM workflows WHERE is_default = 1' + ).get() + + if (!defaultWorkflow) { + const defaultDef = JSON.stringify({ + nodes: [ + { id: 'trigger', type: 'trigger', name: '触发', config: {}, posX: 100, posY: 200 }, + { id: 'delivery', type: 'delivery', name: '发货', config: {}, posX: 350, posY: 200 }, + { id: 'ship', type: 'ship', name: '标记发货', config: {}, posX: 600, posY: 200 } + ], + connections: [ + { fromNode: 'trigger', fromOutput: 'output_1', toNode: 'delivery', toInput: 'input_1' }, + { fromNode: 'delivery', fromOutput: 'output_1', toNode: 'ship', toInput: 'input_1' } + ] + }) + db.prepare(` + INSERT INTO workflows (name, description, definition, is_default, enabled) + VALUES (?, ?, ?, 1, 1) + `).run('默认流程', '触发 → 发货 → 标记发货', defaultDef) + logger.info('已创建默认发货流程') + } +} + +export function runMigrations() { + logger.info('开始数据库迁移...') + + createAccountTables() + createMessageTables() + createConversationTables() + createAutoReplyTables() + createUserAvatarTables() + createOrderTables() + createSettingsTables() + createChattyplayUserTables() + createAutoSellTables() + createWorkflowTables() + + logger.info('数据库迁移完成') +} diff --git a/goofish_backend/src/goofish/db/order.repository.ts b/goofish_backend/src/goofish/db/order.repository.ts new file mode 100644 index 0000000..f248ee4 --- /dev/null +++ b/goofish_backend/src/goofish/db/order.repository.ts @@ -0,0 +1,173 @@ +/** + * 订单数据仓库 + */ + +import { db } from "./connection"; +import { nowLocalString } from "../utils/date"; +import { emitOrdersUpdated } from "../core/event-emitter"; +import type { OrderRecord, OrderListParams } from "../types/order.types"; + +// 获取订单列表 +export function getOrders(params: OrderListParams = {}): OrderRecord[] { + const { accountId, status, limit = 50, offset = 0 } = params; + + let sql = "SELECT * FROM orders WHERE 1=1"; + const sqlParams: any[] = []; + + if (accountId) { + sql += " AND account_id = ?"; + sqlParams.push(accountId); + } + + if (status !== undefined) { + sql += " AND status = ?"; + sqlParams.push(status); + } + + sql += " ORDER BY updated_at DESC LIMIT ? OFFSET ?"; + sqlParams.push(limit, offset); + + const rows = db.prepare(sql).all(...sqlParams) as any[]; + return rows.map(mapRowToOrder); +} + +// 获取订单总数 +export function getOrderCount(params: OrderListParams = {}): number { + const { accountId, status } = params; + + let sql = "SELECT COUNT(*) as count FROM orders WHERE 1=1"; + const sqlParams: any[] = []; + + if (accountId) { + sql += " AND account_id = ?"; + sqlParams.push(accountId); + } + + if (status !== undefined) { + sql += " AND status = ?"; + sqlParams.push(status); + } + + const row = db.prepare(sql).get(...sqlParams) as { count: number }; + return row.count; +} + +// 根据订单 ID 获取订单 +export function getOrderById(orderId: string): OrderRecord | null { + const row = db + .prepare("SELECT * FROM orders WHERE order_id = ?") + .get(orderId) as any; + + return row ? mapRowToOrder(row) : null; +} + +// 创建或更新订单 +export function upsertOrder( + order: Partial & { orderId: string; accountId: string }, +): void { + const now = nowLocalString(); + + db.prepare( + ` + INSERT INTO orders ( + order_id, account_id, item_id, item_title, item_pic_url, + price, buyer_user_id, buyer_nickname, chat_id, status, status_text, + order_time, pay_time, ship_time, complete_time, created_at, updated_at + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ON CONFLICT(order_id) DO UPDATE SET + item_id = COALESCE(excluded.item_id, item_id), + item_title = COALESCE(excluded.item_title, item_title), + item_pic_url = COALESCE(excluded.item_pic_url, item_pic_url), + price = COALESCE(excluded.price, price), + buyer_user_id = COALESCE(excluded.buyer_user_id, buyer_user_id), + buyer_nickname = COALESCE(excluded.buyer_nickname, buyer_nickname), + chat_id = COALESCE(excluded.chat_id, chat_id), + status = COALESCE(excluded.status, status), + status_text = COALESCE(excluded.status_text, status_text), + order_time = COALESCE(excluded.order_time, order_time), + pay_time = COALESCE(excluded.pay_time, pay_time), + ship_time = COALESCE(excluded.ship_time, ship_time), + complete_time = COALESCE(excluded.complete_time, complete_time), + updated_at = excluded.updated_at + `, + ).run( + order.orderId, + order.accountId, + order.itemId || null, + order.itemTitle || null, + order.itemPicUrl || null, + order.price || null, + order.buyerUserId || null, + order.buyerNickname || null, + order.chatId || null, + order.status || 1, + order.statusText || null, + order.orderTime || now, + order.payTime || null, + order.shipTime || null, + order.completeTime || null, + now, + now, + ); + + emitOrdersUpdated(); +} + +// 更新订单状态 +export function updateOrderStatus( + orderId: string, + status: number, + statusText: string, + timeField?: "pay_time" | "ship_time" | "complete_time", +): void { + const now = nowLocalString(); + + let sql = "UPDATE orders SET status = ?, status_text = ?, updated_at = ?"; + const params: any[] = [status, statusText, now]; + + if (timeField) { + sql += `, ${timeField} = ?`; + params.push(now); + } + + sql += " WHERE order_id = ?"; + params.push(orderId); + + db.prepare(sql).run(...params); + emitOrdersUpdated(); +} + +// 删除订单 +export function deleteOrder(orderId: string): boolean { + const result = db + .prepare("DELETE FROM orders WHERE order_id = ?") + .run(orderId); + if (result.changes > 0) { + emitOrdersUpdated(); + } + return result.changes > 0; +} + +// 行数据映射 +function mapRowToOrder(row: any): OrderRecord { + return { + id: row.id, + orderId: row.order_id, + accountId: row.account_id, + itemId: row.item_id, + itemTitle: row.item_title, + itemPicUrl: row.item_pic_url, + price: row.price, + buyerUserId: row.buyer_user_id, + buyerNickname: row.buyer_nickname, + chatId: row.chat_id, + status: row.status, + statusText: row.status_text, + orderTime: row.order_time, + payTime: row.pay_time, + shipTime: row.ship_time, + completeTime: row.complete_time, + createdAt: row.created_at, + updatedAt: row.updated_at, + }; +} diff --git a/goofish_backend/src/goofish/db/settings.repository.ts b/goofish_backend/src/goofish/db/settings.repository.ts new file mode 100644 index 0000000..a54a4ec --- /dev/null +++ b/goofish_backend/src/goofish/db/settings.repository.ts @@ -0,0 +1,82 @@ +/** + * 系统设置数据仓库 + */ + +import { db } from "./connection"; + +interface DbSetting { + key: string; + value: string; + updated_at: string; +} + +// 获取设置值 +export function getSetting(key: string): string | null { + const stmt = db.prepare("SELECT value FROM settings WHERE key = ?"); + const row = stmt.get(key) as DbSetting | undefined; + return row?.value ?? null; +} + +// 设置值 +export function setSetting(key: string, value: string): void { + const stmt = db.prepare(` + INSERT INTO settings (key, value, updated_at) VALUES (?, ?, CURRENT_TIMESTAMP) + ON CONFLICT(key) DO UPDATE SET value = ?, updated_at = CURRENT_TIMESTAMP + `); + stmt.run(key, value, value); +} + +// 删除设置 +export function deleteSetting(key: string): boolean { + const stmt = db.prepare("DELETE FROM settings WHERE key = ?"); + const result = stmt.run(key); + return result.changes > 0; +} + +// 获取多个设置 +export function getSettings(keys: string[]): Record { + const result: Record = {}; + for (const key of keys) { + result[key] = getSetting(key); + } + return result; +} + +// AI 设置相关 key +export const AI_SETTINGS_KEYS = { + BASE_URL: "ai_base_url", + API_KEY: "ai_api_key", + MODEL: "ai_model", + SYSTEM_PROMPT: "ai_system_prompt", +}; + +// 获取 AI 设置 +export function getAISettings() { + return { + baseUrl: getSetting(AI_SETTINGS_KEYS.BASE_URL) || "", + apiKey: getSetting(AI_SETTINGS_KEYS.API_KEY) || "", + model: getSetting(AI_SETTINGS_KEYS.MODEL) || "gpt-3.5-turbo", + systemPrompt: getSetting(AI_SETTINGS_KEYS.SYSTEM_PROMPT) || "", + }; +} + +// 保存 AI 设置 +export function saveAISettings(settings: { + baseUrl?: string; + apiKey?: string; + model?: string; + systemPrompt?: string; +}) { + if (settings.baseUrl !== undefined) { + setSetting(AI_SETTINGS_KEYS.BASE_URL, settings.baseUrl); + } + if (settings.apiKey !== undefined) { + setSetting(AI_SETTINGS_KEYS.API_KEY, settings.apiKey); + } + if (settings.model !== undefined) { + setSetting(AI_SETTINGS_KEYS.MODEL, settings.model); + } + if (settings.systemPrompt !== undefined) { + setSetting(AI_SETTINGS_KEYS.SYSTEM_PROMPT, settings.systemPrompt); + } +} diff --git a/goofish_backend/src/goofish/db/user-avatar.repository.ts b/goofish_backend/src/goofish/db/user-avatar.repository.ts new file mode 100644 index 0000000..2f42f9b --- /dev/null +++ b/goofish_backend/src/goofish/db/user-avatar.repository.ts @@ -0,0 +1,44 @@ +/** + * 用户头像缓存数据仓库 + */ + +import { db } from "./connection"; +import type { DbUserAvatar, SaveUserAvatarParams } from "../types/index"; + +// 获取用户头像 +export function getUserAvatar(userId: string): DbUserAvatar | undefined { + const stmt = db.prepare("SELECT * FROM user_avatars WHERE user_id = ?"); + return stmt.get(userId) as DbUserAvatar | undefined; +} + +// 保存用户头像 +export function saveUserAvatar(data: SaveUserAvatarParams): boolean { + try { + const stmt = db.prepare(` + INSERT INTO user_avatars (user_id, display_name, avatar, ip_location, introduction) + VALUES (?, ?, ?, ?, ?) + ON CONFLICT(user_id) DO UPDATE SET + display_name = COALESCE(excluded.display_name, display_name), + avatar = excluded.avatar, + ip_location = COALESCE(excluded.ip_location, ip_location), + introduction = COALESCE(excluded.introduction, introduction), + updated_at = CURRENT_TIMESTAMP + `); + stmt.run( + data.userId, + data.displayName || null, + data.avatar, + data.ipLocation || null, + data.introduction || null, + ); + return true; + } catch { + return false; + } +} + +// 检查用户头像是否存在 +export function hasUserAvatar(userId: string): boolean { + const stmt = db.prepare("SELECT 1 FROM user_avatars WHERE user_id = ?"); + return !!stmt.get(userId); +} diff --git a/goofish_backend/src/goofish/db/user.repository.ts b/goofish_backend/src/goofish/db/user.repository.ts new file mode 100644 index 0000000..7c1a46a --- /dev/null +++ b/goofish_backend/src/goofish/db/user.repository.ts @@ -0,0 +1,148 @@ +/** + * ChattyPlay 用户数据访问层 + */ + +import { db } from './connection' +import { createLogger } from '../core/logger' + +const logger = createLogger('Db:UserRepository') + +export interface ChattyplayUser { + id?: number + username: string + password: string + email?: string + avatar?: string + created_at?: string + updated_at?: string + last_login?: string +} + +export interface UserWithoutPassword { + id: number + username: string + email?: string + avatar?: string + created_at?: string + updated_at?: string + last_login?: string +} + +export class UserRepository { + /** + * 根据用户名查找用户 + */ + findByUsername(username: string): ChattyplayUser | undefined { + try { + const stmt = db.prepare('SELECT * FROM chattyplay_user WHERE username = ?') + return stmt.get(username) as ChattyplayUser | undefined + } catch (error) { + // @ts-ignore + logger.error('根据用户名查找用户失败:', error) + throw error + } + } + + /** + * 根据邮箱查找用户 + */ + findByEmail(email: string): ChattyplayUser | undefined { + try { + const stmt = db.prepare('SELECT * FROM chattyplay_user WHERE email = ?') + return stmt.get(email) as ChattyplayUser | undefined + } catch (error) { + // @ts-ignore + logger.error('根据邮箱查找用户失败:', error) + throw error + } + } + + /** + * 根据 ID 查找用户(不包含密码) + */ + findById(id: number): UserWithoutPassword | undefined { + try { + const stmt = db.prepare('SELECT id, username, email, avatar, created_at, updated_at, last_login FROM chattyplay_user WHERE id = ?') + return stmt.get(id) as UserWithoutPassword | undefined + } catch (error) { + // @ts-ignore + logger.error('根据ID查找用户失败:', error) + throw error + } + } + + /** + * 创建新用户 + */ + create(user: Omit): number { + try { + const stmt = db.prepare(` + INSERT INTO chattyplay_user (username, password, email, avatar) + VALUES (?, ?, ?, ?) + `) + const result = stmt.run(user.username, user.password, user.email || null, user.avatar || null) + logger.info(`创建用户成功: ${user.username}`) + return result.lastInsertRowid as number + } catch (error) { + // @ts-ignore + logger.error('创建用户失败:', error) + throw error + } + } + + /** + * 更新最后登录时间 + */ + updateLastLogin(userId: number): void { + try { + const stmt = db.prepare(` + UPDATE chattyplay_user + SET last_login = CURRENT_TIMESTAMP + WHERE id = ? + `) + stmt.run(userId) + } catch (error) { + // @ts-ignore + logger.error('更新最后登录时间失败:', error) + throw error + } + } + + /** + * 更新用户头像 + */ + updateAvatar(userId: number, avatar: string): void { + try { + const stmt = db.prepare(` + UPDATE chattyplay_user + SET avatar = ?, updated_at = CURRENT_TIMESTAMP + WHERE id = ? + `) + stmt.run(avatar, userId) + } catch (error) { + // @ts-ignore + logger.error('更新用户头像失败:', error) + throw error + } + } + + /** + * 更新用户邮箱 + */ + updateEmail(userId: number, email: string): void { + try { + const stmt = db.prepare(` + UPDATE chattyplay_user + SET email = ?, updated_at = CURRENT_TIMESTAMP + WHERE id = ? + `) + stmt.run(email, userId) + } catch (error) { + // @ts-ignore + logger.error('更新用户邮箱失败:', error) + throw error + } + } +} + +export const userRepository = new UserRepository() diff --git a/goofish_backend/src/goofish/db/workflow.repository.ts b/goofish_backend/src/goofish/db/workflow.repository.ts new file mode 100644 index 0000000..8beddae --- /dev/null +++ b/goofish_backend/src/goofish/db/workflow.repository.ts @@ -0,0 +1,270 @@ +/** + * 发货流程数据仓库 + */ + +import { db } from "./connection"; +import type { + Workflow, + WorkflowDefinition, + WorkflowExecution, + WorkflowExecutionStatus, +} from "../types/workflow.types"; + +// 获取所有流程 +export function getWorkflows(): Workflow[] { + const stmt = db.prepare(` + SELECT id, name, description, definition, is_default, enabled, created_at, updated_at + FROM workflows ORDER BY is_default DESC, id ASC + `); + const rows = stmt.all() as any[]; + return rows.map((row) => ({ + id: row.id, + name: row.name, + description: row.description, + definition: JSON.parse(row.definition), + isDefault: Boolean(row.is_default), + enabled: Boolean(row.enabled), + createdAt: row.created_at, + updatedAt: row.updated_at, + })); +} + +// 获取单个流程 +export function getWorkflowById(id: number): Workflow | null { + const stmt = db.prepare(` + SELECT id, name, description, definition, is_default, enabled, created_at, updated_at + FROM workflows WHERE id = ? + `); + const row = stmt.get(id) as any; + if (!row) return null; + return { + id: row.id, + name: row.name, + description: row.description, + definition: JSON.parse(row.definition), + isDefault: Boolean(row.is_default), + enabled: Boolean(row.enabled), + createdAt: row.created_at, + updatedAt: row.updated_at, + }; +} + +// 获取默认流程 +export function getDefaultWorkflow(): Workflow | null { + const stmt = db.prepare(` + SELECT id, name, description, definition, is_default, enabled, created_at, updated_at + FROM workflows WHERE is_default = 1 LIMIT 1 + `); + const row = stmt.get() as any; + if (!row) return null; + return { + id: row.id, + name: row.name, + description: row.description, + definition: JSON.parse(row.definition), + isDefault: Boolean(row.is_default), + enabled: Boolean(row.enabled), + createdAt: row.created_at, + updatedAt: row.updated_at, + }; +} + +// 创建流程 +export function createWorkflow(data: { + name: string; + description?: string; + definition: WorkflowDefinition; + isDefault?: boolean; +}): number { + // 如果设为默认,先取消其他默认 + if (data.isDefault) { + db.prepare("UPDATE workflows SET is_default = 0").run(); + } + + const stmt = db.prepare(` + INSERT INTO workflows (name, description, definition, is_default, enabled) + VALUES (?, ?, ?, ?, 1) + `); + const result = stmt.run( + data.name, + data.description || null, + JSON.stringify(data.definition), + data.isDefault ? 1 : 0, + ); + return result.lastInsertRowid as number; +} + +// 更新流程 +export function updateWorkflow( + id: number, + data: { + name?: string; + description?: string; + definition?: WorkflowDefinition; + isDefault?: boolean; + enabled?: boolean; + }, +): boolean { + const workflow = getWorkflowById(id); + if (!workflow) return false; + + // 如果设为默认,先取消其他默认 + if (data.isDefault) { + db.prepare("UPDATE workflows SET is_default = 0 WHERE id != ?").run(id); + } + + const stmt = db.prepare(` + UPDATE workflows SET + name = COALESCE(?, name), + description = COALESCE(?, description), + definition = COALESCE(?, definition), + is_default = COALESCE(?, is_default), + enabled = COALESCE(?, enabled), + updated_at = CURRENT_TIMESTAMP + WHERE id = ? + `); + stmt.run( + data.name ?? null, + data.description ?? null, + data.definition ? JSON.stringify(data.definition) : null, + data.isDefault !== undefined ? (data.isDefault ? 1 : 0) : null, + data.enabled !== undefined ? (data.enabled ? 1 : 0) : null, + id, + ); + return true; +} + +// 删除流程 +export function deleteWorkflow(id: number): boolean { + const workflow = getWorkflowById(id); + if (!workflow || workflow.isDefault) return false; // 不能删除默认流程 + + const stmt = db.prepare("DELETE FROM workflows WHERE id = ?"); + stmt.run(id); + return true; +} + +// ============ 流程执行相关 ============ + +// 创建流程执行记录 +export function createWorkflowExecution(data: { + workflowId: number; + orderId: string; + accountId: string; + ruleId: number; + currentNodeId?: string; + context?: Record; +}): number { + const stmt = db.prepare(` + INSERT INTO workflow_executions + (workflow_id, order_id, account_id, rule_id, status, current_node_id, context) + VALUES (?, ?, ?, ?, 'pending', ?, ?) + `); + const result = stmt.run( + data.workflowId, + data.orderId, + data.accountId, + data.ruleId, + data.currentNodeId || null, + JSON.stringify(data.context || {}), + ); + return result.lastInsertRowid as number; +} + +// 获取流程执行记录 +export function getWorkflowExecution(id: number): WorkflowExecution | null { + const stmt = db.prepare(` + SELECT id, workflow_id, order_id, account_id, rule_id, status, + current_node_id, waiting_for_reply, expected_keywords, context, + created_at, updated_at + FROM workflow_executions WHERE id = ? + `); + const row = stmt.get(id) as any; + if (!row) return null; + return mapExecutionRow(row); +} + +// 根据订单ID获取执行记录 +export function getWorkflowExecutionByOrderId( + orderId: string, +): WorkflowExecution | null { + const stmt = db.prepare(` + SELECT id, workflow_id, order_id, account_id, rule_id, status, + current_node_id, waiting_for_reply, expected_keywords, context, + created_at, updated_at + FROM workflow_executions + WHERE order_id = ? AND status NOT IN ('completed', 'failed') + ORDER BY id DESC LIMIT 1 + `); + const row = stmt.get(orderId) as any; + if (!row) return null; + return mapExecutionRow(row); +} + +// 获取等待用户回复的执行记录 +export function getWaitingExecutions(accountId: string): WorkflowExecution[] { + const stmt = db.prepare(` + SELECT id, workflow_id, order_id, account_id, rule_id, status, + current_node_id, waiting_for_reply, expected_keywords, context, + created_at, updated_at + FROM workflow_executions + WHERE account_id = ? AND waiting_for_reply = 1 AND status = 'waiting' + `); + const rows = stmt.all(accountId) as any[]; + return rows.map(mapExecutionRow); +} + +// 更新流程执行状态 +export function updateWorkflowExecution( + id: number, + data: { + status?: WorkflowExecutionStatus; + currentNodeId?: string | null; + waitingForReply?: boolean; + expectedKeywords?: string[] | null; + context?: Record; + }, +): boolean { + const stmt = db.prepare(` + UPDATE workflow_executions SET + status = COALESCE(?, status), + current_node_id = COALESCE(?, current_node_id), + waiting_for_reply = COALESCE(?, waiting_for_reply), + expected_keywords = COALESCE(?, expected_keywords), + context = COALESCE(?, context), + updated_at = CURRENT_TIMESTAMP + WHERE id = ? + `); + stmt.run( + data.status ?? null, + data.currentNodeId !== undefined ? data.currentNodeId : null, + data.waitingForReply !== undefined ? (data.waitingForReply ? 1 : 0) : null, + data.expectedKeywords !== undefined + ? data.expectedKeywords + ? JSON.stringify(data.expectedKeywords) + : null + : null, + data.context ? JSON.stringify(data.context) : null, + id, + ); + return true; +} + +function mapExecutionRow(row: any): WorkflowExecution { + return { + id: row.id, + workflowId: row.workflow_id, + orderId: row.order_id, + accountId: row.account_id, + ruleId: row.rule_id, + status: row.status, + currentNodeId: row.current_node_id, + waitingForReply: Boolean(row.waiting_for_reply), + expectedKeywords: row.expected_keywords + ? JSON.parse(row.expected_keywords) + : null, + context: row.context ? JSON.parse(row.context) : {}, + createdAt: row.created_at, + updatedAt: row.updated_at, + }; +} diff --git a/goofish_backend/src/goofish/index.ts b/goofish_backend/src/goofish/index.ts new file mode 100644 index 0000000..64dd555 --- /dev/null +++ b/goofish_backend/src/goofish/index.ts @@ -0,0 +1,113 @@ +import { + createLogger, + cleanOldLogs, + setLogLevel, + LogLevel, +} from "./core/logger"; +import { ClientManager } from "./websocket"; +import { initDatabase, closeDatabase } from "./db"; +import { + startServer, + setClientManager, + messageStore, + conversationStore, +} from "./api"; +import { + fetchUserHead, + handleOrderMessage, + fetchAndUpdateOrderDetail, +} from "./services"; +import { SERVER_CONFIG, LOG_CONFIG } from "./core/constants"; + +const logger = createLogger("Goofish:App"); + +// 保存 clientManager 引用供异步函数使用 +let clientManager: ClientManager; + +export async function startGoofishServer(port: number = 3001) { + // 设置日志级别 + setLogLevel(LOG_CONFIG.LEVEL as LogLevel); + + // 清理过期日志 + cleanOldLogs(LOG_CONFIG.RETENTION_DAYS); + + logger.info("启动闲鱼多账号WebSocket客户端..."); + + // 初始化数据库 + initDatabase(); + + // 创建客户端管理器 + clientManager = new ClientManager(async (accountId, msg) => { + logger.info(`收到新消息: ${msg.senderName}: ${msg.content}`); + messageStore.add(msg); + conversationStore.addIncoming(accountId, msg); + + // 处理订单状态消息 + if (msg.isOrderMessage && msg.orderId) { + logger.info(`订单消息: orderId=${msg.orderId}`); + handleOrderMessage(accountId, msg.orderId, msg.chatId); + // 异步获取订单详情 + fetchOrderDetailAsync(accountId, msg.orderId); + } + + // 异步获取用户头像(不阻塞消息处理) + fetchUserAvatarAsync(accountId, msg.chatId, msg.senderId); + }); + + // 设置 API 客户端管理器引用 + setClientManager(clientManager); + + // 启动 API 服务器 + startServer(port); + + // 从数据库加载并启动所有启用的账号 + await clientManager.startAll(); + + // 优雅退出 + process.on("SIGINT", () => { + logger.info("收到退出信号,正在断开连接..."); + clientManager.stopAll(); + closeDatabase(); + process.exit(0); + }); + + process.on("SIGTERM", () => { + logger.info("收到终止信号,正在断开连接..."); + clientManager.stopAll(); + closeDatabase(); + process.exit(0); + }); + + logger.info("Goofish 系统已启动,等待消息..."); +} + +// 异步获取用户头像 +async function fetchUserAvatarAsync( + accountId: string, + chatId: string, + userId: string, +) { + try { + const { userHead } = await fetchUserHead(accountId, userId); + + if (userHead?.avatar) { + conversationStore.updateUserAvatar(accountId, chatId, userHead.avatar); + } + } catch (e) { + logger.debug(`获取用户头像失败: ${e}`); + } +} + +// 异步获取订单详情 +async function fetchOrderDetailAsync(accountId: string, orderId: string) { + try { + const client = clientManager.getClient(accountId); + if (!client) { + logger.warn(`获取订单详情失败: 账号 ${accountId} 客户端不存在`); + return; + } + await fetchAndUpdateOrderDetail(client, orderId); + } catch (e) { + logger.debug(`获取订单详情失败: ${e}`); + } +} diff --git a/goofish_backend/src/goofish/services/ai.service.ts b/goofish_backend/src/goofish/services/ai.service.ts new file mode 100644 index 0000000..877735a --- /dev/null +++ b/goofish_backend/src/goofish/services/ai.service.ts @@ -0,0 +1,255 @@ +/** + * AI 回复服务 + */ + +import OpenAI from "openai"; + +import { createLogger } from "../core/logger"; +import { getAISettings } from "../db/index"; +import { + AI_TOOLS, + queryBuyerOrders, + getChatHistory, + type OrderQueryContext, +} from "../ai-tools/index"; + +const logger = createLogger("Svc:AI"); + +let openaiClient: OpenAI | null = null; +let lastSettings: string = ""; + +// 获取或创建 OpenAI 客户端 +function getClient(): OpenAI | null { + const settings = getAISettings(); + + if (!settings.apiKey) { + return null; + } + + const settingsKey = `${settings.baseUrl}|${settings.apiKey}`; + + if (openaiClient && lastSettings === settingsKey) { + return openaiClient; + } + + openaiClient = new OpenAI({ + apiKey: settings.apiKey, + baseURL: settings.baseUrl || undefined, + }); + lastSettings = settingsKey; + + return openaiClient; +} + +export interface AIContext { + userName?: string; + itemTitle?: string; + accountId?: string; + buyerUserId?: string; + chatId?: string; +} + +/** + * 执行工具调用 + */ +function executeToolCall(toolName: string, _args: any, ctx: AIContext): string { + logger.info( + `执行工具调用: ${toolName}, accountId=${ctx.accountId}, buyerUserId=${ctx.buyerUserId}`, + ); + + switch (toolName) { + case "query_buyer_orders": { + if (!ctx.accountId || !ctx.buyerUserId) { + return JSON.stringify({ success: false, message: "无法获取买家信息" }); + } + const orderCtx: OrderQueryContext = { + accountId: ctx.accountId, + buyerUserId: ctx.buyerUserId, + }; + const result = queryBuyerOrders(orderCtx); + logger.info(`订单查询结果: ${JSON.stringify(result)}`); + return JSON.stringify(result); + } + default: + return JSON.stringify({ success: false, message: "未知工具" }); + } +} + +/** + * 生成 AI 回复 + */ +export async function generateAIReply( + userMessage: string, + context?: AIContext, + rulePrompt?: string, +): Promise { + const client = getClient(); + if (!client) { + logger.warn("AI 服务未配置"); + return null; + } + + const settings = getAISettings(); + + try { + // 优先使用规则级别的提示词,否则使用全局提示词 + let systemPrompt = + rulePrompt || + settings.systemPrompt || + "你是一个闲鱼卖家的智能客服助手,请用简洁友好的语气回复买家的消息。"; + + // 如果启用了工具,添加工具使用说明 + if (context?.accountId && context?.buyerUserId) { + systemPrompt += + "\n\n你可以使用 query_buyer_orders 工具查询当前买家在本店的订单信息。当买家询问订单相关问题时,请先调用此工具获取订单数据再回复。"; + } + + const messages: OpenAI.ChatCompletionMessageParam[] = [ + { role: "system", content: systemPrompt }, + ]; + + // 添加上下文信息 + if (context?.userName || context?.itemTitle) { + let contextMsg = "当前对话信息:"; + if (context.userName) contextMsg += `买家昵称: ${context.userName};`; + if (context.itemTitle) contextMsg += `商品: ${context.itemTitle};`; + messages.push({ role: "system", content: contextMsg }); + } + + // 添加聊天历史作为上下文 + if (context?.accountId && context?.chatId) { + const history = getChatHistory( + { accountId: context.accountId, chatId: context.chatId }, + 10, + ); + if (history.length > 0) { + logger.debug(`加载 ${history.length} 条历史消息作为上下文`); + for (const msg of history) { + messages.push({ role: msg.role, content: msg.content }); + } + } + } + + // 添加当前用户消息 + messages.push({ role: "user", content: userMessage }); + + // 判断是否启用工具(需要有买家信息) + const enableTools = !!(context?.accountId && context?.buyerUserId); + + logger.info(`AI 调用: enableTools=${enableTools}, model=${settings.model}`); + + const requestParams: OpenAI.ChatCompletionCreateParams = { + model: settings.model || "gpt-3.5-turbo", + messages, + max_tokens: 500, + temperature: 0.7, + }; + + if (enableTools) { + requestParams.tools = AI_TOOLS; + requestParams.tool_choice = "auto"; + logger.info( + `已启用工具: ${AI_TOOLS.map((t) => t.function.name).join(", ")}`, + ); + } + + const response = await client.chat.completions.create(requestParams); + + const choice = response.choices[0]; + logger.info( + `AI 响应: finish_reason=${choice?.finish_reason}, has_tool_calls=${!!choice?.message?.tool_calls}`, + ); + + // 处理工具调用(有些模型 finish_reason 可能不是 tool_calls 但仍有 tool_calls) + if (choice?.message?.tool_calls && choice.message.tool_calls.length > 0) { + const toolCalls = choice.message.tool_calls as Array<{ + id: string; + function: { name: string; arguments: string }; + }>; + logger.info( + `AI 请求调用工具: ${toolCalls.map((t) => t.function.name).join(", ")}`, + ); + + // 添加助手消息 + messages.push(choice.message); + + // 执行工具调用并添加结果 + for (const toolCall of toolCalls) { + const toolResult = executeToolCall( + toolCall.function.name, + JSON.parse(toolCall.function.arguments || "{}"), + context || {}, + ); + messages.push({ + role: "tool", + tool_call_id: toolCall.id, + content: toolResult, + }); + logger.debug( + `工具 ${toolCall.function.name} 返回: ${toolResult.slice(0, 100)}...`, + ); + } + + // 再次调用获取最终回复 + const finalResponse = await client.chat.completions.create({ + model: settings.model || "gpt-3.5-turbo", + messages, + max_tokens: 500, + temperature: 0.7, + }); + + const reply = finalResponse.choices[0]?.message?.content?.trim(); + if (reply) { + logger.info( + `AI 回复生成成功(含工具): ${userMessage.slice(0, 30)}... -> ${reply.slice(0, 30)}...`, + ); + return reply; + } + } + + // 直接回复 + const reply = choice?.message?.content?.trim(); + + if (reply) { + logger.info( + `AI 回复生成成功: ${userMessage.slice(0, 30)}... -> ${reply.slice(0, 30)}...`, + ); + return reply; + } + + return null; + } catch (e) { + logger.error(`AI 回复生成失败: ${e}`); + return null; + } +} + +/** + * 测试 AI 连接 + */ +export async function testAIConnection(): Promise<{ + success: boolean; + error?: string; +}> { + const client = getClient(); + if (!client) { + return { success: false, error: "AI 服务未配置,请先设置 API Key" }; + } + + const settings = getAISettings(); + + try { + const response = await client.chat.completions.create({ + model: settings.model || "gpt-3.5-turbo", + messages: [{ role: "user", content: "你好" }], + max_tokens: 10, + }); + + if (response.choices[0]?.message?.content) { + return { success: true }; + } + return { success: false, error: "未收到有效响应" }; + } catch (e: any) { + return { success: false, error: e.message || "连接失败" }; + } +} diff --git a/goofish_backend/src/goofish/services/auth.service.ts b/goofish_backend/src/goofish/services/auth.service.ts new file mode 100644 index 0000000..7de932d --- /dev/null +++ b/goofish_backend/src/goofish/services/auth.service.ts @@ -0,0 +1,202 @@ +/** + * 用户认证服务 + */ + +import { userRepository, ChattyplayUser, UserWithoutPassword } from '../db/user.repository' +import { hashPassword, verifyPassword } from '../utils/password.util' +import { generateToken, verifyToken, TokenPayload } from '../utils/jwt.util' +import { createLogger } from '../core/logger' + +const logger = createLogger('AuthService') + +export interface RegisterData { + username: string + password: string + email?: string +} + +export interface LoginData { + username: string + password: string +} + +export interface AuthResponse { + success: boolean + message?: string + token?: string + user?: UserWithoutPassword +} + +/** + * 用户注册 + */ +export async function register(data: RegisterData): Promise { + try { + // 验证用户名长度 + if (data.username.length < 3 || data.username.length > 20) { + return { + success: false, + message: '用户名长度必须在3-20个字符之间' + } + } + + // 验证密码长度 + if (data.password.length < 6 || data.password.length > 20) { + return { + success: false, + message: '密码长度必须在6-20个字符之间' + } + } + + // 验证邮箱格式(如果提供) + if (data.email) { + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ + if (!emailRegex.test(data.email)) { + return { + success: false, + message: '邮箱格式不正确' + } + } + } + + // 检查用户名是否已存在 + const existingUser = userRepository.findByUsername(data.username) + if (existingUser) { + return { + success: false, + message: '用户名已存在' + } + } + + // 检查邮箱是否已存在(如果提供) + if (data.email) { + const existingEmail = userRepository.findByEmail(data.email) + if (existingEmail) { + return { + success: false, + message: '邮箱已被注册' + } + } + } + + // 加密密码 + const hashedPassword = hashPassword(data.password) + + // 创建用户 + const userId = userRepository.create({ + username: data.username, + password: hashedPassword, + email: data.email + }) + + // 获取用户信息(不包含密码) + const user = userRepository.findById(userId) + if (!user) { + return { + success: false, + message: '创建用户失败' + } + } + + // 生成 token + const token = generateToken({ + userId: user.id, + username: user.username + }) + + logger.info(`用户注册成功: ${data.username}`) + + return { + success: true, + message: '注册成功', + token, + user + } + } catch (error) { + // @ts-ignore + logger.error('注册失败:', error) + return { + success: false, + message: '注册失败,请稍后重试' + } + } +} + +/** + * 用户登录 + */ +export async function login(data: LoginData): Promise { + try { + // 查找用户 + const user = userRepository.findByUsername(data.username) + if (!user) { + return { + success: false, + message: '用户名或密码错误' + } + } + + // 验证密码 + const isPasswordValid = verifyPassword(data.password, user.password) + if (!isPasswordValid) { + return { + success: false, + message: '用户名或密码错误' + } + } + + // 更新最后登录时间 + userRepository.updateLastLogin(user.id!) + + // 获取用户信息(不包含密码) + const userWithoutPassword = userRepository.findById(user.id!) + if (!userWithoutPassword) { + return { + success: false, + message: '登录失败' + } + } + + // 生成 token + const token = generateToken({ + userId: userWithoutPassword.id, + username: userWithoutPassword.username + }) + + logger.info(`用户登录成功: ${data.username}`) + + return { + success: true, + message: '登录成功', + token, + user: userWithoutPassword + } + } catch (error) { + // @ts-ignore + logger.error('登录失败:', error) + return { + success: false, + message: '登录失败,请稍后重试' + } + } +} + +/** + * 验证 token + */ +export function authenticateToken(token: string): TokenPayload | null { + return verifyToken(token) +} + +/** + * 根据 token 获取用户信息 + */ +export function getUserByToken(token: string): UserWithoutPassword | null { + const payload = verifyToken(token) + if (!payload) { + return null + } + + const user = userRepository.findById(payload.userId) + return user || null +} diff --git a/goofish_backend/src/goofish/services/autoreply.service.ts b/goofish_backend/src/goofish/services/autoreply.service.ts new file mode 100644 index 0000000..eab30a0 --- /dev/null +++ b/goofish_backend/src/goofish/services/autoreply.service.ts @@ -0,0 +1,175 @@ +/** + * 自动回复服务 + */ + +import { createLogger } from "../core/logger"; +import { getEnabledAutoReplyRules } from "../db/index"; +import { generateAIReply, type AIContext } from "./ai.service"; +import type { + ChatMessage, + DbAutoReplyRule, + AutoReplyResult, +} from "../types/index"; + +const logger = createLogger("Svc:AutoReply"); + +/** + * 检查消息是否匹配自动回复规则 + */ +export async function checkAutoReply( + accountId: string, + msg: ChatMessage, + context?: { userName?: string; itemTitle?: string }, +): Promise { + const rules = getEnabledAutoReplyRules(accountId); + + // 分离普通规则和排除匹配规则 + const normalRules = rules.filter((r) => !r.exclude_match); + const excludeRules = rules.filter((r) => r.exclude_match); + + // 构建 AI 上下文,包含买家信息用于工具调用 + const aiContext: AIContext = { + userName: context?.userName || msg.senderName, + itemTitle: context?.itemTitle, + accountId, + buyerUserId: msg.senderId, + chatId: msg.chatId, + }; + + // 先检查普通规则 + for (const rule of normalRules) { + // AI 规则特殊处理 + if (rule.match_type === "ai") { + if (matchAITrigger(rule, msg.content)) { + const rulePrompt = rule.reply_content || undefined; + const aiReply = await generateAIReply( + msg.content, + aiContext, + rulePrompt, + ); + if (aiReply) { + logger.info(`[${accountId}] AI 回复: ${msg.content} -> ${aiReply}`); + return { + matched: true, + ruleName: rule.name, + replyContent: aiReply, + isAI: true, + }; + } + } + continue; + } + + // 普通规则匹配 + if (matchRule(rule, msg.content)) { + logger.info( + `[${accountId}] 消息匹配规则 "${rule.name}": ${msg.content} -> ${rule.reply_content}`, + ); + return { + matched: true, + ruleName: rule.name, + replyContent: rule.reply_content, + }; + } + } + + // 普通规则都没匹配,检查排除匹配规则 + for (const rule of excludeRules) { + // AI 类型的排除匹配规则 + if (rule.match_type === "ai") { + const rulePrompt = rule.reply_content || undefined; + const aiReply = await generateAIReply(msg.content, aiContext, rulePrompt); + if (aiReply) { + logger.info( + `[${accountId}] AI 排除匹配回复: ${msg.content} -> ${aiReply}`, + ); + return { + matched: true, + ruleName: rule.name, + replyContent: aiReply, + isAI: true, + }; + } + continue; + } + + // 普通排除匹配规则 + logger.info( + `[${accountId}] 排除匹配规则 "${rule.name}": ${msg.content} -> ${rule.reply_content}`, + ); + return { + matched: true, + ruleName: rule.name, + replyContent: rule.reply_content, + }; + } + + return { matched: false }; +} + +/** + * 检查是否触发 AI 回复 + */ +function matchAITrigger(rule: DbAutoReplyRule, content: string): boolean { + const pattern = rule.match_pattern.trim(); + + // 空模式表示匹配所有消息 + if (!pattern || pattern === "*") { + return true; + } + + // 支持关键词列表(逗号分隔) + const keywords = pattern + .split(",") + .map((k) => k.trim()) + .filter(Boolean); + if (keywords.length === 0) { + return true; + } + + const text = content.trim().toLowerCase(); + return keywords.some((kw) => text.includes(kw.toLowerCase())); +} + +/** + * 检查内容是否匹配规则 + */ +function matchRule(rule: DbAutoReplyRule, content: string): boolean { + const pattern = rule.match_pattern; + const text = content.trim(); + + switch (rule.match_type) { + case "exact": + return text === pattern; + case "contains": + return text.includes(pattern); + case "regex": + try { + const regex = new RegExp(pattern, "i"); + return regex.test(text); + } catch (e) { + logger.warn(`规则 "${rule.name}" 的正则表达式无效: ${pattern}`); + return false; + } + default: + return false; + } +} + +/** + * 获取匹配类型的显示名称 + */ +export function getMatchTypeName(type: string): string { + switch (type) { + case "exact": + return "精确匹配"; + case "contains": + return "包含关键词"; + case "regex": + return "正则表达式"; + case "ai": + return "AI 回复"; + default: + return type; + } +} diff --git a/goofish_backend/src/goofish/services/autosell.service.ts b/goofish_backend/src/goofish/services/autosell.service.ts new file mode 100644 index 0000000..57461e5 --- /dev/null +++ b/goofish_backend/src/goofish/services/autosell.service.ts @@ -0,0 +1,171 @@ +/** + * 自动发货服务 + */ + +import { createLogger } from "../core/logger"; +import { + getEnabledAutoSellRules, + getStockStats, + consumeStock, + addDeliveryLog, + hasDelivered, +} from "../db/index"; +import type { AutoSellRule, DeliveryResult, ApiConfig } from "../types/index"; + +const logger = createLogger("Svc:AutoSell"); + +/** + * 通过 API 获取发货内容 + */ +async function fetchFromApi( + config: ApiConfig, + context: Record, +): Promise { + let url = config.url; + let body = config.body; + + // 替换变量 + for (const [key, value] of Object.entries(context)) { + const placeholder = `{{${key}}}`; + url = url.replace(new RegExp(placeholder, "g"), value); + if (body) { + body = body.replace(new RegExp(placeholder, "g"), value); + } + } + + const headers: Record = { + "Content-Type": "application/json", + ...config.headers, + }; + + const response = await fetch(url, { + method: config.method, + headers, + body: config.method === "POST" ? body : undefined, + }); + + if (!response.ok) { + throw new Error(`API 请求失败: ${response.status} ${response.statusText}`); + } + + const data = await response.json(); + + // 从响应中提取内容 + if (config.responseField) { + const fields = config.responseField.split("."); + let result = data; + for (const field of fields) { + result = result?.[field]; + } + if (result === undefined) { + throw new Error(`响应中未找到字段: ${config.responseField}`); + } + return String(result); + } + + return typeof data === "string" ? data : JSON.stringify(data); +} + +/** + * 执行发货 + */ +async function executeDelivery( + rule: AutoSellRule, + orderId: string, + context: Record, +): Promise { + switch (rule.deliveryType) { + case "fixed": + if (!rule.deliveryContent) { + return { success: false, error: "未配置发货内容" }; + } + return { success: true, content: rule.deliveryContent }; + + case "stock": { + const stock = consumeStock(rule.id, orderId); + if (!stock) { + return { success: false, error: "库存不足" }; + } + return { success: true, content: stock.content }; + } + + case "api": { + if (!rule.apiConfig) { + return { success: false, error: "未配置 API" }; + } + try { + const content = await fetchFromApi(rule.apiConfig, context); + return { success: true, content }; + } catch (e: any) { + return { success: false, error: e.message }; + } + } + + default: + return { success: false, error: "未知发货类型" }; + } +} + +/** + * 处理订单自动发货 + */ +export async function processAutoSell( + accountId: string, + orderId: string, + itemId?: string, + triggerOn: "paid" | "confirmed" = "paid", +): Promise { + // 检查是否已发货 + if (hasDelivered(orderId)) { + logger.info(`订单 ${orderId} 已发货,跳过`); + return { success: false, error: "订单已发货" }; + } + + // 获取匹配的规则 + const rules = getEnabledAutoSellRules(accountId, itemId); + const matchedRule = rules.find((r) => r.triggerOn === triggerOn); + + if (!matchedRule) { + logger.debug(`订单 ${orderId} 无匹配的自动发货规则`); + return { success: false, error: "无匹配规则" }; + } + + // 检查库存类型的库存是否充足 + if (matchedRule.deliveryType === "stock") { + const stats = getStockStats(matchedRule.id); + if (stats.available <= 0) { + logger.warn(`规则 "${matchedRule.name}" 库存不足`); + return { success: false, error: "库存不足", ruleName: matchedRule.name }; + } + } + + // 执行发货 + const context = { orderId, accountId, itemId: itemId || "" }; + const result = await executeDelivery(matchedRule, orderId, context); + + // 记录发货日志 + addDeliveryLog({ + ruleId: matchedRule.id, + orderId, + accountId, + deliveryType: matchedRule.deliveryType, + content: result.content || "", + status: result.success ? "success" : "failed", + errorMessage: result.error, + }); + + if (result.success) { + logger.info(`订单 ${orderId} 自动发货成功: ${matchedRule.name}`); + } else { + logger.error(`订单 ${orderId} 自动发货失败: ${result.error}`); + } + + return { ...result, ruleName: matchedRule.name }; +} + +/** + * 获取规则的库存状态 + */ +export function getRuleStockStatus(ruleId: number) { + return getStockStats(ruleId); +} diff --git a/goofish_backend/src/goofish/services/conversation.service.ts b/goofish_backend/src/goofish/services/conversation.service.ts new file mode 100644 index 0000000..e20459a --- /dev/null +++ b/goofish_backend/src/goofish/services/conversation.service.ts @@ -0,0 +1,190 @@ +/** + * 对话服务 + * 处理对话相关的业务逻辑 + */ + +import { + getConversations, + getConversation, + upsertConversation, + updateConversationAvatar, + markConversationRead, + getConversationMessages, + getConversationMessageCount, + addConversationMessage, + getConversationCount, + getAccount, +} from "../db/index"; +import type { + ChatMessage, + Conversation, + ConversationMessage, +} from "../types/index"; + +/** + * 添加收到的消息 + */ +export function addIncomingMessage(accountId: string, msg: ChatMessage) { + const timestamp = Date.now(); + + // 先更新对话,不触发事件 + upsertConversation( + { + accountId, + chatId: msg.chatId, + userId: msg.senderId, + userName: msg.senderName, + lastMessage: msg.content, + lastTime: timestamp, + unread: 1, + }, + false, + ); + + // 添加消息,触发事件 + addConversationMessage({ + accountId, + chatId: msg.chatId, + senderId: msg.senderId, + senderName: msg.senderName, + content: msg.content, + msgTime: msg.msgTime, + msgId: msg.msgId, + direction: "in", + }); +} + +/** + * 添加发出的消息 + */ +export function addOutgoingMessage( + accountId: string, + chatId: string, + toUserId: string, + content: string, +) { + const timestamp = Date.now(); + const conv = getConversation(accountId, chatId); + if (!conv) return; + + const account = getAccount(accountId); + const senderName = account?.nickname || "我"; + + // 先更新对话,不触发事件 + upsertConversation( + { + accountId, + chatId, + userId: conv.user_id, + userName: conv.user_name, + lastMessage: content, + lastTime: timestamp, + unread: 0, + }, + false, + ); + + // 添加消息,触发事件 + addConversationMessage({ + accountId, + chatId, + senderId: accountId, + senderName, + content, + msgTime: new Date().toLocaleString("zh-CN", { hour12: false }), + direction: "out", + }); +} + +/** + * 更新用户头像 + */ +export function updateUserAvatar( + accountId: string, + chatId: string, + avatar: string, +) { + updateConversationAvatar(accountId, chatId, avatar); +} + +/** + * 获取所有对话列表 + */ +export function getAllConversations( + limit = 20, + offset = 0, +): { conversations: Conversation[]; total: number } { + const dbConvs = getConversations(limit, offset); + const total = getConversationCount(); + + const conversations = dbConvs.map((c) => { + const account = getAccount(c.account_id); + return { + accountId: c.account_id, + accountNickname: account?.nickname || c.account_id, + chatId: c.chat_id, + userId: c.user_id, + userName: c.user_name, + userAvatar: c.user_avatar || undefined, + lastMessage: c.last_message, + lastTime: c.last_time, + unread: c.unread, + messageCount: getConversationMessageCount(c.account_id, c.chat_id), + }; + }); + + return { conversations, total }; +} + +/** + * 获取单个对话详情 + */ +export function getConversationDetail( + accountId: string, + chatId: string, + messageLimit = 50, + beforeId?: number, +): Conversation | undefined { + const conv = getConversation(accountId, chatId); + if (!conv) return undefined; + + const account = getAccount(accountId); + const dbMsgs = getConversationMessages( + accountId, + chatId, + messageLimit, + beforeId, + ); + + const messages: ConversationMessage[] = dbMsgs.map((m) => ({ + id: m.id, + senderId: m.sender_id, + senderName: m.sender_name, + content: m.content, + msgTime: m.msg_time, + msgId: m.msg_id || undefined, + timestamp: m.created_at, + direction: m.direction, + })); + + return { + accountId: conv.account_id, + accountNickname: account?.nickname || conv.account_id, + chatId: conv.chat_id, + userId: conv.user_id, + userName: conv.user_name, + userAvatar: conv.user_avatar || undefined, + lastMessage: conv.last_message, + lastTime: conv.last_time, + unread: conv.unread, + messageCount: getConversationMessageCount(accountId, chatId), + messages, + }; +} + +/** + * 标记对话已读 + */ +export function markAsRead(accountId: string, chatId: string) { + markConversationRead(accountId, chatId); +} diff --git a/goofish_backend/src/goofish/services/goods.service.ts b/goofish_backend/src/goofish/services/goods.service.ts new file mode 100644 index 0000000..f194b32 --- /dev/null +++ b/goofish_backend/src/goofish/services/goods.service.ts @@ -0,0 +1,106 @@ +/** + * 商品服务 + */ + +import { API_ENDPOINTS, WS_CONFIG } from "../core/constants"; +import { CookiesManager } from "../core/cookies.manager"; +import { generateSign } from "../utils/crypto"; +import { createLogger } from "../core/logger"; +import type { GoodsItem, GoodsListResult } from "../types/index"; + +const logger = createLogger("Svc:Goods"); + +/** + * 获取商品列表 + */ +export async function fetchGoodsList( + accountId: string, + userId: string, + page = 1, + pageSize = 20, +): Promise { + try { + const cookiesStr = CookiesManager.getCookies(accountId); + if (!cookiesStr) { + logger.error(`[${accountId}] 无法获取 cookies`); + return { items: [], nextPage: false, totalCount: 0 }; + } + + const timestamp = Date.now().toString(); + const dataVal = JSON.stringify({ userId, pageNumber: page, pageSize }); + const h5Token = CookiesManager.getH5Token(accountId); + const sign = generateSign(timestamp, h5Token, dataVal); + + const params = new URLSearchParams({ + jsv: "2.7.2", + appKey: WS_CONFIG.SIGN_APP_KEY, + t: timestamp, + sign, + v: "1.0", + type: "originaljson", + accountSite: "xianyu", + dataType: "json", + timeout: "20000", + api: "mtop.idle.web.xyh.item.list", + }); + + const res = await fetch(`${API_ENDPOINTS.ITEM_LIST}?${params}`, { + method: "POST", + headers: { + accept: "application/json", + "content-type": "application/x-www-form-urlencoded", + origin: "https://www.goofish.com", + referer: "https://www.goofish.com/", + "user-agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", + cookie: cookiesStr, + }, + body: `data=${encodeURIComponent(dataVal)}`, + }); + + CookiesManager.handleResponseCookies(accountId, res); + + const resJson = await res.json(); + + if (resJson?.ret?.some((r: string) => r.includes("SUCCESS"))) { + const data = resJson.data || {}; + const cardList = data.cardList || []; + + const items: GoodsItem[] = cardList.map((card: any) => { + const cardData = card.cardData || {}; + const detailParams = cardData.detailParams || {}; + const picInfo = cardData.picInfo || {}; + const priceInfo = cardData.priceInfo || {}; + + return { + id: cardData.id || detailParams.itemId || "", + title: cardData.title || detailParams.title || "", + price: priceInfo.price || detailParams.soldPrice || "", + picUrl: picInfo.picUrl || detailParams.picUrl || "", + picWidth: picInfo.width || parseInt(detailParams.picWidth) || 0, + picHeight: picInfo.height || parseInt(detailParams.picHeight) || 0, + categoryId: cardData.categoryId || 0, + itemStatus: cardData.itemStatus ?? 0, + hasVideo: picInfo.hasVideo || false, + soldPrice: detailParams.soldPrice, + postInfo: detailParams.postInfo, + }; + }); + + logger.info(`[${accountId}] 获取商品列表成功,共 ${items.length} 件商品`); + return { + items, + nextPage: data.nextPage || false, + totalCount: data.totalCount || items.length, + }; + } + + logger.warn( + `[${accountId}] 获取商品列表失败: ${JSON.stringify(resJson?.ret)}`, + ); + return { items: [], nextPage: false, totalCount: 0 }; + } catch (e) { + logger.error(`[${accountId}] 获取商品列表异常: ${e}`); + return { items: [], nextPage: false, totalCount: 0 }; + } +} diff --git a/goofish_backend/src/goofish/services/index.ts b/goofish_backend/src/goofish/services/index.ts new file mode 100644 index 0000000..86e012f --- /dev/null +++ b/goofish_backend/src/goofish/services/index.ts @@ -0,0 +1,55 @@ +/** + * 服务层统一导出 + */ + +// 自动回复服务 +export { checkAutoReply, getMatchTypeName } from "./autoreply.service"; + +// 对话服务 +export { + addIncomingMessage, + addOutgoingMessage, + updateUserAvatar, + getAllConversations, + getConversationDetail, + markAsRead, +} from "./conversation.service"; + +// 消息服务 +export { + addMessage, + getRecentMessages, + getAllMessages, + getMessageCount, + clearMessages, +} from "./message.service"; + +// 商品服务 +export { fetchGoodsList } from "./goods.service"; + +// 用户服务 +export { + getCachedUserHead, + isUserHeadCached, + fetchUserHead, + fetchLoginUserId, + fetchUserProfile, + fetchUserInfo, +} from "./user.service"; + +// 订单服务 +export { + getOrderList, + getOrder, + handleOrderMessage, + fetchAndUpdateOrderDetail, +} from "./order.service"; + +// AI 服务 +export { generateAIReply, testAIConnection } from "./ai.service"; + +// 自动发货服务 +export { processAutoSell, getRuleStockStatus } from "./autosell.service"; + +// 流程执行服务 +export { startWorkflowExecution, handleUserReply } from "./workflow.service"; diff --git a/goofish_backend/src/goofish/services/message.service.ts b/goofish_backend/src/goofish/services/message.service.ts new file mode 100644 index 0000000..e21b894 --- /dev/null +++ b/goofish_backend/src/goofish/services/message.service.ts @@ -0,0 +1,51 @@ +/** + * 消息服务 + * 处理消息存储和查询 + */ + +import type { StoredMessage, ChatMessage } from "../types/index"; + +const MAX_MESSAGES = 100; + +// 内存消息存储 +const messages: StoredMessage[] = []; + +/** + * 添加消息 + */ +export function addMessage(msg: ChatMessage) { + const stored: StoredMessage = { ...msg, timestamp: Date.now() }; + messages.push(stored); + + if (messages.length > MAX_MESSAGES) { + messages.splice(0, messages.length - MAX_MESSAGES); + } +} + +/** + * 获取最近消息 + */ +export function getRecentMessages(limit = 20): StoredMessage[] { + return messages.slice(-limit); +} + +/** + * 获取所有消息 + */ +export function getAllMessages(): StoredMessage[] { + return [...messages]; +} + +/** + * 获取消息数量 + */ +export function getMessageCount(): number { + return messages.length; +} + +/** + * 清空消息 + */ +export function clearMessages() { + messages.length = 0; +} diff --git a/goofish_backend/src/goofish/services/order.service.ts b/goofish_backend/src/goofish/services/order.service.ts new file mode 100644 index 0000000..e228e9c --- /dev/null +++ b/goofish_backend/src/goofish/services/order.service.ts @@ -0,0 +1,218 @@ +/** + * 订单服务 + * 简化版:订单ID唯一,通过API获取订单详情 + */ + +import { createLogger } from "../core/logger"; +import { + getOrders, + getOrderCount, + getOrderById, + upsertOrder, + updateOrderStatus, + getEnabledAutoSellRules, +} from "../db/index"; +import { OrderStatus, ORDER_STATUS_TEXT } from "../types/order.types"; +import { startWorkflowExecution } from "./workflow.service"; +import type { + OrderRecord, + OrderListParams, + OrderDetailData, +} from "../types/order.types"; +import type { GoofishClient } from "../websocket/client"; + +const logger = createLogger("Svc:Order"); + +// 获取订单列表 +export function getOrderList(params: OrderListParams) { + const orders = getOrders(params); + const total = getOrderCount(params); + return { + orders, + total, + limit: params.limit || 50, + offset: params.offset || 0, + }; +} + +// 获取单个订单 +export function getOrder(orderId: string): OrderRecord | null { + return getOrderById(orderId); +} + +// 处理订单消息:仅记录订单ID,详情通过API获取 +export function handleOrderMessage( + accountId: string, + orderId: string, + chatId?: string, +): void { + logger.info(`收到订单消息: ${orderId}`); + + // 检查订单是否已存在 + const existing = getOrderById(orderId); + if (!existing) { + // 创建订单占位记录 + upsertOrder({ + orderId, + accountId, + status: 0, + statusText: "获取中...", + chatId, + }); + logger.info(`新订单记录已创建: ${orderId}`); + } else if (chatId && !existing.chatId) { + // 更新 chatId + upsertOrder({ + ...existing, + chatId, + }); + } +} + +// 通过 API 获取订单详情并更新数据库 +export async function fetchAndUpdateOrderDetail( + client: GoofishClient, + orderId: string, +): Promise { + try { + const detail = await client.fetchOrderDetail(orderId); + if (!detail?.data) { + logger.warn(`订单详情响应为空: ${orderId}`); + return null; + } + + const data = detail.data; + + // 解析订单信息 + const orderInfoVO = data.components?.find( + (c: any) => c.render === "orderInfoVO", + )?.data; + const itemInfo = orderInfoVO?.itemInfo; + const orderInfoList = orderInfoVO?.orderInfoList || []; + + // 提取字段 + const buyerNickname = orderInfoList.find( + (i: any) => i.title === "买家昵称", + )?.value; + const orderTime = orderInfoList.find( + (i: any) => i.title === "下单时间", + )?.value; + const payTime = orderInfoList.find( + (i: any) => i.title === "付款时间", + )?.value; + const shipTime = orderInfoList.find( + (i: any) => i.title === "发货时间", + )?.value; + const completeTime = orderInfoList.find( + (i: any) => i.title === "成交时间", + )?.value; + + const itemIdStr = data.itemId ? String(data.itemId) : undefined; + const buyerUserIdStr = data.peerUserId + ? String(data.peerUserId) + : undefined; + const status = data.status; + const statusText = + data.utArgs?.orderMainTitle || ORDER_STATUS_TEXT[status] || "未知状态"; + + const itemTitle = itemInfo?.title; + const itemPicUrl = itemInfo?.itemMainPictCdnUrl; + const price = itemInfo?.price || orderInfoVO?.priceInfo?.amount?.value; + + logger.info(`订单详情: ${orderId}, 状态=${statusText}, 商品=${itemTitle}`); + + // 获取旧订单状态 + const oldOrder = getOrderById(orderId); + const oldStatus = oldOrder?.status; + + upsertOrder({ + orderId, + accountId: client.accountId, + itemId: itemIdStr, + itemTitle, + itemPicUrl, + price, + buyerUserId: buyerUserIdStr, + buyerNickname, + status, + statusText, + orderTime, + payTime, + shipTime, + completeTime, + }); + + // 检查是否需要触发自动发货 + if ( + status === OrderStatus.PENDING_SHIPMENT && + oldStatus !== OrderStatus.PENDING_SHIPMENT + ) { + // 订单变为待发货状态,触发自动发货 + await triggerAutoSell(client, orderId, itemIdStr, buyerUserIdStr, "paid"); + } else if ( + status === OrderStatus.PENDING_RECEIPT && + oldStatus !== OrderStatus.PENDING_RECEIPT + ) { + // 订单变为待收货状态,触发确认收货后的自动发货 + await triggerAutoSell( + client, + orderId, + itemIdStr, + buyerUserIdStr, + "confirmed", + ); + } + + return data; + } catch (e) { + logger.error(`获取订单详情失败: ${orderId} - ${e}`); + return null; + } +} + +/** + * 触发自动发货(通过流程引擎) + */ +async function triggerAutoSell( + client: GoofishClient, + orderId: string, + itemId: string | undefined, + buyerUserId: string | undefined, + triggerOn: "paid" | "confirmed", +): Promise { + try { + // 获取匹配的规则 + const rules = getEnabledAutoSellRules(client.accountId, itemId); + const matchedRule = rules.find((r) => r.triggerOn === triggerOn); + + if (!matchedRule) { + logger.debug(`订单 ${orderId} 无匹配的自动发货规则`); + return; + } + + // 从订单记录获取 chatId + const order = getOrderById(orderId); + const chatId = order?.chatId || undefined; + + // 启动流程执行 + const result = await startWorkflowExecution(matchedRule.workflowId, { + orderId, + accountId: client.accountId, + itemId, + ruleId: matchedRule.id, + client, + buyerUserId, + chatId, + }); + + if (!result.success) { + if (result.error !== "流程已在执行中") { + logger.warn(`自动发货流程启动失败: ${orderId} - ${result.error}`); + } + } else { + logger.info(`自动发货流程已启动: ${orderId}, 规则: ${matchedRule.name}`); + } + } catch (e) { + logger.error(`触发自动发货异常: ${orderId} - ${e}`); + } +} diff --git a/goofish_backend/src/goofish/services/user.service.ts b/goofish_backend/src/goofish/services/user.service.ts new file mode 100644 index 0000000..6d2b85f --- /dev/null +++ b/goofish_backend/src/goofish/services/user.service.ts @@ -0,0 +1,292 @@ +/** + * 用户服务 + */ + +import { API_ENDPOINTS, WS_CONFIG } from "../core/constants"; +import { CookiesManager } from "../core/cookies.manager"; +import { generateSign } from "../utils/crypto"; +import { createLogger } from "../core/logger"; +import { getUserAvatar, saveUserAvatar, hasUserAvatar } from "../db/index"; +import type { UserHeadInfo, AccountUserInfo } from "../types/index"; + +const logger = createLogger("Svc:User"); + +/** + * 从缓存获取用户头像 + */ +export function getCachedUserHead(userId: string): UserHeadInfo | null { + const cached = getUserAvatar(userId); + if (cached) { + return { + userId: cached.user_id, + displayName: cached.display_name || "", + avatar: cached.avatar, + ipLocation: cached.ip_location || undefined, + introduction: cached.introduction || undefined, + }; + } + return null; +} + +/** + * 检查用户头像是否已缓存 + */ +export function isUserHeadCached(userId: string): boolean { + return hasUserAvatar(userId); +} + +/** + * 获取用户头像信息 + */ +export async function fetchUserHead( + accountId: string, + userId: string, + skipCache = false, +): Promise<{ userHead: UserHeadInfo | null; fromCache?: boolean }> { + if (!skipCache) { + const cached = getCachedUserHead(userId); + if (cached) { + logger.debug(`用户 ${userId} 头像已缓存,跳过 API 请求`); + return { userHead: cached, fromCache: true }; + } + } + + try { + const cookiesStr = CookiesManager.getCookies(accountId); + if (!cookiesStr) { + logger.error(`[${accountId}] 无法获取 cookies`); + return { userHead: null, fromCache: false }; + } + + const timestamp = Date.now().toString(); + const dataVal = JSON.stringify({ self: false, userId }); + const h5Token = CookiesManager.getH5Token(accountId); + const sign = generateSign(timestamp, h5Token, dataVal); + + const params = new URLSearchParams({ + jsv: "2.7.2", + appKey: WS_CONFIG.SIGN_APP_KEY, + t: timestamp, + sign, + v: "1.0", + type: "originaljson", + accountSite: "xianyu", + dataType: "json", + timeout: "20000", + api: "mtop.idle.web.user.page.head", + sessionOption: "AutoLoginOnly", + }); + + const res = await fetch(`${API_ENDPOINTS.USER_HEAD}?${params}`, { + method: "POST", + headers: { + accept: "application/json", + "content-type": "application/x-www-form-urlencoded", + origin: "https://www.goofish.com", + referer: "https://www.goofish.com/", + "user-agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", + cookie: cookiesStr, + }, + body: `data=${encodeURIComponent(dataVal)}`, + }); + + CookiesManager.handleResponseCookies(accountId, res); + + const json = await res.json(); + logger.debug(`用户头像响应: ${JSON.stringify(json?.ret)}`); + + if ( + json?.ret?.some((r: string) => r.includes("SUCCESS")) && + json?.data?.module?.base + ) { + const base = json.data.module.base; + const avatar = base.avatar?.avatar || ""; + logger.info(`获取用户 ${userId} 头像成功: ${avatar.substring(0, 50)}...`); + + const userHead: UserHeadInfo = { + userId, + displayName: base.displayName || "", + avatar, + ipLocation: base.ipLocation, + introduction: base.introduction, + }; + + saveUserAvatar({ + userId, + displayName: userHead.displayName, + avatar: userHead.avatar, + ipLocation: userHead.ipLocation, + introduction: userHead.introduction, + }); + + return { userHead, fromCache: false }; + } + + logger.warn(`获取用户 ${userId} 头像失败: ${JSON.stringify(json?.ret)}`); + return { userHead: null, fromCache: false }; + } catch (e) { + logger.error(`获取用户头像异常: ${e}`); + return { userHead: null, fromCache: false }; + } +} + +/** + * 获取登录用户ID + */ +export async function fetchLoginUserId( + accountId: string, +): Promise { + try { + const cookiesStr = CookiesManager.getCookies(accountId); + if (!cookiesStr) { + logger.error(`[${accountId}] 无法获取 cookies`); + return null; + } + + const timestamp = Date.now().toString(); + const dataVal = JSON.stringify({}); + const h5Token = CookiesManager.getH5Token(accountId); + const sign = generateSign(timestamp, h5Token, dataVal); + + const params = new URLSearchParams({ + jsv: "2.7.2", + appKey: WS_CONFIG.SIGN_APP_KEY, + t: timestamp, + sign, + v: "1.0", + type: "originaljson", + accountSite: "xianyu", + dataType: "json", + timeout: "20000", + api: "mtop.taobao.idlemessage.pc.loginuser.get", + }); + + const res = await fetch(`${API_ENDPOINTS.LOGIN_USER}?${params}`, { + method: "POST", + headers: { + accept: "application/json", + "content-type": "application/x-www-form-urlencoded", + origin: "https://www.goofish.com", + referer: "https://www.goofish.com/", + "user-agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", + cookie: cookiesStr, + }, + body: `data=${encodeURIComponent(dataVal)}`, + }); + + CookiesManager.handleResponseCookies(accountId, res); + + const resJson = await res.json(); + + if ( + resJson?.ret?.some((r: string) => r.includes("SUCCESS")) && + resJson?.data?.userId + ) { + const userId = String(resJson.data.userId); + logger.info(`[${accountId}] 获取用户ID成功: ${userId}`); + return userId; + } + + logger.warn( + `[${accountId}] 获取用户ID失败: ${JSON.stringify(resJson?.ret)}`, + ); + return null; + } catch (e) { + logger.error(`[${accountId}] 获取用户ID异常: ${e}`); + return null; + } +} + +/** + * 获取用户详细信息 + */ +export async function fetchUserProfile( + accountId: string, +): Promise | null> { + try { + const cookiesStr = CookiesManager.getCookies(accountId); + if (!cookiesStr) { + logger.error(`[${accountId}] 无法获取 cookies`); + return null; + } + + const timestamp = Date.now().toString(); + const dataVal = JSON.stringify({}); + const h5Token = CookiesManager.getH5Token(accountId); + const sign = generateSign(timestamp, h5Token, dataVal); + + const params = new URLSearchParams({ + jsv: "2.7.2", + appKey: WS_CONFIG.SIGN_APP_KEY, + t: timestamp, + sign, + v: "1.0", + type: "originaljson", + accountSite: "xianyu", + dataType: "json", + timeout: "20000", + api: "mtop.idle.web.user.page.nav", + }); + + const res = await fetch(`${API_ENDPOINTS.USER_INFO}?${params}`, { + method: "POST", + headers: { + accept: "application/json", + "content-type": "application/x-www-form-urlencoded", + origin: "https://www.goofish.com", + referer: "https://www.goofish.com/", + "user-agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", + cookie: cookiesStr, + }, + body: `data=${encodeURIComponent(dataVal)}`, + }); + + CookiesManager.handleResponseCookies(accountId, res); + + const resJson = await res.json(); + + if (resJson?.ret?.some((r: string) => r.includes("SUCCESS"))) { + const base = resJson?.data?.module?.base; + if (base) { + logger.info(`[${accountId}] 获取用户信息成功: ${base.displayName}`); + return { + displayName: base.displayName || "", + avatar: base.avatar || "", + soldCount: base.soldCount, + followers: base.followers, + following: base.following, + }; + } + } + + logger.warn( + `[${accountId}] 获取用户信息失败: ${JSON.stringify(resJson?.ret)}`, + ); + return null; + } catch (e) { + logger.error(`[${accountId}] 获取用户信息异常: ${e}`); + return null; + } +} + +/** + * 获取完整用户信息 + */ +export async function fetchUserInfo( + accountId: string, +): Promise { + const userId = await fetchLoginUserId(accountId); + if (!userId) { + return null; + } + + const profile = await fetchUserProfile(accountId); + if (!profile) { + return { userId, displayName: "", avatar: "" }; + } + + return { userId, ...profile }; +} diff --git a/goofish_backend/src/goofish/services/workflow.service.ts b/goofish_backend/src/goofish/services/workflow.service.ts new file mode 100644 index 0000000..b7665b5 --- /dev/null +++ b/goofish_backend/src/goofish/services/workflow.service.ts @@ -0,0 +1,524 @@ +/** + * 流程执行引擎 + * 负责执行发货流程,支持自动回复节点等待用户确认 + */ + +import { createLogger } from "../core/logger"; +import { + getWorkflowById, + getDefaultWorkflow, + createWorkflowExecution, + getWorkflowExecution, + getWorkflowExecutionByOrderId, + getWaitingExecutions, + updateWorkflowExecution, + getAutoSellRule, +} from "../db/index"; +import { processAutoSell } from "./autosell.service"; +import type { + Workflow, + WorkflowDefinition, + WorkflowNode, + WorkflowExecution, + WorkflowNodeType, +} from "../types/workflow.types"; +import type { GoofishClient } from "../websocket/client"; + +const logger = createLogger("Svc:Workflow"); + +interface ExecutionContext { + orderId: string; + accountId: string; + itemId?: string; + ruleId: number; + client: GoofishClient; + buyerUserId?: string; + chatId?: string; +} + +/** + * 启动流程执行 + */ +export async function startWorkflowExecution( + workflowId: number | null, + context: ExecutionContext, +): Promise<{ success: boolean; error?: string }> { + // 获取流程定义 + let workflow: Workflow | null; + if (workflowId) { + workflow = getWorkflowById(workflowId); + } else { + workflow = getDefaultWorkflow(); + } + + if (!workflow) { + // 没有流程定义,使用默认逻辑直接发货 + return executeDefaultFlow(context); + } + + // 检查是否已有执行中的流程 + const existing = getWorkflowExecutionByOrderId(context.orderId); + if (existing) { + logger.info(`订单 ${context.orderId} 已有执行中的流程`); + return { success: false, error: "流程已在执行中" }; + } + + // 找到触发节点 + const triggerNode = workflow.definition.nodes.find( + (n) => n.type === "trigger", + ); + if (!triggerNode) { + logger.error(`流程 ${workflow.id} 没有触发节点`); + return { success: false, error: "流程配置错误:缺少触发节点" }; + } + + // 创建执行记录 + const executionId = createWorkflowExecution({ + workflowId: workflow.id, + orderId: context.orderId, + accountId: context.accountId, + ruleId: context.ruleId, + currentNodeId: triggerNode.id, + context: { + itemId: context.itemId, + buyerUserId: context.buyerUserId, + chatId: context.chatId, + }, + }); + + logger.info(`创建流程执行: ${executionId}, 订单: ${context.orderId}`); + + // 开始执行流程 + return executeFromNode( + executionId, + workflow.definition, + triggerNode.id, + context, + ); +} + +/** + * 从指定节点开始执行流程 + */ +async function executeFromNode( + executionId: number, + definition: WorkflowDefinition, + nodeId: string, + context: ExecutionContext, +): Promise<{ success: boolean; error?: string }> { + const node = definition.nodes.find((n) => n.id === nodeId); + if (!node) { + updateWorkflowExecution(executionId, { status: "failed" }); + return { success: false, error: `节点不存在: ${nodeId}` }; + } + + updateWorkflowExecution(executionId, { + status: "running", + currentNodeId: nodeId, + }); + + // 执行当前节点 + const result = await executeNode(executionId, node, context); + + if (!result.success) { + updateWorkflowExecution(executionId, { status: "failed" }); + return result; + } + + // 如果节点需要等待(如自动回复节点) + if (result.waiting) { + updateWorkflowExecution(executionId, { + status: "waiting", + waitingForReply: true, + expectedKeywords: result.expectedKeywords || null, + }); + return { success: true }; + } + + // 找到下一个节点 + const nextNodeId = findNextNode(definition, nodeId, result.output); + if (!nextNodeId) { + // 流程结束 + updateWorkflowExecution(executionId, { status: "completed" }); + logger.info(`流程执行完成: ${executionId}`); + return { success: true }; + } + + // 继续执行下一个节点 + return executeFromNode(executionId, definition, nextNodeId, context); +} + +/** + * 执行单个节点 + */ +async function executeNode( + executionId: number, + node: WorkflowNode, + context: ExecutionContext, +): Promise<{ + success: boolean; + error?: string; + waiting?: boolean; + expectedKeywords?: string[]; + output?: string; +}> { + logger.debug(`执行节点: ${node.id} (${node.type})`); + + switch (node.type) { + case "trigger": + // 触发节点,直接通过 + return { success: true, output: "output_1" }; + + case "delivery": + // 发货节点 - 发送发货内容 + return executeDeliveryNode(node, context); + + case "ship": + // 标记发货节点 - 调用平台 API + return executeShipNode(node, context); + + case "autoreply": + // 自动回复节点,需要等待用户确认 + return executeAutoReplyNode(node, context); + + case "delay": + // 延迟节点 + return executeDelayNode(node); + + case "condition": + // 条件节点 + return executeConditionNode(node, context); + + case "notify": + // 通知节点 - 发送消息给买家 + return executeNotifyNode(node, context); + + default: + return { success: false, error: `未知节点类型: ${node.type}` }; + } +} + +/** + * 执行发货节点 - 发送发货内容给买家 + */ +async function executeDeliveryNode( + node: WorkflowNode, + context: ExecutionContext, +): Promise<{ success: boolean; error?: string; output?: string }> { + const rule = getAutoSellRule(context.ruleId); + if (!rule) { + return { success: false, error: "发货规则不存在" }; + } + + // 调用自动发货服务获取发货内容 + const result = await processAutoSell( + context.accountId, + context.orderId, + context.itemId, + rule.triggerOn, + ); + + if (!result.success) { + return { success: false, error: result.error }; + } + + // 发送发货内容给买家 + if (result.content && context.chatId && context.buyerUserId) { + const sendResult = await context.client.sendMessage( + context.chatId, + context.buyerUserId, + result.content, + ); + if (!sendResult) { + return { success: false, error: "发送发货消息失败" }; + } + logger.info(`发货消息已发送: ${context.orderId}`); + } else if (result.content && !context.chatId) { + logger.warn(`发货节点缺少 chatId,无法发送消息: ${context.orderId}`); + } + + return { success: true, output: "output_1" }; +} + +/** + * 执行标记发货节点 - 调用平台 API 标记发货 + */ +async function executeShipNode( + node: WorkflowNode, + context: ExecutionContext, +): Promise<{ success: boolean; error?: string; output?: string }> { + // 获取发货方式,默认虚拟发货 + const deliveryMode = node.config.deliveryMode || "virtual"; + + let shipResult: { success: boolean; error?: string }; + + if (deliveryMode === "freeshipping") { + // 免拼发货需要 itemId 和 buyerId + if (!context.itemId || !context.buyerUserId) { + logger.warn( + `免拼发货缺少参数: itemId=${context.itemId}, buyerUserId=${context.buyerUserId}`, + ); + // 降级为虚拟发货 + shipResult = await context.client.confirmShipment(context.orderId); + logger.info(`订单降级为虚拟发货: ${context.orderId}`); + } else { + shipResult = await context.client.freeShipping( + context.orderId, + context.itemId, + context.buyerUserId, + ); + logger.info(`订单免拼发货: ${context.orderId}`); + } + } else { + // 虚拟发货(确认发货) + shipResult = await context.client.confirmShipment(context.orderId); + logger.info(`订单虚拟发货: ${context.orderId}`); + } + + if (!shipResult.success) { + return { success: false, error: shipResult.error || "标记发货失败" }; + } + + return { success: true, output: "output_1" }; +} + +/** + * 执行自动回复节点(等待用户确认) + */ +async function executeAutoReplyNode( + node: WorkflowNode, + context: ExecutionContext, +): Promise<{ + success: boolean; + error?: string; + waiting?: boolean; + expectedKeywords?: string[]; +}> { + // 发送提示消息 + const promptMessage = node.config.promptMessage; + if (promptMessage) { + if (!context.chatId || !context.buyerUserId) { + logger.warn( + `等待回复节点缺少 chatId 或 buyerUserId,无法发送提示消息: ${context.orderId}`, + ); + } else { + await context.client.sendMessage( + context.chatId, + context.buyerUserId, + promptMessage, + ); + logger.info(`已发送提示消息: ${context.orderId}`); + } + } + + // 获取关键词配置 + const keywords = node.config.keywords || + node.config.expectedKeywords || ["确认", "同意", "好的", "ok"]; + + logger.info( + `等待用户确认: ${context.orderId}, 关键词: ${keywords.join(",")}`, + ); + + return { + success: true, + waiting: true, + expectedKeywords: keywords, + }; +} + +/** + * 执行延迟节点 + */ +async function executeDelayNode( + node: WorkflowNode, +): Promise<{ success: boolean; output?: string }> { + let delayMs: number; + + if (node.config.delayMode === "random") { + // 浮动时间模式 + const minMs = node.config.delayMinMs || 0; + const maxMs = node.config.delayMaxMs || 10000; + delayMs = Math.floor(Math.random() * (maxMs - minMs + 1)) + minMs; + logger.debug( + `延迟节点: 浮动模式, 范围 ${minMs}-${maxMs}ms, 实际 ${delayMs}ms`, + ); + } else { + // 固定时间模式 + delayMs = node.config.delayMs || (node.config.delaySeconds || 0) * 1000; + logger.debug(`延迟节点: 固定模式, ${delayMs}ms`); + } + + if (delayMs > 0) { + await new Promise((resolve) => setTimeout(resolve, delayMs)); + } + + return { success: true, output: "output_1" }; +} + +/** + * 执行条件节点 + */ +async function executeConditionNode( + node: WorkflowNode, + context: ExecutionContext, +): Promise<{ success: boolean; output?: string }> { + // TODO: 实现条件判断逻辑 + // 目前默认走 output_1 + return { success: true, output: "output_1" }; +} + +/** + * 执行通知节点 - 发送消息给买家 + */ +async function executeNotifyNode( + node: WorkflowNode, + context: ExecutionContext, +): Promise<{ success: boolean; error?: string; output?: string }> { + const message = node.config.message; + if (!message) { + logger.warn(`通知节点没有配置消息内容: ${node.id}`); + return { success: true, output: "output_1" }; + } + + if (!context.chatId || !context.buyerUserId) { + logger.warn(`通知节点缺少 chatId 或 buyerUserId: ${context.orderId}`); + return { success: true, output: "output_1" }; + } + + const sendResult = await context.client.sendMessage( + context.chatId, + context.buyerUserId, + message, + ); + + if (!sendResult) { + return { success: false, error: "发送通知消息失败" }; + } + + logger.info(`通知消息已发送: ${context.orderId}`); + return { success: true, output: "output_1" }; +} + +/** + * 找到下一个节点 + */ +function findNextNode( + definition: WorkflowDefinition, + currentNodeId: string, + outputKey?: string, +): string | null { + const output = outputKey || "output_1"; + const connection = definition.connections.find( + (c) => c.fromNode === currentNodeId && c.fromOutput === output, + ); + return connection?.toNode || null; +} + +/** + * 执行默认流程(无自定义流程时) + */ +async function executeDefaultFlow( + context: ExecutionContext, +): Promise<{ success: boolean; error?: string }> { + // 直接调用自动发货 + const rule = getAutoSellRule(context.ruleId); + if (!rule) { + return { success: false, error: "发货规则不存在" }; + } + + const result = await processAutoSell( + context.accountId, + context.orderId, + context.itemId, + rule.triggerOn, + ); + + if (!result.success) { + return { success: false, error: result.error }; + } + + // 发送消息 + if (result.content && context.chatId && context.buyerUserId) { + await context.client.sendMessage( + context.chatId, + context.buyerUserId, + result.content, + ); + } else if (result.content && !context.chatId) { + logger.warn(`默认流程缺少 chatId,无法发送消息: ${context.orderId}`); + } + + // 标记发货(仅待发货触发时) + if (rule.triggerOn === "paid") { + await context.client.confirmShipment(context.orderId); + } + + return { success: true }; +} + +/** + * 处理用户回复,继续执行等待中的流程 + */ +export async function handleUserReply( + accountId: string, + chatId: string, + buyerUserId: string, + message: string, + client: GoofishClient, +): Promise { + // 获取该账号等待中的流程执行 + const waitingExecutions = getWaitingExecutions(accountId); + + for (const execution of waitingExecutions) { + const keywords = execution.expectedKeywords || []; + const matched = keywords.some((kw) => + message.toLowerCase().includes(kw.toLowerCase()), + ); + + if (matched) { + logger.info(`用户回复匹配,继续执行流程: ${execution.id}`); + + // 获取流程定义 + const workflow = getWorkflowById(execution.workflowId); + if (!workflow) continue; + + // 更新状态 + updateWorkflowExecution(execution.id, { + waitingForReply: false, + expectedKeywords: null, + }); + + // 找到下一个节点并继续执行 + const nextNodeId = findNextNode( + workflow.definition, + execution.currentNodeId!, + "output_1", + ); + + if (nextNodeId) { + const context: ExecutionContext = { + orderId: execution.orderId, + accountId: execution.accountId, + ruleId: execution.ruleId, + client, + chatId, + buyerUserId, + itemId: execution.context?.itemId, + }; + + await executeFromNode( + execution.id, + workflow.definition, + nextNodeId, + context, + ); + } else { + updateWorkflowExecution(execution.id, { status: "completed" }); + } + + return true; + } + } + + return false; +} diff --git a/goofish_backend/src/goofish/types/account.types.ts b/goofish_backend/src/goofish/types/account.types.ts new file mode 100644 index 0000000..dd6c805 --- /dev/null +++ b/goofish_backend/src/goofish/types/account.types.ts @@ -0,0 +1,55 @@ +/** + * 账号相关类型定义 + */ + +import type { Timestamped } from "./common.types"; + +// 账号信息 +export interface Account extends Timestamped { + id: string; + cookies: string; + userId?: string; + nickname?: string; + avatar?: string; + enabled: boolean; + remark?: string; +} + +// 账号状态 +export interface AccountStatus { + accountId: string; + connected: boolean; + lastHeartbeat?: string; + lastTokenRefresh?: string; + errorMessage?: string; +} + +// 账号用户信息 +export interface AccountUserInfo { + userId: string; + displayName: string; + avatar: string; + soldCount?: number; + followers?: string; + following?: string; +} + +// 创建/更新账号参数 +export interface UpsertAccountParams { + id: string; + cookies: string; + userId?: string; + nickname?: string; + avatar?: string; + enabled?: boolean; + remark?: string; +} + +// 更新账号状态参数 +export interface UpdateAccountStatusParams { + accountId: string; + connected?: boolean; + lastHeartbeat?: string; + lastTokenRefresh?: string; + errorMessage?: string; +} diff --git a/goofish_backend/src/goofish/types/autoreply.types.ts b/goofish_backend/src/goofish/types/autoreply.types.ts new file mode 100644 index 0000000..221757e --- /dev/null +++ b/goofish_backend/src/goofish/types/autoreply.types.ts @@ -0,0 +1,68 @@ +/** + * 自动回复相关类型定义 + */ + +// 匹配类型 +export type MatchType = "exact" | "contains" | "regex" | "ai"; + +// 自动回复规则 +export interface AutoReplyRule { + id: number; + name: string; + enabled: boolean; + priority: number; + matchType: MatchType; + matchPattern: string; + replyContent: string; + accountId: string | null; + excludeMatch: boolean; // 排除匹配:匹配其他规则未匹配的内容 + createdAt?: string; + updatedAt?: string; +} + +// 数据库自动回复规则 +export interface DbAutoReplyRule { + id: number; + name: string; + enabled: number; + priority: number; + match_type: MatchType; + match_pattern: string; + reply_content: string; + account_id: string | null; + exclude_match: number; // 0 或 1 + created_at: string; + updated_at: string; +} + +// 创建规则参数 +export interface CreateAutoReplyRuleParams { + name: string; + enabled?: boolean; + priority?: number; + matchType: MatchType; + matchPattern: string; + replyContent: string; + accountId?: string | null; + excludeMatch?: boolean; +} + +// 更新规则参数 +export interface UpdateAutoReplyRuleParams { + name?: string; + enabled?: boolean; + priority?: number; + matchType?: MatchType; + matchPattern?: string; + replyContent?: string; + accountId?: string | null; + excludeMatch?: boolean; +} + +// 自动回复结果 +export interface AutoReplyResult { + matched: boolean; + ruleName?: string; + replyContent?: string; + isAI?: boolean; +} diff --git a/goofish_backend/src/goofish/types/autosell.types.ts b/goofish_backend/src/goofish/types/autosell.types.ts new file mode 100644 index 0000000..4b96854 --- /dev/null +++ b/goofish_backend/src/goofish/types/autosell.types.ts @@ -0,0 +1,132 @@ +/** + * 自动发货相关类型定义 + */ + +// 发货类型 +export type DeliveryType = "fixed" | "stock" | "api"; + +// 触发时机 +export type TriggerOn = "paid" | "confirmed"; + +// API 配置 +export interface ApiConfig { + url: string; + method: "GET" | "POST"; + headers?: Record; + body?: string; + responseField?: string; // 响应中取货字段路径 +} + +// 自动发货规则 +export interface AutoSellRule { + id: number; + name: string; + enabled: boolean; + itemId: string | null; + accountId: string | null; + deliveryType: DeliveryType; + deliveryContent: string | null; + apiConfig: ApiConfig | null; + triggerOn: TriggerOn; + workflowId: number | null; + stockCount?: number; // 库存数量(仅stock类型) + usedCount?: number; // 已用数量 + createdAt?: string; + updatedAt?: string; +} + +// 数据库自动发货规则 +export interface DbAutoSellRule { + id: number; + name: string; + enabled: number; + item_id: string | null; + account_id: string | null; + delivery_type: DeliveryType; + delivery_content: string | null; + api_config: string | null; + trigger_on: TriggerOn; + created_at: string; + updated_at: string; +} + +// 库存项 +export interface StockItem { + id: number; + ruleId: number; + content: string; + used: boolean; + usedOrderId: string | null; + createdAt: string; + usedAt: string | null; +} + +// 数据库库存项 +export interface DbStockItem { + id: number; + rule_id: number; + content: string; + used: number; + used_order_id: string | null; + created_at: string; + used_at: string | null; +} + +// 发货记录 +export interface DeliveryLog { + id: number; + ruleId: number | null; + orderId: string; + accountId: string; + deliveryType: DeliveryType; + content: string; + status: "success" | "failed"; + errorMessage: string | null; + createdAt: string; +} + +// 数据库发货记录 +export interface DbDeliveryLog { + id: number; + rule_id: number | null; + order_id: string; + account_id: string; + delivery_type: DeliveryType; + content: string; + status: string; + error_message: string | null; + created_at: string; +} + +// 创建规则参数 +export interface CreateAutoSellRuleParams { + name: string; + enabled?: boolean; + itemId?: string | null; + accountId?: string | null; + deliveryType: DeliveryType; + deliveryContent?: string | null; + apiConfig?: ApiConfig | null; + triggerOn?: TriggerOn; + workflowId?: number | null; +} + +// 更新规则参数 +export interface UpdateAutoSellRuleParams { + name?: string; + enabled?: boolean; + itemId?: string | null; + accountId?: string | null; + deliveryType?: DeliveryType; + deliveryContent?: string | null; + apiConfig?: ApiConfig | null; + triggerOn?: TriggerOn; + workflowId?: number | null; +} + +// 发货结果 +export interface DeliveryResult { + success: boolean; + content?: string; + error?: string; +} diff --git a/goofish_backend/src/goofish/types/common.types.ts b/goofish_backend/src/goofish/types/common.types.ts new file mode 100644 index 0000000..8fc38c6 --- /dev/null +++ b/goofish_backend/src/goofish/types/common.types.ts @@ -0,0 +1,31 @@ +/** + * 通用类型定义 + */ + +// 分页参数 +export interface PaginationParams { + limit: number; + offset: number; +} + +// 分页结果 +export interface PaginatedResult { + items: T[]; + total: number; + limit: number; + offset: number; +} + +// API 响应基础结构 +export interface ApiResponse { + success: boolean; + data?: T; + error?: string; + message?: string; +} + +// 时间戳相关 +export interface Timestamped { + createdAt?: string; + updatedAt?: string; +} diff --git a/goofish_backend/src/goofish/types/conversation.types.ts b/goofish_backend/src/goofish/types/conversation.types.ts new file mode 100644 index 0000000..3cc14cd --- /dev/null +++ b/goofish_backend/src/goofish/types/conversation.types.ts @@ -0,0 +1,70 @@ +/** + * 对话相关类型定义 + */ + +import type { ConversationMessage, MessageDirection } from "./message.types"; + +// 对话信息 +export interface Conversation { + accountId: string; + accountNickname?: string; + chatId: string; + userId: string; + userName: string; + userAvatar?: string; + lastMessage: string; + lastTime: number; + unread: number; + messageCount?: number; + messages?: ConversationMessage[]; +} + +// 数据库对话记录 +export interface DbConversation { + account_id: string; + chat_id: string; + user_id: string; + user_name: string; + user_avatar: string | null; + last_message: string; + last_time: number; + unread: number; +} + +// 数据库对话消息记录 +export interface DbConversationMessage { + id: number; + account_id: string; + chat_id: string; + sender_id: string; + sender_name: string; + content: string; + msg_time: string; + msg_id: string | null; + direction: MessageDirection; + created_at: number; +} + +// 创建/更新对话参数 +export interface UpsertConversationParams { + accountId: string; + chatId: string; + userId: string; + userName: string; + userAvatar?: string; + lastMessage: string; + lastTime: number; + unread?: number; +} + +// 添加对话消息参数 +export interface AddConversationMessageParams { + accountId: string; + chatId: string; + senderId: string; + senderName: string; + content: string; + msgTime: string; + msgId?: string; + direction: MessageDirection; +} diff --git a/goofish_backend/src/goofish/types/goods.types.ts b/goofish_backend/src/goofish/types/goods.types.ts new file mode 100644 index 0000000..0ee7891 --- /dev/null +++ b/goofish_backend/src/goofish/types/goods.types.ts @@ -0,0 +1,27 @@ +/** + * 商品相关类型定义 + */ + +// 商品信息 +export interface GoodsItem { + id: string; + title: string; + price: string; + picUrl: string; + picWidth: number; + picHeight: number; + categoryId: number; + itemStatus: number; // 0: 在售 + hasVideo: boolean; + soldPrice?: string; + postInfo?: string; + accountId?: string; + accountNickname?: string; +} + +// 商品列表结果 +export interface GoodsListResult { + items: GoodsItem[]; + nextPage: boolean; + totalCount: number; +} diff --git a/goofish_backend/src/goofish/types/index.ts b/goofish_backend/src/goofish/types/index.ts new file mode 100644 index 0000000..96aa800 --- /dev/null +++ b/goofish_backend/src/goofish/types/index.ts @@ -0,0 +1,29 @@ +// 通用类型 +export * from './common.types' + +// 账号类型 +export * from './account.types' + +// 消息类型 +export * from './message.types' + +// 对话类型 +export * from './conversation.types' + +// 自动回复类型 +export * from './autoreply.types' + +// 商品类型 +export * from './goods.types' + +// 用户类型 +export * from './user.types' + +// 订单类型 +export * from './order.types' + +// 自动发货类型 +export * from './autosell.types' + +// 发货流程类型 +export * from './workflow.types' diff --git a/goofish_backend/src/goofish/types/message.types.ts b/goofish_backend/src/goofish/types/message.types.ts new file mode 100644 index 0000000..57f0b6d --- /dev/null +++ b/goofish_backend/src/goofish/types/message.types.ts @@ -0,0 +1,44 @@ +/** + * 消息相关类型定义 + */ + +// 聊天消息 +export interface ChatMessage { + senderId: string; + senderName: string; + msgTime: string; + content: string; + chatId: string; + msgId?: string; + raw: unknown; + // 订单相关信息 + orderId?: string; + orderStatus?: string; + isOrderMessage?: boolean; +} + +// 存储的消息(带时间戳) +export interface StoredMessage extends ChatMessage { + timestamp: number; +} + +// 消息方向 +export type MessageDirection = "in" | "out"; + +// 对话消息 +export interface ConversationMessage { + id: number; + senderId: string; + senderName: string; + content: string; + msgTime: string; + msgId?: string; + timestamp: number; + direction: MessageDirection; +} + +// 消息回调 +export type MessageCallback = ( + accountId: string, + msg: ChatMessage, +) => void | Promise; diff --git a/goofish_backend/src/goofish/types/order.types.ts b/goofish_backend/src/goofish/types/order.types.ts new file mode 100644 index 0000000..3b02706 --- /dev/null +++ b/goofish_backend/src/goofish/types/order.types.ts @@ -0,0 +1,92 @@ +/** + * 订单相关类型定义 + */ + +// 订单状态枚举 +export enum OrderStatus { + PENDING_PAYMENT = 1, // 待付款 + PENDING_SHIPMENT = 2, // 待发货 + PENDING_RECEIPT = 3, // 待收货 + COMPLETED = 4, // 交易成功 + CLOSED = 6, // 已关闭 +} + +// 订单状态文本映射 +export const ORDER_STATUS_TEXT: Record = { + 0: "获取中", + [OrderStatus.PENDING_PAYMENT]: "待付款", + [OrderStatus.PENDING_SHIPMENT]: "待发货", + [OrderStatus.PENDING_RECEIPT]: "待收货", + [OrderStatus.COMPLETED]: "交易成功", + [OrderStatus.CLOSED]: "已关闭", +}; + +// 数据库订单记录 +export interface OrderRecord { + id: number; + orderId: string; + accountId: string; + itemId: string | null; + itemTitle: string | null; + itemPicUrl: string | null; + price: string | null; + buyerUserId: string | null; + buyerNickname: string | null; + chatId: string | null; + status: number; + statusText: string; + orderTime: string; + payTime: string | null; + shipTime: string | null; + completeTime: string | null; + createdAt: string; + updatedAt: string; +} + +// 订单详情 API 响应数据 +export interface OrderDetailData { + orderId: number; + bizOrderId?: number; + itemId: number; + peerUserId: number; + seller: boolean; + status: number; + components: OrderComponent[]; + bottomBarVO?: { + buttonList: OrderButton[]; + }; + utArgs?: { + orderStatusName: string; + orderMainTitle: string; + orderId: string; + orderStatus: string; + }; +} + +export interface OrderComponent { + render: string; + data: any; +} + +export interface OrderButton { + name: string; + style: string; + tradeAction: string; + buttonDisable: boolean; +} + +// 订单列表查询参数 +export interface OrderListParams { + accountId?: string; + status?: number; + limit?: number; + offset?: number; +} + +// 订单列表响应 +export interface OrderListResponse { + orders: OrderRecord[]; + total: number; + limit: number; + offset: number; +} diff --git a/goofish_backend/src/goofish/types/user.types.ts b/goofish_backend/src/goofish/types/user.types.ts new file mode 100644 index 0000000..34a6a85 --- /dev/null +++ b/goofish_backend/src/goofish/types/user.types.ts @@ -0,0 +1,32 @@ +/** + * 用户相关类型定义 + */ + +// 用户头像信息 +export interface UserHeadInfo { + userId: string; + displayName: string; + avatar: string; + ipLocation?: string; + introduction?: string; +} + +// 数据库用户头像缓存 +export interface DbUserAvatar { + user_id: string; + display_name: string | null; + avatar: string; + ip_location: string | null; + introduction: string | null; + created_at: string; + updated_at: string; +} + +// 保存用户头像参数 +export interface SaveUserAvatarParams { + userId: string; + displayName?: string; + avatar: string; + ipLocation?: string; + introduction?: string; +} diff --git a/goofish_backend/src/goofish/types/workflow.types.ts b/goofish_backend/src/goofish/types/workflow.types.ts new file mode 100644 index 0000000..91d108d --- /dev/null +++ b/goofish_backend/src/goofish/types/workflow.types.ts @@ -0,0 +1,147 @@ +/** + * 发货流程相关类型定义 + */ + +// 流程节点类型 +export type WorkflowNodeType = + | "trigger" // 触发节点(开始) + | "autoreply" // 自动回复节点(等待用户确认) + | "delivery" // 发货节点 + | "ship" // 标记发货节点 + | "delay" // 延迟节点 + | "condition" // 条件节点 + | "notify"; // 通知节点 + +// 流程节点 +export interface WorkflowNode { + id: string; + type: WorkflowNodeType; + name: string; + // 节点配置 + config: { + // delivery: 发货方式 (virtual=虚拟发货, freeshipping=免拼发货) + deliveryMode?: "virtual" | "freeshipping"; + // autoreply: 提示消息 + promptMessage?: string; + // autoreply: 期望的用户回复关键词 + keywords?: string[]; + // autoreply: 匹配模式 + matchMode?: "exact" | "contains"; + // delay: 延迟毫秒数 + delayMs?: number; + // delay: 延迟模式 (fixed=固定, random=浮动) + delayMode?: "fixed" | "random"; + // delay: 浮动模式最小毫秒 + delayMinMs?: number; + // delay: 浮动模式最大毫秒 + delayMaxMs?: number; + // condition: 条件表达式 + expression?: string; + // notify: 通知消息 + message?: string; + // 兼容旧字段 + autoReplyRuleId?: number; + expectedKeywords?: string[]; + delaySeconds?: number; + condition?: string; + }; + // 位置信息(用于编辑器) + posX: number; + posY: number; +} + +// 流程连接 +export interface WorkflowConnection { + fromNode: string; + fromOutput: string; + toNode: string; + toInput: string; +} + +// 流程定义 +export interface WorkflowDefinition { + nodes: WorkflowNode[]; + connections: WorkflowConnection[]; +} + +// 流程记录 +export interface Workflow { + id: number; + name: string; + description: string | null; + definition: WorkflowDefinition; + isDefault: boolean; + enabled: boolean; + createdAt: string; + updatedAt: string; +} + +// 流程执行状态 +export type WorkflowExecutionStatus = + | "pending" + | "running" + | "waiting" + | "completed" + | "failed"; + +// 流程执行记录 +export interface WorkflowExecution { + id: number; + workflowId: number; + orderId: string; + accountId: string; + ruleId: number; + status: WorkflowExecutionStatus; + currentNodeId: string | null; + // 等待用户回复的相关信息 + waitingForReply: boolean; + expectedKeywords: string[] | null; + // 执行上下文数据 + context: Record; + createdAt: string; + updatedAt: string; +} + +// 默认流程:触发 -> 发货 -> 标记发货 +export const DEFAULT_WORKFLOW: WorkflowDefinition = { + nodes: [ + { + id: "trigger", + type: "trigger", + name: "触发", + config: {}, + posX: 100, + posY: 200, + }, + { + id: "delivery", + type: "delivery", + name: "发货", + config: {}, + posX: 350, + posY: 200, + }, + { + id: "ship", + type: "ship", + name: "标记发货", + config: {}, + posX: 600, + posY: 200, + }, + ], + connections: [ + { + fromNode: "trigger", + fromOutput: "output_1", + toNode: "delivery", + toInput: "input_1", + }, + { + fromNode: "delivery", + fromOutput: "output_1", + toNode: "ship", + toInput: "input_1", + }, + ], +}; diff --git a/goofish_backend/src/goofish/utils/cookies.ts b/goofish_backend/src/goofish/utils/cookies.ts new file mode 100644 index 0000000..3c52612 --- /dev/null +++ b/goofish_backend/src/goofish/utils/cookies.ts @@ -0,0 +1,55 @@ +// 解析 cookies 字符串为对象 +export function parseCookies(cookiesStr: string): Record { + if (!cookiesStr) return {}; + const cookies: Record = {}; + for (const cookie of cookiesStr.replace(/; /g, ";").split(";")) { + const trimmed = cookie.trim(); + const idx = trimmed.indexOf("="); + if (idx > 0) { + cookies[trimmed.slice(0, idx).trim()] = trimmed.slice(idx + 1).trim(); + } + } + return cookies; +} + +// 将 cookies 对象转换为字符串 +export function stringifyCookies(cookies: Record): string { + return Object.entries(cookies) + .map(([key, value]) => `${key}=${value}`) + .join("; "); +} + +// 合并 cookies,新的覆盖旧的 +export function mergeCookies( + oldCookiesStr: string, + newCookies: Record, +): string { + const merged = parseCookies(oldCookiesStr); + for (const [key, value] of Object.entries(newCookies)) { + if (value) { + merged[key] = value; + } + } + return stringifyCookies(merged); +} + +// 从 Set-Cookie 响应头解析 cookies +export function parseSetCookieHeaders( + setCookieHeaders: string[], +): Record { + const cookies: Record = {}; + for (const header of setCookieHeaders) { + // Set-Cookie 格式: name=value; Path=/; Domain=.goofish.com; ... + const parts = header.split(";"); + if (parts.length > 0) { + const cookiePart = parts[0].trim(); + const idx = cookiePart.indexOf("="); + if (idx > 0) { + const name = cookiePart.slice(0, idx).trim(); + const value = cookiePart.slice(idx + 1).trim(); + cookies[name] = value; + } + } + } + return cookies; +} diff --git a/goofish_backend/src/goofish/utils/crypto.ts b/goofish_backend/src/goofish/utils/crypto.ts new file mode 100644 index 0000000..131dd1f --- /dev/null +++ b/goofish_backend/src/goofish/utils/crypto.ts @@ -0,0 +1,45 @@ +import crypto from "crypto"; + +export function generateMid(): string { + const randomPart = Math.floor(Math.random() * 1000); + const timestamp = Date.now(); + return `${randomPart}${timestamp} 0`; +} + +export function generateUuid(): string { + const chars = "0123456789abcdef"; + const sections = [8, 4, 4, 4, 12]; + return sections + .map((len) => + Array.from( + { length: len }, + () => chars[Math.floor(Math.random() * 16)], + ).join(""), + ) + .join("-"); +} + +export function generateDeviceId(userId: string): string { + const chars = + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + const result: string[] = []; + for (let i = 0; i < 36; i++) { + if ([8, 13, 18, 23].includes(i)) { + result.push("-"); + } else if (i === 14) { + result.push("4"); + } else if (i === 19) { + const randVal = Math.floor(Math.random() * 16); + result.push(chars[(randVal & 0x3) | 0x8]); + } else { + result.push(chars[Math.floor(Math.random() * 16)]); + } + } + return result.join("") + "-" + userId; +} + +export function generateSign(t: string, token: string, data: string): string { + const appKey = "34839810"; + const msg = `${token}&${t}&${appKey}&${data}`; + return crypto.createHash("md5").update(msg).digest("hex"); +} diff --git a/goofish_backend/src/goofish/utils/date.ts b/goofish_backend/src/goofish/utils/date.ts new file mode 100644 index 0000000..f128e1c --- /dev/null +++ b/goofish_backend/src/goofish/utils/date.ts @@ -0,0 +1,15 @@ +/** + * 日期时间工具函数 + */ + +// 获取当前本地时间字符串(格式:YYYY-MM-DD HH:mm:ss) +export function nowLocalString(): string { + const now = new Date(); + const year = now.getFullYear(); + const month = String(now.getMonth() + 1).padStart(2, "0"); + const day = String(now.getDate()).padStart(2, "0"); + const hours = String(now.getHours()).padStart(2, "0"); + const minutes = String(now.getMinutes()).padStart(2, "0"); + const seconds = String(now.getSeconds()).padStart(2, "0"); + return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; +} diff --git a/goofish_backend/src/goofish/utils/index.ts b/goofish_backend/src/goofish/utils/index.ts new file mode 100644 index 0000000..c68892a --- /dev/null +++ b/goofish_backend/src/goofish/utils/index.ts @@ -0,0 +1,7 @@ +/** + * 工具函数统一导出 + */ + +export { generateMid, generateUuid, generateDeviceId, generateSign } from './crypto' +export { parseCookies, stringifyCookies, mergeCookies, parseSetCookieHeaders } from './cookies' +export { decryptMessagePack } from './msgpack' diff --git a/goofish_backend/src/goofish/utils/jwt.util.ts b/goofish_backend/src/goofish/utils/jwt.util.ts new file mode 100644 index 0000000..a685892 --- /dev/null +++ b/goofish_backend/src/goofish/utils/jwt.util.ts @@ -0,0 +1,92 @@ +/** + * JWT 工具 + * 简单的 token 生成和验证 + */ + +import CryptoJS from 'crypto-js' + +const JWT_SECRET = process.env.JWT_SECRET || 'chattyplay-jwt-secret-2024' +const TOKEN_EXPIRY = 7 * 24 * 60 * 60 * 1000 // 7天 + +export interface TokenPayload { + userId: number + username: string + exp?: number +} + +/** + * 生成 JWT token + */ +export function generateToken(payload: Omit): string { + const tokenPayload: TokenPayload = { + ...payload, + exp: Date.now() + TOKEN_EXPIRY + } + + const header = { + alg: 'HS256', + typ: 'JWT' + } + + const encodedHeader = base64UrlEncode(JSON.stringify(header)) + const encodedPayload = base64UrlEncode(JSON.stringify(tokenPayload)) + const signature = CryptoJS.HmacSHA256(`${encodedHeader}.${encodedPayload}`, JWT_SECRET).toString() + const encodedSignature = base64UrlEncode(signature) + + return `${encodedHeader}.${encodedPayload}.${encodedSignature}` +} + +/** + * 验证 JWT token + */ +export function verifyToken(token: string): TokenPayload | null { + try { + const [encodedHeader, encodedPayload, encodedSignature] = token.split('.') + + if (!encodedHeader || !encodedPayload || !encodedSignature) { + return null + } + + // 验证签名 + const signature = CryptoJS.HmacSHA256(`${encodedHeader}.${encodedPayload}`, JWT_SECRET).toString() + const encodedSignatureCheck = base64UrlEncode(signature) + + if (encodedSignature !== encodedSignatureCheck) { + return null + } + + // 解析 payload + const payload = JSON.parse(base64UrlDecode(encodedPayload)) as TokenPayload + + // 检查过期时间 + if (payload.exp && payload.exp < Date.now()) { + return null + } + + return payload + } catch (error) { + console.error('Token verification failed:', error) + return null + } +} + +/** + * Base64 URL 编码 + */ +function base64UrlEncode(str: string): string { + return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(str)) + .replace(/\+/g, '-') + .replace(/\//g, '_') + .replace(/=/g, '') +} + +/** + * Base64 URL 解码 + */ +function base64UrlDecode(str: string): string { + let base64 = str.replace(/-/g, '+').replace(/_/g, '/') + while (base64.length % 4) { + base64 += '=' + } + return CryptoJS.enc.Base64.parse(base64).toString(CryptoJS.enc.Utf8) +} diff --git a/goofish_backend/src/goofish/utils/msgpack.ts b/goofish_backend/src/goofish/utils/msgpack.ts new file mode 100644 index 0000000..b5d8482 --- /dev/null +++ b/goofish_backend/src/goofish/utils/msgpack.ts @@ -0,0 +1,109 @@ +// MessagePack 解码器 +class MessagePackDecoder { + private data: Buffer; + private pos = 0; + + constructor(data: Buffer) { + this.data = data; + } + + private readByte(): number { + return this.data[this.pos++]; + } + + private readBytes(count: number): Buffer { + const result = this.data.subarray(this.pos, this.pos + count); + this.pos += count; + return result; + } + + private readUint32(): number { + const val = this.data.readUInt32BE(this.pos); + this.pos += 4; + return val; + } + + private readString(length: number): string { + return this.readBytes(length).toString("utf-8"); + } + + decodeValue(): any { + const fmt = this.readByte(); + + if (fmt <= 0x7f) return fmt; + if (fmt >= 0x80 && fmt <= 0x8f) return this.decodeMap(fmt & 0x0f); + if (fmt >= 0x90 && fmt <= 0x9f) return this.decodeArray(fmt & 0x0f); + if (fmt >= 0xa0 && fmt <= 0xbf) return this.readString(fmt & 0x1f); + if (fmt === 0xc0) return null; + if (fmt === 0xc2) return false; + if (fmt === 0xc3) return true; + if (fmt === 0xc4) return this.readBytes(this.readByte()); + if (fmt === 0xc5) { + const len = this.data.readUInt16BE(this.pos); + this.pos += 2; + return this.readBytes(len); + } + if (fmt === 0xc6) return this.readBytes(this.readUint32()); + if (fmt === 0xcc) return this.readByte(); + if (fmt === 0xcd) { + const val = this.data.readUInt16BE(this.pos); + this.pos += 2; + return val; + } + if (fmt === 0xce) return this.readUint32(); + if (fmt === 0xcf) { + const val = this.data.readBigUInt64BE(this.pos); + this.pos += 8; + return Number(val); + } + if (fmt === 0xd9) return this.readString(this.readByte()); + if (fmt === 0xda) { + const len = this.data.readUInt16BE(this.pos); + this.pos += 2; + return this.readString(len); + } + if (fmt === 0xdb) return this.readString(this.readUint32()); + if (fmt === 0xdc) { + const len = this.data.readUInt16BE(this.pos); + this.pos += 2; + return this.decodeArray(len); + } + if (fmt === 0xdd) return this.decodeArray(this.readUint32()); + if (fmt === 0xde) { + const len = this.data.readUInt16BE(this.pos); + this.pos += 2; + return this.decodeMap(len); + } + if (fmt === 0xdf) return this.decodeMap(this.readUint32()); + if (fmt >= 0xe0) return fmt - 0x100; + + throw new Error(`Unknown format: ${fmt.toString(16)}`); + } + + private decodeArray(size: number): any[] { + return Array.from({ length: size }, () => this.decodeValue()); + } + + private decodeMap(size: number): Record { + const result: Record = {}; + for (let i = 0; i < size; i++) { + const key = this.decodeValue(); + result[String(key)] = this.decodeValue(); + } + return result; + } + + decode(): any { + return this.decodeValue(); + } +} + +export function decryptMessagePack(data: string): any { + let padded = data; + const missing = data.length % 4; + if (missing) padded += "=".repeat(4 - missing); + + const decoded = Buffer.from(padded, "base64"); + const decoder = new MessagePackDecoder(decoded); + return decoder.decode(); +} diff --git a/goofish_backend/src/goofish/utils/password.util.ts b/goofish_backend/src/goofish/utils/password.util.ts new file mode 100644 index 0000000..e983d47 --- /dev/null +++ b/goofish_backend/src/goofish/utils/password.util.ts @@ -0,0 +1,28 @@ +/** + * 密码加密工具 + * 使用 crypto-js 进行密码哈希 + */ + +import CryptoJS from 'crypto-js' + +const SECRET_KEY = 'chattyplay-secret-key-2024' + +/** + * 对密码进行哈希加密 + * @param password 原始密码 + * @returns 加密后的密码 + */ +export function hashPassword(password: string): string { + return CryptoJS.SHA256(password + SECRET_KEY).toString() +} + +/** + * 验证密码 + * @param password 原始密码 + * @param hashedPassword 加密后的密码 + * @returns 是否匹配 + */ +export function verifyPassword(password: string, hashedPassword: string): boolean { + const hashed = hashPassword(password) + return hashed === hashedPassword +} diff --git a/goofish_backend/src/goofish/websocket/client.manager.ts b/goofish_backend/src/goofish/websocket/client.manager.ts new file mode 100644 index 0000000..5847606 --- /dev/null +++ b/goofish_backend/src/goofish/websocket/client.manager.ts @@ -0,0 +1,128 @@ +import { GoofishClient } from "./client"; +import { createLogger } from "../core/logger"; +import { getEnabledAccounts, updateAccountStatus } from "../db/index"; +import type { MessageCallback } from "../types/index"; + +const logger = createLogger("Ws:Manager"); + +export class ClientManager { + private clients: Map = new Map(); + private onMessage?: MessageCallback; + + constructor(onMessage?: MessageCallback) { + this.onMessage = onMessage; + } + + // 从数据库加载并启动所有启用的账号 + async startAll(): Promise { + const accounts = getEnabledAccounts(); + logger.info(`从数据库加载了 ${accounts.length} 个启用的账号`); + + for (const account of accounts) { + await this.startClient(account.id); + } + } + + // 启动单个客户端 + async startClient(accountId: string): Promise { + if (this.clients.has(accountId)) { + logger.warn(`账号 ${accountId} 已在运行中`); + return false; + } + + try { + const client = new GoofishClient(accountId, this.onMessage); + const success = await client.run(); + + if (success) { + this.clients.set(accountId, client); + logger.info(`账号 ${accountId} 启动成功`); + return true; + } else { + logger.error(`账号 ${accountId} 启动失败`); + updateAccountStatus({ + accountId, + connected: false, + errorMessage: "启动失败", + }); + return false; + } + } catch (e: any) { + logger.error(`账号 ${accountId} 启动异常: ${e.message}`); + updateAccountStatus({ + accountId, + connected: false, + errorMessage: e.message, + }); + return false; + } + } + + // 停止单个客户端 + stopClient(accountId: string): boolean { + const client = this.clients.get(accountId); + if (!client) { + logger.warn(`账号 ${accountId} 未在运行`); + return false; + } + + client.disconnect(); + this.clients.delete(accountId); + logger.info(`账号 ${accountId} 已停止`); + return true; + } + + // 重启单个客户端 + async restartClient(accountId: string): Promise { + this.stopClient(accountId); + await new Promise((r) => setTimeout(r, 1000)); + return this.startClient(accountId); + } + + // 停止所有客户端 + stopAll(): void { + logger.info("正在停止所有客户端..."); + // @ts-ignore + for (const [accountId] of this.clients) { + this.stopClient(accountId); + } + logger.info("所有客户端已停止"); + } + + // 获取客户端 + getClient(accountId: string): GoofishClient | undefined { + return this.clients.get(accountId); + } + + // 获取所有客户端状态 + getStatus(): Array<{ + accountId: string; + connected: boolean; + userId: string; + }> { + const status: Array<{ + accountId: string; + connected: boolean; + userId: string; + }> = []; + // @ts-ignore + for (const [accountId, client] of this.clients) { + status.push({ + accountId, + connected: client.isConnected(), + userId: client.getUserId(), + }); + } + return status; + } + + // 获取运行中的客户端数量 + getActiveCount(): number { + let count = 0; + // @ts-ignore + for (const client of this.clients.values()) { + if (client.isConnected()) count++; + } + return count; + } +} diff --git a/goofish_backend/src/goofish/websocket/client.ts b/goofish_backend/src/goofish/websocket/client.ts new file mode 100644 index 0000000..3c52bf3 --- /dev/null +++ b/goofish_backend/src/goofish/websocket/client.ts @@ -0,0 +1,502 @@ +import WebSocket from "ws"; +import { WS_CONFIG, WS_HEADERS, API_ENDPOINTS } from "../core/constants"; +import { createLogger } from "../core/logger"; +import { CookiesManager } from "../core/cookies.manager"; +import { generateDeviceId, generateMid, generateSign } from "../utils/crypto"; +import { nowLocalString } from "../utils/date"; +import { TokenManager } from "./token"; +import { updateAccountStatus } from "../db/index"; +import { sendMessage } from "./message.sender"; +import { processWebSocketMessage } from "./message.receiver"; +import type { MessageCallback } from "../types/index"; + +const logger = createLogger("Ws:Client"); + +export class GoofishClient { + private _accountId: string; + private myId: string; + private deviceId: string; + private ws: WebSocket | null = null; + private tokenManager: TokenManager; + private running = false; + private connectionFailures = 0; + private heartbeatTimer: NodeJS.Timeout | null = null; + private tokenRefreshTimer: NodeJS.Timeout | null = null; + private onMessage?: MessageCallback; + + constructor(accountId: string, onMessage?: MessageCallback) { + this._accountId = accountId; + this.onMessage = onMessage; + + // 从数据库获取 cookies 验证 + const userId = CookiesManager.getUserId(accountId); + if (!userId) throw new Error("Cookie中缺少必需的'unb'字段或账号不存在"); + + this.myId = userId; + this.deviceId = generateDeviceId(this.myId); + this.tokenManager = new TokenManager(accountId, this.deviceId); + + logger.info(`[${this._accountId}] 客户端初始化完成,用户ID: ${this.myId}`); + } + + get accountId(): string { + return this._accountId; + } + + getAccountId(): string { + return this._accountId; + } + + isConnected(): boolean { + return this.ws?.readyState === WebSocket.OPEN; + } + + getUserId(): string { + return this.myId; + } + + async sendMessage( + chatId: string, + toUserId: string, + text: string, + ): Promise { + if (!this.ws) return false; + return sendMessage({ + accountId: this._accountId, + myId: this.myId, + ws: this.ws, + chatId, + toUserId, + text, + }); + } + + // 获取订单详情 + async fetchOrderDetail(orderId: string): Promise { + try { + const cookiesStr = CookiesManager.getCookies(this._accountId); + if (!cookiesStr) { + logger.error(`[${this._accountId}] 无法获取 cookies`); + return null; + } + + const h5Token = CookiesManager.getH5Token(this._accountId); + if (!h5Token) { + logger.warn(`[${this._accountId}] h5Token 为空,尝试刷新 token`); + } + + const timestamp = Date.now().toString(); + const dataVal = JSON.stringify({ tid: orderId }); + const sign = generateSign(timestamp, h5Token, dataVal); + + logger.debug( + `[${this._accountId}] 订单API请求 - orderId: ${orderId}, h5Token: ${h5Token ? h5Token.substring(0, 8) + "..." : "空"}`, + ); + + const params = new URLSearchParams({ + jsv: "2.7.2", + appKey: WS_CONFIG.SIGN_APP_KEY, + t: timestamp, + sign, + v: "1.0", + type: "originaljson", + accountSite: "xianyu", + dataType: "json", + timeout: "20000", + api: "mtop.idle.web.trade.order.detail", + sessionOption: "AutoLoginOnly", + }); + + const res = await fetch(`${API_ENDPOINTS.ORDER_DETAIL}?${params}`, { + method: "POST", + headers: { + accept: "application/json", + "content-type": "application/x-www-form-urlencoded", + origin: "https://www.goofish.com", + referer: "https://www.goofish.com/", + "user-agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", + cookie: cookiesStr, + }, + body: `data=${encodeURIComponent(dataVal)}`, + }); + + CookiesManager.handleResponseCookies(this._accountId, res); + const resJson = await res.json(); + + if (resJson?.ret?.some((r: string) => r.includes("SUCCESS"))) { + logger.info(`[${this._accountId}] 获取订单详情成功: ${orderId}`); + return resJson; + } + + const retMsg = resJson?.ret?.join(", ") || "未知错误"; + logger.warn(`[${this._accountId}] 获取订单详情失败: ${retMsg}`); + + if ( + retMsg.includes("TOKEN") || + retMsg.includes("FAIL_SYS_SESSION_EXPIRED") + ) { + logger.warn(`[${this._accountId}] Token 可能已过期,请尝试刷新账号`); + } + + return null; + } catch (e) { + logger.error(`[${this._accountId}] 获取订单详情异常: ${e}`); + return null; + } + } + + // 确认发货(虚拟发货/无需物流) + async confirmShipment( + orderId: string, + ): Promise<{ success: boolean; error?: string }> { + try { + const cookiesStr = CookiesManager.getCookies(this._accountId); + if (!cookiesStr) { + return { success: false, error: "无法获取 cookies" }; + } + + const h5Token = CookiesManager.getH5Token(this._accountId); + if (!h5Token) { + return { success: false, error: "h5Token 为空" }; + } + + const timestamp = Date.now().toString(); + const dataVal = JSON.stringify({ + orderId, + tradeText: "", + picList: [], + newUnconsign: true, + }); + const sign = generateSign(timestamp, h5Token, dataVal); + + const params = new URLSearchParams({ + jsv: "2.7.2", + appKey: WS_CONFIG.SIGN_APP_KEY, + t: timestamp, + sign, + v: "1.0", + type: "originaljson", + accountSite: "xianyu", + dataType: "json", + timeout: "20000", + api: "mtop.taobao.idle.logistic.consign.dummy", + sessionOption: "AutoLoginOnly", + }); + + logger.info(`[${this._accountId}] 确认发货请求 - orderId: ${orderId}`); + + const res = await fetch(`${API_ENDPOINTS.CONFIRM_SHIPMENT}?${params}`, { + method: "POST", + headers: { + accept: "application/json", + "content-type": "application/x-www-form-urlencoded", + origin: "https://www.goofish.com", + referer: "https://www.goofish.com/", + "user-agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", + cookie: cookiesStr, + }, + body: `data=${encodeURIComponent(dataVal)}`, + }); + + CookiesManager.handleResponseCookies(this._accountId, res); + const resJson = await res.json(); + + if (resJson?.ret?.some((r: string) => r.includes("SUCCESS"))) { + logger.info(`[${this._accountId}] 确认发货成功: ${orderId}`); + return { success: true }; + } + + const retMsg = resJson?.ret?.join(", ") || "未知错误"; + logger.warn(`[${this._accountId}] 确认发货失败: ${retMsg}`); + return { success: false, error: retMsg }; + } catch (e) { + logger.error(`[${this._accountId}] 确认发货异常: ${e}`); + return { success: false, error: String(e) }; + } + } + + // 免拼发货 + async freeShipping( + orderId: string, + itemId: string, + buyerId: string, + ): Promise<{ success: boolean; error?: string }> { + try { + const cookiesStr = CookiesManager.getCookies(this._accountId); + if (!cookiesStr) { + return { success: false, error: "无法获取 cookies" }; + } + + const h5Token = CookiesManager.getH5Token(this._accountId); + if (!h5Token) { + return { success: false, error: "h5Token 为空" }; + } + + const timestamp = Date.now().toString(); + const dataVal = JSON.stringify({ + bizOrderId: orderId, + itemId, + buyerId, + }); + const sign = generateSign(timestamp, h5Token, dataVal); + + const params = new URLSearchParams({ + jsv: "2.7.2", + appKey: WS_CONFIG.SIGN_APP_KEY, + t: timestamp, + sign, + v: "1.0", + type: "originaljson", + accountSite: "xianyu", + dataType: "json", + timeout: "20000", + api: "mtop.idle.groupon.activity.seller.freeshipping", + sessionOption: "AutoLoginOnly", + }); + + logger.info( + `[${this._accountId}] 免拼发货请求 - orderId: ${orderId}, itemId: ${itemId}, buyerId: ${buyerId}`, + ); + + const res = await fetch(`${API_ENDPOINTS.FREE_SHIPPING}?${params}`, { + method: "POST", + headers: { + accept: "application/json", + "content-type": "application/x-www-form-urlencoded", + origin: "https://www.goofish.com", + referer: "https://www.goofish.com/", + "user-agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", + cookie: cookiesStr, + }, + body: `data=${encodeURIComponent(dataVal)}`, + }); + + CookiesManager.handleResponseCookies(this._accountId, res); + const resJson = await res.json(); + + if (resJson?.ret?.some((r: string) => r.includes("SUCCESS"))) { + logger.info(`[${this._accountId}] 免拼发货成功: ${orderId}`); + return { success: true }; + } + + const retMsg = resJson?.ret?.join(", ") || "未知错误"; + logger.warn(`[${this._accountId}] 免拼发货失败: ${retMsg}`); + return { success: false, error: retMsg }; + } catch (e) { + logger.error(`[${this._accountId}] 免拼发货异常: ${e}`); + return { success: false, error: String(e) }; + } + } + + private startHeartbeat() { + this.heartbeatTimer = setInterval(() => { + if (this.ws?.readyState === WebSocket.OPEN) { + const msg = { lwp: "/!", headers: { mid: generateMid() } }; + this.ws.send(JSON.stringify(msg)); + logger.debug(`[${this._accountId}] 心跳已发送`); + updateAccountStatus({ + accountId: this._accountId, + lastHeartbeat: nowLocalString(), + }); + } + }, WS_CONFIG.HEARTBEAT_INTERVAL * 1000); + } + + private startTokenRefresh() { + this.tokenRefreshTimer = setInterval(async () => { + if (this.running) { + logger.info(`[${this._accountId}] 开始定时刷新Token...`); + const token = await this.tokenManager.refresh(); + if (token) { + logger.info(`[${this._accountId}] Token刷新成功`); + updateAccountStatus({ + accountId: this._accountId, + lastTokenRefresh: nowLocalString(), + }); + } else { + logger.warn(`[${this._accountId}] Token刷新失败`); + } + } + }, WS_CONFIG.TOKEN_REFRESH_INTERVAL * 1000); + logger.info( + `[${this._accountId}] Token刷新定时器已启动,间隔: ${WS_CONFIG.TOKEN_REFRESH_INTERVAL}秒`, + ); + } + + private async initConnection() { + if (!this.ws) return; + + let token = this.tokenManager.getToken(); + if (!token) { + logger.info(`[${this._accountId}] 首次连接,正在获取Token...`); + token = await this.tokenManager.refresh(); + if (!token) { + logger.error(`[${this._accountId}] 获取Token失败,无法完成注册`); + return; + } + } + + const regMsg = { + lwp: "/reg", + headers: { + "cache-header": "app-key token ua wv", + "app-key": WS_CONFIG.APP_KEY, + token: token, + ua: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", + dt: "j", + wv: "im:3,au:3,sy:6", + sync: "0,0;0;0;", + did: this.deviceId, + mid: generateMid(), + }, + }; + this.ws.send(JSON.stringify(regMsg)); + logger.info(`[${this._accountId}] 注册消息已发送`); + + await new Promise((r) => setTimeout(r, 1000)); + + const currentTime = Date.now(); + const syncMsg = { + lwp: "/r/SyncStatus/ackDiff", + headers: { mid: generateMid() }, + body: [ + { + pipeline: "sync", + tooLong2Tag: "PNM,1", + channel: "sync", + topic: "sync", + highPts: 0, + pts: currentTime * 1000, + seq: 0, + timestamp: currentTime, + }, + ], + }; + this.ws.send(JSON.stringify(syncMsg)); + logger.info(`[${this._accountId}] 连接注册完成`); + } + + private sendAck(headers: any) { + if (this.ws?.readyState !== WebSocket.OPEN) return; + const ack = { + code: 200, + headers: { mid: headers?.mid || generateMid(), sid: headers?.sid || "" }, + }; + this.ws.send(JSON.stringify(ack)); + } + + async connect(): Promise { + return new Promise((resolve) => { + try { + logger.info(`[${this._accountId}] 正在连接 WebSocket...`); + this.ws = new WebSocket(WS_CONFIG.URL, { headers: WS_HEADERS }); + + this.ws.on("open", async () => { + logger.info(`[${this._accountId}] WebSocket 连接已建立`); + this.connectionFailures = 0; + updateAccountStatus({ + accountId: this._accountId, + connected: true, + errorMessage: "", + }); + + try { + await this.initConnection(); + this.startHeartbeat(); + this.startTokenRefresh(); + resolve(true); + } catch (e) { + logger.error(`[${this._accountId}] 初始化连接失败: ${e}`); + resolve(false); + } + }); + + this.ws.on("message", async (data) => { + try { + const msgData = JSON.parse(data.toString()); + await processWebSocketMessage( + msgData, + { + accountId: this._accountId, + myId: this.myId, + client: this, + onMessage: this.onMessage, + onAutoReply: (chatId, senderId, content) => + this.sendMessage(chatId, senderId, content), + }, + (headers) => this.sendAck(headers), + ); + } catch (e) { + logger.error(`[${this._accountId}] 解析消息失败: ${e}`); + } + }); + + this.ws.on("close", (code, reason) => { + logger.warn( + `[${this._accountId}] WebSocket 连接关闭: ${code} - ${reason}`, + ); + this.cleanup(); + updateAccountStatus({ accountId: this._accountId, connected: false }); + + if ( + this.running && + this.connectionFailures < WS_CONFIG.MAX_RECONNECT_ATTEMPTS + ) { + this.connectionFailures++; + logger.info( + `[${this._accountId}] ${WS_CONFIG.RECONNECT_DELAY / 1000}秒后尝试重连 (${this.connectionFailures}/${WS_CONFIG.MAX_RECONNECT_ATTEMPTS})`, + ); + setTimeout(() => this.connect(), WS_CONFIG.RECONNECT_DELAY); + } + }); + + this.ws.on("error", (err) => { + logger.error(`[${this._accountId}] WebSocket 错误: ${err.message}`); + updateAccountStatus({ + accountId: this._accountId, + errorMessage: err.message, + }); + resolve(false); + }); + } catch (e) { + logger.error(`[${this._accountId}] 连接失败: ${e}`); + resolve(false); + } + }); + } + + private cleanup() { + if (this.heartbeatTimer) { + clearInterval(this.heartbeatTimer); + this.heartbeatTimer = null; + } + if (this.tokenRefreshTimer) { + clearInterval(this.tokenRefreshTimer); + this.tokenRefreshTimer = null; + } + } + + disconnect() { + this.running = false; + this.cleanup(); + if (this.ws) { + this.ws.close(); + this.ws = null; + } + updateAccountStatus({ accountId: this._accountId, connected: false }); + logger.info(`[${this._accountId}] 客户端已断开连接`); + } + + async run() { + this.running = true; + const connected = await this.connect(); + if (!connected) { + logger.error(`[${this._accountId}] 启动失败`); + this.running = false; + } + return connected; + } +} diff --git a/goofish_backend/src/goofish/websocket/index.ts b/goofish_backend/src/goofish/websocket/index.ts new file mode 100644 index 0000000..8fd0b07 --- /dev/null +++ b/goofish_backend/src/goofish/websocket/index.ts @@ -0,0 +1,10 @@ +/** + * WebSocket 模块统一导出 + */ + +export { GoofishClient } from './client' +export { ClientManager } from './client.manager' +export { TokenManager } from './token' +export { decryptSyncData, extractChatMessage, isSystemMessage } from './message.parser' +export { sendMessage } from './message.sender' +export { handleSyncMessage, processWebSocketMessage } from './message.receiver' diff --git a/goofish_backend/src/goofish/websocket/message.parser.ts b/goofish_backend/src/goofish/websocket/message.parser.ts new file mode 100644 index 0000000..9f705c6 --- /dev/null +++ b/goofish_backend/src/goofish/websocket/message.parser.ts @@ -0,0 +1,258 @@ +import { decryptMessagePack } from "../utils/msgpack"; +import { createLogger } from "../core/logger"; +import type { ChatMessage } from "../types/index"; + +const logger = createLogger("Ws:Parser"); + +// 纯系统提示消息(不需要处理的) +const SYSTEM_MESSAGES = [ + "[不想宝贝被砍价?设置不砍价回复 ]", + "AI正在帮你回复消息,不错过每笔订单", + "发来一条消息", + "发来一条新消息", + "快给ta一个评价吧~", + "快给ta一个评价吧~", + "卖家人不错?送Ta闲鱼小红花", +]; + +// 订单状态消息(需要捕获但不触发自动回复) +const ORDER_STATUS_MESSAGES = [ + "[我已拍下,待付款]", + "[我已付款,等待你发货]", + "[已付款,待发货]", + "[你已发货]", + "[你已发货,请等待买家确认收货]", + "[买家确认收货,交易成功]", + "[你已确认收货,交易成功]", + "[你关闭了订单,钱款已原路退返]", + "[未付款,买家关闭了订单]", + "[记得及时确认收货]", + "已发货", + "有蚂蚁森林能量可领", +]; + +export function isSystemMessage(content: string): boolean { + return SYSTEM_MESSAGES.includes(content); +} + +export function isOrderStatusMessage(content: string): boolean { + return ORDER_STATUS_MESSAGES.some((msg) => content.includes(msg)); +} + +export function decryptSyncData(data: string): any | null { + // 先尝试 MessagePack 解码(这是主要格式) + try { + const result = decryptMessagePack(data); + if (result && typeof result === "object") { + // 检查是否是有效的聊天消息结构 + const msg1 = result["1"] || result[1]; + if (msg1 && typeof msg1 === "object") { + const msg10 = msg1["10"] || msg1[10]; + if (msg10 && typeof msg10 === "object" && "reminderContent" in msg10) { + return result; + } + } + } + } catch (e) { + logger.debug(`MessagePack解密失败: ${e}`); + } + + // 尝试 base64 + JSON + try { + const decoded = Buffer.from(data, "base64").toString("utf-8"); + const parsed = JSON.parse(decoded); + if (typeof parsed === "object") { + if ("chatType" in parsed) return null; // 系统消息 + return parsed; + } + } catch { + // 忽略 JSON 解析失败 + } + + return null; +} + +export function extractChatMessage( + message: any, + myId: string, +): ChatMessage | null { + try { + // 检查消息结构 + if (!message || typeof message !== "object") return null; + + // 支持两种消息结构:数字键和字符串键 + const msg1 = message["1"] || message[1]; + if (!msg1 || typeof msg1 !== "object") return null; + + const msg10 = msg1["10"] || msg1[10]; + if (!msg10 || typeof msg10 !== "object") return null; + + const createTime = parseInt(msg1["5"] || msg1[5] || "0"); + const senderName = msg10.senderNick || msg10.reminderTitle || "未知用户"; + const senderId = msg10.senderUserId || "unknown"; + const content = msg10.reminderContent || ""; + + // 提取 chatId + const chatIdRaw = msg1["2"] || msg1[2] || ""; + const chatId = String(chatIdRaw).includes("@") + ? String(chatIdRaw).split("@")[0] + : String(chatIdRaw); + + // 提取 API 消息 ID 和订单信息 (从 extJson 中) + let msgId: string | undefined; + let orderId: string | undefined; + let orderStatus: string | undefined; + try { + const extJson = msg10.extJson; + if (extJson) { + const ext = JSON.parse(extJson); + msgId = ext.messageId || ext.msg_id; + // updateKey 格式有两种: + // 1. orderId:contentType:taskName:num (如 3142117850666220888:20:BUYER_CONFIRM:74) + // 2. sessionId:orderId:contentType:taskName:num (如 56627074402:3142117850666220888:100:REMIND:26) + if (ext.updateKey) { + const parts = ext.updateKey.split(":"); + for (const part of parts) { + if (/^\d{15,}$/.test(part)) { + orderId = part; + break; + } + } + } + } + } catch { + // 忽略解析失败 + } + + // 从 bizTag 提取订单状态 + try { + const bizTag = msg10.bizTag; + if (bizTag) { + const tag = JSON.parse(bizTag); + orderStatus = tag.taskName; + } + } catch { + // 忽略解析失败 + } + + // 从 reminderUrl 提取订单ID(备用方案) + if (!orderId && msg10.reminderUrl) { + const urlMatch = msg10.reminderUrl.match(/orderId=(\d+)/); + if (urlMatch) { + orderId = urlMatch[1]; + } + } + + // 从消息内容的 dxCard/tip 中提取订单ID(备用方案) + if (!orderId) { + try { + const msg6 = msg1["6"] || msg1[6]; + if (msg6) { + const msg63 = msg6["3"] || msg6[3]; + if (msg63) { + const cardJson = msg63["5"] || msg63[5]; + if (cardJson) { + const card = JSON.parse(cardJson); + // 从 tip.argInfo.args.orderId 提取(蚂蚁森林能量等消息) + const tipOrderId = card?.tip?.argInfo?.args?.orderId; + if (tipOrderId && /^\d{15,}$/.test(tipOrderId)) { + orderId = tipOrderId; + } + // 从 main.targetUrl 提取 (fleamarket://order_detail?id=xxx) + if (!orderId) { + const mainTargetUrl = card?.dxCard?.item?.main?.targetUrl; + if (mainTargetUrl) { + const match = mainTargetUrl.match(/[?&]id=(\d{15,})/); + if (match) orderId = match[1]; + } + } + // 从 button targetUrl 提取 (orderId=xxx) + if (!orderId) { + const btnUrl = + card?.dxCard?.item?.main?.exContent?.button?.targetUrl; + if (btnUrl) { + const match = btnUrl.match( + /orderId=(\d{15,})|bizOrderId=(\d{15,})/, + ); + if (match) orderId = match[1] || match[2]; + } + } + // 从 dynamicOperation.changeContent.dxCard 提取(已付款待发货等消息) + if (!orderId) { + const changeTargetUrl = + card?.dynamicOperation?.changeContent?.dxCard?.item?.main + ?.targetUrl; + if (changeTargetUrl) { + const match = changeTargetUrl.match(/[?&]id=(\d{15,})/); + if (match) orderId = match[1]; + } + } + // 从 dynamicOperation.changeContent.dxCard.button 提取 + if (!orderId) { + const changeBtnUrl = + card?.dynamicOperation?.changeContent?.dxCard?.item?.main + ?.exContent?.button?.targetUrl; + if (changeBtnUrl) { + const match = changeBtnUrl.match( + /[?&]id=(\d{15,})|orderId=(\d{15,})/, + ); + if (match) orderId = match[1] || match[2]; + } + } + } + } + } + } catch { + // 忽略解析失败 + } + } + + const msgTime = createTime + ? new Date(createTime).toLocaleString("zh-CN", { hour12: false }) + : new Date().toLocaleString("zh-CN", { hour12: false }); + + // 检查是否是订单状态消息 + const isOrderMessage = isOrderStatusMessage(content); + + // 过滤自己的消息(但订单状态消息除外,因为可能是系统发送的) + if (senderId === myId && !isOrderMessage) { + logger.debug(`[${msgTime}] 忽略自己发送的消息`); + return null; + } + + // 过滤纯系统消息(不包含有用信息的) + if (isSystemMessage(content)) { + logger.debug(`[${msgTime}] 系统消息不处理: ${content}`); + return null; + } + + // 过滤空消息 + if (!content || content.trim() === "") { + logger.debug(`[${msgTime}] 忽略空消息`); + return null; + } + + // 订单状态消息特殊日志 + if (isOrderMessage && orderId) { + logger.info( + `[${msgTime}] 订单状态消息 - 订单ID: ${orderId}, 状态: ${orderStatus || content}`, + ); + } + + return { + senderId, + senderName, + msgTime, + content, + chatId, + msgId, + raw: message, + orderId, + orderStatus, + isOrderMessage, + }; + } catch (e) { + logger.error(`提取聊天消息失败: ${e}`); + return null; + } +} diff --git a/goofish_backend/src/goofish/websocket/message.receiver.ts b/goofish_backend/src/goofish/websocket/message.receiver.ts new file mode 100644 index 0000000..ec3c003 --- /dev/null +++ b/goofish_backend/src/goofish/websocket/message.receiver.ts @@ -0,0 +1,187 @@ +import { createLogger } from "../core/logger"; +import { + decryptSyncData, + extractChatMessage, + isOrderStatusMessage, +} from "./message.parser"; +import { checkAutoReply, handleUserReply } from "../services/index"; +import { addRawMessage } from "../api/routes/dev-messages.route"; +import type { ChatMessage, MessageCallback } from "../types/index"; +import type { GoofishClient } from "./client"; + +const logger = createLogger("Ws:Receiver"); + +export interface MessageReceiverContext { + accountId: string; + myId: string; + client?: GoofishClient; + onMessage?: MessageCallback; + onAutoReply?: ( + chatId: string, + senderId: string, + content: string, + ) => Promise; +} + +/** + * 处理同步消息数据 + */ +export async function handleSyncMessage( + msgData: any, + ctx: MessageReceiverContext, +): Promise { + const { accountId, myId, onMessage, onAutoReply } = ctx; + const body = msgData.body || {}; + let dataList: any[] = []; + + if (body.syncPushPackage?.data) { + dataList = body.syncPushPackage.data; + logger.debug( + `[${accountId}] 从 syncPushPackage.data 获取到 ${dataList.length} 条数据`, + ); + } else if (Array.isArray(body.data)) { + dataList = body.data; + logger.debug( + `[${accountId}] 从 body.data 获取到 ${dataList.length} 条数据`, + ); + } else if (Array.isArray(body)) { + dataList = body; + logger.debug( + `[${accountId}] body 本身是数组,包含 ${dataList.length} 条数据`, + ); + } + + if (dataList.length === 0) { + logger.debug(`[${accountId}] 没有数据需要处理`); + return []; + } + + const messages: ChatMessage[] = []; + + for (const item of dataList) { + const data = typeof item === "object" ? item.data || item : item; + if (!data) { + logger.debug(`[${accountId}] 跳过空数据项`); + continue; + } + + logger.debug( + `[${accountId}] 尝试解密数据: ${typeof data === "string" ? data.substring(0, 50) + "..." : JSON.stringify(data).substring(0, 50) + "..."}`, + ); + + const message = decryptSyncData(data); + if (!message) { + logger.debug(`[${accountId}] 解密失败或非聊天消息`); + continue; + } + + const chatMsg = extractChatMessage(message, myId); + if (!chatMsg) { + logger.debug(`[${accountId}] 提取聊天消息失败`); + continue; + } + + logger.info( + `[${accountId}] [${chatMsg.msgTime}] 收到消息 - 发送者: ${chatMsg.senderName}, chatId: ${chatMsg.chatId}, 内容: ${chatMsg.content}${chatMsg.orderId ? `, 订单ID: ${chatMsg.orderId}` : ""}`, + ); + messages.push(chatMsg); + + // 订单状态消息不触发自动回复 + if (chatMsg.isOrderMessage) { + logger.debug(`[${accountId}] 订单状态消息,跳过自动回复检查`); + } else { + // 先检查是否有等待中的工作流程需要继续执行 + if (ctx.client && chatMsg.chatId) { + const workflowHandled = await handleUserReply( + accountId, + chatMsg.chatId, + chatMsg.senderId, + chatMsg.content, + ctx.client, + ); + if (workflowHandled) { + logger.info(`[${accountId}] 用户回复已触发工作流程继续执行`); + } + } + + // 检查自动回复规则 + const autoReplyResult = await checkAutoReply(accountId, chatMsg); + if ( + autoReplyResult.matched && + autoReplyResult.replyContent && + chatMsg.chatId && + onAutoReply + ) { + await onAutoReply( + chatMsg.chatId, + chatMsg.senderId, + autoReplyResult.replyContent, + ); + } + } + + if (onMessage) { + await onMessage(accountId, chatMsg); + } + } + + return messages; +} + +/** + * 处理 WebSocket 消息 + */ +export async function processWebSocketMessage( + msgData: any, + ctx: MessageReceiverContext, + sendAck: (headers: any) => void, +): Promise { + const { accountId } = ctx; + + try { + const lwp = msgData.lwp || ""; + + // 忽略响应消息 + if (msgData.code === 200) return; + + // 注册响应 + if (lwp === "/r") { + const code = msgData.headers?.code; + if (code === "200" || code === 200) { + logger.info(`[${accountId}] WebSocket注册成功`); + } else { + logger.error( + `[${accountId}] WebSocket注册失败: ${JSON.stringify(msgData)}`, + ); + } + return; + } + + // 同步消息 - 添加到开发调试缓冲区 + if (lwp === "/s/sync" || lwp.toLowerCase().includes("/sync")) { + logger.debug(`[${accountId}] 收到同步消息: ${lwp}`); + addRawMessage(accountId, msgData); + sendAck(msgData.headers); + await handleSyncMessage(msgData, ctx); + return; + } + + // 推送消息 - 添加到开发调试缓冲区 + if (lwp === "/p") { + logger.debug(`[${accountId}] 收到推送消息`); + addRawMessage(accountId, msgData); + sendAck(msgData.headers); + if (msgData?.body?.syncPushPackage?.data?.length > 0 || msgData?.body) { + await handleSyncMessage(msgData, ctx); + } + return; + } + + // 其他消息类型 + if (lwp) { + logger.debug(`[${accountId}] 收到其他消息类型: ${lwp}`); + } + } catch (e) { + logger.error(`[${accountId}] 处理消息异常: ${e}`); + } +} diff --git a/goofish_backend/src/goofish/websocket/message.sender.ts b/goofish_backend/src/goofish/websocket/message.sender.ts new file mode 100644 index 0000000..fb295ad --- /dev/null +++ b/goofish_backend/src/goofish/websocket/message.sender.ts @@ -0,0 +1,66 @@ +import WebSocket from "ws"; +import { createLogger } from "../core/logger"; +import { generateMid, generateUuid } from "../utils/crypto"; +import { conversationStore } from "../api/stores/conversation.store"; + +const logger = createLogger("Ws:Sender"); + +export interface SendMessageOptions { + accountId: string; + myId: string; + ws: WebSocket; + chatId: string; + toUserId: string; + text: string; +} + +/** + * 发送消息到指定用户 + */ +export async function sendMessage( + options: SendMessageOptions, +): Promise { + const { accountId, myId, ws, chatId, toUserId, text } = options; + + if (!ws || ws.readyState !== WebSocket.OPEN) { + logger.error(`[${accountId}] WebSocket未连接,无法发送消息`); + return false; + } + + try { + const textContent = { contentType: 1, text: { text } }; + const textBase64 = Buffer.from(JSON.stringify(textContent)).toString( + "base64", + ); + + const msg = { + lwp: "/r/MessageSend/sendByReceiverScope", + headers: { mid: generateMid() }, + body: [ + { + uuid: generateUuid(), + cid: `${chatId}@goofish`, + conversationType: 1, + content: { contentType: 101, custom: { type: 1, data: textBase64 } }, + redPointPolicy: 0, + extension: { extJson: "{}" }, + ctx: { appVersion: "1.0", platform: "web" }, + mtags: {}, + msgReadStatusSetting: 1, + }, + { actualReceivers: [`${toUserId}@goofish`, `${myId}@goofish`] }, + ], + }; + + ws.send(JSON.stringify(msg)); + logger.info(`[${accountId}] 消息已发送到 ${toUserId}: ${text}`); + + // 记录发出的消息 + conversationStore.addOutgoing(accountId, chatId, toUserId, text); + + return true; + } catch (e) { + logger.error(`[${accountId}] 发送消息失败: ${e}`); + return false; + } +} diff --git a/goofish_backend/src/goofish/websocket/token.ts b/goofish_backend/src/goofish/websocket/token.ts new file mode 100644 index 0000000..9861e70 --- /dev/null +++ b/goofish_backend/src/goofish/websocket/token.ts @@ -0,0 +1,235 @@ +import { WS_CONFIG, API_ENDPOINTS, PASSPORT_CONFIG } from "../core/constants"; +import { CookiesManager } from "../core/cookies.manager"; +import { generateSign } from "../utils/crypto"; +import { createLogger } from "../core/logger"; + +const logger = createLogger("Ws:Token"); + +// Session 过期错误标识 +const SESSION_EXPIRED_ERRORS = ["FAIL_SYS_SESSION_EXPIRED", "SESSION_EXPIRED"]; + +export class TokenManager { + private currentToken: string | null = null; + private lastRefreshTime = 0; + private deviceId: string; + private accountId: string; + + constructor(accountId: string, deviceId: string) { + this.accountId = accountId; + this.deviceId = deviceId; + } + + getToken(): string | null { + return this.currentToken; + } + + isExpired(): boolean { + return ( + !this.currentToken || + Date.now() - this.lastRefreshTime >= + WS_CONFIG.TOKEN_REFRESH_INTERVAL * 1000 + ); + } + + // 调用 hasLogin 接口刷新登录状态 + private async hasLogin(retryCount = 0): Promise { + if (retryCount >= 2) { + logger.error(`[${this.accountId}] hasLogin 检查失败,重试次数过多`); + return false; + } + + try { + // 每次从数据库获取最新 cookies + const cookiesStr = CookiesManager.getCookies(this.accountId); + const cookies = CookiesManager.getCookiesObject(this.accountId); + + if (!cookiesStr) { + logger.error(`[${this.accountId}] 无法获取 cookies`); + return false; + } + + const url = `${PASSPORT_CONFIG.BASE_URL}/newlogin/hasLogin.do`; + const params = new URLSearchParams({ + appName: "xianyu", + fromSite: "77", + }); + + const formData = new URLSearchParams({ + hid: cookies["unb"] || "", + ltl: "true", + appName: "xianyu", + appEntrance: "web", + _csrf_token: cookies["XSRF-TOKEN"] || "", + umidToken: "", + hsiz: cookies["cookie2"] || "", + bizParams: "taobaoBizLoginFrom=web", + mainPage: "false", + isMobile: "false", + lang: "zh_CN", + returnUrl: "", + fromSite: "77", + isIframe: "true", + documentReferer: "https://www.goofish.com/", + defaultView: "hasLogin", + umidTag: "SERVER", + deviceId: cookies["cna"] || "", + }); + + const res = await fetch(`${url}?${params}`, { + method: "POST", + headers: { + accept: "application/json", + "content-type": "application/x-www-form-urlencoded", + origin: "https://www.goofish.com", + referer: "https://www.goofish.com/", + "user-agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", + cookie: cookiesStr, + }, + body: formData.toString(), + }); + + // 处理 Set-Cookie,自动更新到数据库 + CookiesManager.handleResponseCookies(this.accountId, res); + + const resJson = await res.json(); + + if (resJson?.content?.success) { + logger.info(`[${this.accountId}] hasLogin 验证成功`); + return true; + } + + logger.warn( + `[${this.accountId}] hasLogin 验证失败: ${JSON.stringify(resJson)}`, + ); + await new Promise((r) => setTimeout(r, 500)); + return this.hasLogin(retryCount + 1); + } catch (e) { + logger.error(`[${this.accountId}] hasLogin 请求异常: ${e}`); + await new Promise((r) => setTimeout(r, 500)); + return this.hasLogin(retryCount + 1); + } + } + + // 检查是否为 Session 过期错误 + private isSessionExpiredError(error: string): boolean { + return SESSION_EXPIRED_ERRORS.some((e) => error.includes(e)); + } + + // 执行单次 token 请求 + private async doTokenRequest(): Promise<{ + success: boolean; + token?: string; + cookiesUpdated: boolean; + error?: string; + }> { + // 每次从数据库获取最新 cookies + const cookiesStr = CookiesManager.getCookies(this.accountId); + if (!cookiesStr) { + return { + success: false, + cookiesUpdated: false, + error: "无法获取 cookies", + }; + } + + const timestamp = Date.now().toString(); + const dataVal = JSON.stringify({ + appKey: WS_CONFIG.APP_KEY, + deviceId: this.deviceId, + }); + const h5Token = CookiesManager.getH5Token(this.accountId); + const sign = generateSign(timestamp, h5Token, dataVal); + + const params = new URLSearchParams({ + jsv: "2.7.2", + appKey: WS_CONFIG.SIGN_APP_KEY, + t: timestamp, + sign, + v: "1.0", + type: "originaljson", + accountSite: "xianyu", + dataType: "json", + timeout: "20000", + api: "mtop.taobao.idlemessage.pc.login.token", + sessionOption: "AutoLoginOnly", + }); + + const res = await fetch(`${API_ENDPOINTS.TOKEN}?${params}`, { + method: "POST", + headers: { + accept: "application/json", + "content-type": "application/x-www-form-urlencoded", + origin: "https://www.goofish.com", + referer: "https://www.goofish.com/", + "user-agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", + cookie: cookiesStr, + }, + body: `data=${encodeURIComponent(dataVal)}`, + }); + + // 处理 Set-Cookie,自动更新到数据库 + const cookiesUpdated = CookiesManager.handleResponseCookies( + this.accountId, + res, + ); + const resJson = await res.json(); + + if ( + resJson?.ret?.some((r: string) => r.includes("SUCCESS")) && + resJson?.data?.accessToken + ) { + return { success: true, token: resJson.data.accessToken, cookiesUpdated }; + } + + const errorMsg = resJson?.ret?.join(", ") || "Unknown error"; + return { success: false, cookiesUpdated, error: errorMsg }; + } + + async refresh(): Promise { + try { + logger.info(`[${this.accountId}] 开始刷新Token...`); + + // 第一次请求 + let result = await this.doTokenRequest(); + + // 如果失败但 cookies 更新了(token 过期场景),用新 token 重试 + if (!result.success && result.cookiesUpdated) { + logger.info(`[${this.accountId}] Token过期,使用新Cookies重试...`); + result = await this.doTokenRequest(); + } + + // 如果仍然失败且是 Session 过期错误,尝试 hasLogin 刷新 + if ( + !result.success && + result.error && + this.isSessionExpiredError(result.error) + ) { + logger.info(`[${this.accountId}] Session过期,尝试 hasLogin 刷新...`); + const loginSuccess = await this.hasLogin(); + if (loginSuccess) { + logger.info(`[${this.accountId}] hasLogin 成功,重新获取Token...`); + result = await this.doTokenRequest(); + // hasLogin 后可能还需要处理 token 更新 + if (!result.success && result.cookiesUpdated) { + result = await this.doTokenRequest(); + } + } + } + + if (result.success && result.token) { + this.currentToken = result.token; + this.lastRefreshTime = Date.now(); + logger.info(`[${this.accountId}] Token刷新成功`); + return this.currentToken; + } + + logger.error(`[${this.accountId}] Token刷新失败: ${result.error}`); + return null; + } catch (e) { + logger.error(`[${this.accountId}] Token刷新异常: ${e}`); + return null; + } + } +} diff --git a/goofish_backend/src/services/server.ts b/goofish_backend/src/services/server.ts new file mode 100644 index 0000000..834355d --- /dev/null +++ b/goofish_backend/src/services/server.ts @@ -0,0 +1,1041 @@ +import { serve } from '@hono/node-server' +import { Hono } from 'hono' +import { cors } from 'hono/cors' +import { logger } from 'hono/logger' +import { networkInterfaces } from 'os' +import { createNodeWebSocket } from '@hono/node-ws' +import { initDatabase, closeDatabase } from '../goofish/db' +import { ClientManager } from '../goofish/websocket' +import { fetchUserHead, handleOrderMessage, fetchAndUpdateOrderDetail } from '../goofish/services' +import { messageStore, conversationStore, setClientManager } from '../goofish/api' +import { createLogger, cleanOldLogs, setLogLevel, LogLevel } from '../goofish/core/logger' +import { LOG_CONFIG } from '../goofish/core/constants' +import { isAllowedFrontendOrigin, resolveCorsOrigin } from '../goofish/core/frontend-origin' +import { createStatusRoutes } from '../goofish/api/routes' +import { createWSPushHandler } from '../goofish/api/routes/ws-push.route' +import { createAccountRoutes } from '../goofish/api/routes/accounts' +import { createGoodsRoutes } from '../goofish/api/routes/goods' +import { createMessageRoutes } from '../goofish/api/routes/messages' +import { createConversationRoutes } from '../goofish/api/routes/conversations' +import { createLogsRoutes } from '../goofish/api/routes/logs' +import { createAutoReplyRoutes } from '../goofish/api/routes/autoreply' +import { createOrderRoutes } from '../goofish/api/routes/order.route' +import { createAutoSellRoutes } from '../goofish/api/routes/autosell' +import { createWorkflowRoutes } from '../goofish/api/routes/workflow.route' +import { authRoute } from '../goofish/api/routes/auth.route' +import { goofishAuthMiddleware, isAuthorizedGoofishRequest } from '../goofish/api/middlewares' + +const goofishLogger = createLogger('Goofish:Integration') +const app = new Hono() + +// WebSocket 支持 +const nodeWS = createNodeWebSocket({ app }) +const { upgradeWebSocket, injectWebSocket } = nodeWS + +// Goofish ClientManager +let clientManager: ClientManager + +// 初始化 Goofish +async function initGoofish() { + goofishLogger.info('初始化 Goofish 服务...') + + // 设置日志级别 + setLogLevel(LOG_CONFIG.LEVEL as LogLevel) + + // 清理过期日志 + cleanOldLogs(LOG_CONFIG.RETENTION_DAYS) + + // 初始化数据库 + initDatabase() + + // 创建客户端管理器 + clientManager = new ClientManager(async (accountId, msg) => { + goofishLogger.info(`收到新消息: ${msg.senderName}: ${msg.content}`) + messageStore.add(msg) + conversationStore.addIncoming(accountId, msg) + + // 处理订单状态消息 + if (msg.isOrderMessage && msg.orderId) { + goofishLogger.info(`订单消息: orderId=${msg.orderId}`) + handleOrderMessage(accountId, msg.orderId, msg.chatId) + fetchOrderDetailAsync(accountId, msg.orderId) + } + + // 异步获取用户头像(不阻塞消息处理) + fetchUserAvatarAsync(accountId, msg.chatId, msg.senderId) + }) + + // 设置 API 客户端管理器引用 + setClientManager(clientManager) + + // 从数据库加载并启动所有启用的账号 + await clientManager.startAll() + + goofishLogger.info('Goofish 服务初始化完成') +} + +// 异步获取用户头像 +async function fetchUserAvatarAsync(accountId: string, chatId: string, userId: string) { + try { + const { userHead } = await fetchUserHead(accountId, userId) + if (userHead?.avatar) { + conversationStore.updateUserAvatar(accountId, chatId, userHead.avatar) + } + } catch (e) { + goofishLogger.debug(`获取用户头像失败: ${e}`) + } +} + +// 异步获取订单详情 +async function fetchOrderDetailAsync(accountId: string, orderId: string) { + try { + const client = clientManager.getClient(accountId) + if (!client) { + goofishLogger.warn(`获取订单详情失败: 账号 ${accountId} 客户端不存在`) + return + } + await fetchAndUpdateOrderDetail(client, orderId) + } catch (e) { + goofishLogger.debug(`获取订单详情失败: ${e}`) + } +} + +// 获取局域网 IP 地址 +function getLocalIP(): string { + const nets = networkInterfaces() + for (const name of Object.keys(nets)) { + for (const net of nets[name] || []) { + if (net.family === 'IPv4' && !net.internal) { + return net.address + } + } + } + return 'localhost' +} + +const localIP = getLocalIP() + +// 环境判断 +const isDev = process.env.NODE_ENV !== 'production' + +// CORS 配置 +app.use('/*', cors({ + origin: isDev ? '*' : (origin) => resolveCorsOrigin(origin), + allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'PATCH'], + allowHeaders: ['Content-Type', 'Authorization', 'X-Requested-With'], + credentials: true, + maxAge: 86400, +})) + +// WebSocket 不受浏览器 CORS 机制保护,需要单独校验 Origin。 +app.use('/ws', async (c, next) => { + const origin = c.req.header('Origin') + if (!isDev && (!origin || !isAllowedFrontendOrigin(origin) || !isAuthorizedGoofishRequest(c))) { + return c.json({ error: 'Forbidden WebSocket request' }, 403) + } + return next() +}) + +// Space 后端公开在 *.hf.space,所有业务 API 必须验证站点 JWT。 +app.use('/api/*', goofishAuthMiddleware) + +// 日志中间件 +app.use('/*', logger()) + +// 请求计时中间件 +app.use('/*', async (c, next) => { + const start = Date.now() + await next() + const duration = Date.now() - start + c.header('X-Response-Time', `${duration}ms`) +}) + +// WebSocket 推送端点 +app.get('/ws', upgradeWebSocket(() => createWSPushHandler(() => clientManager))) + +// 健康检查 +app.get('/health', (c) => { + return c.json({ + status: 'ok', + environment: isDev ? 'development' : 'production', + timestamp: new Date().toISOString(), + version: '4.0.0' + }) +}) + +// API 路由信息 +app.get('/api/info', (c) => { + return c.json({ + message: 'API Proxy Server', + version: '4.0.0', + environment: isDev ? 'development' : 'production', + endpoints: { + '/health': 'Health check endpoint', + '/api/translate': 'Baidu Translate API proxy', + '/api/kuaikan/*': 'Kuaikan Manhua API proxy (PC)', + '/api/kuaikan-m/*': 'Kuaikan Manhua API proxy (Mobile)', + '/api/netease/*': 'Netease Cloud Music API proxy', + '/api/latex': 'LaTeX compilation API proxy', + '/ws': 'WebSocket endpoint', + '/api/accounts': 'Goofish account management', + '/api/conversations': 'Goofish conversations', + '/api/orders': 'Goofish orders', + '/api/autoreply': 'Auto reply rules', + '/api/autosell': 'Auto sell rules', + '/api/workflows': 'Workflow management', + '/api/logs': 'System logs', + '/api/auth': 'User authentication (login, register)', + '/api/info': 'This endpoint', + }, + timestamp: new Date().toISOString() + }) +}) + +// Goofish 路由(必须在代理中间件之前注册) +const getClientManager = () => clientManager +app.route('/', createStatusRoutes(getClientManager)) +app.route('/api', createStatusRoutes(getClientManager)) +app.route('/api/accounts', createAccountRoutes(getClientManager)) +app.route('/api/goods', createGoodsRoutes(getClientManager)) +app.route('/api/messages', createMessageRoutes(getClientManager)) +app.route('/api/conversations', createConversationRoutes()) +app.route('/api/logs', createLogsRoutes()) +app.route('/api/autoreply', createAutoReplyRoutes()) +app.route('/api/orders', createOrderRoutes(getClientManager)) +app.route('/api/autosell', createAutoSellRoutes()) +app.route('/api/workflows', createWorkflowRoutes()) +app.route('/api/auth', authRoute) + +// LaTeX 编译 API 代理 +app.post('/api/latex/compile', async (c) => { + try { + const { code, compiler = 'xelatex', files = [] } = await c.req.json() + + // 添加时间戳确保请求唯一性 + const timestamp = new Date().toISOString() + console.log(`[${timestamp}] LaTeX 编译请求`) + + if (!code || typeof code !== 'string') { + return c.json({ + success: false, + error: '请提供有效的 LaTeX 代码' + }, 400) + } + + console.log('LaTeX 编译请求:', { + compiler, + codeLength: code.length, + codePreview: code.substring(0, 100) + (code.length > 100 ? '...' : ''), + filesCount: files.length, + files: files.map((f: any) => ({ name: f.name, contentLength: f.content?.length })) + }) + + // 如果有图片文件,使用正确的 API 格式传递 + let processedCode = code + if (files && files.length > 0) { + console.log('检测到图片文件,使用多文件资源格式') + } + + // 检测是否包含中文字符 + const hasChinese = /[一-龥]/.test(processedCode) + console.log('包含中文:', hasChinese) + + // 如果包含中文,尝试使用专门处理中文的服务 + if (hasChinese) { + console.log('检测到中文内容,使用特殊的中文处理方案') + + // 方案1: 尝试使用 Overleaf-style API + try { + const overleafUrl = 'https://compile.overleaf.com/docs' + + // 构建文件列表:主文件(图片已嵌入) + const requestFiles: any[] = [{ + name: 'main.tex', + content: processedCode + }] + + // 不再需要添加附加文件,因为图片已经嵌入到代码中 + + const response = await fetch(overleafUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + compiler: compiler, + files: requestFiles, + options: { + timeout: 60 + } + }), + }) + + if (response.ok) { + const data = await response.json() + if (data.pdfs && data.pdfs['main.pdf']) { + const pdfData = data.pdfs['main.pdf'] + const pdfBuffer = Buffer.from(pdfData, 'base64') + + return new Response(pdfBuffer, { + headers: { + 'Content-Type': 'application/pdf', + 'Content-Disposition': 'attachment; filename="document.pdf"', + 'Access-Control-Allow-Origin': '*', + }, + }) + } + } + } catch (error) { + console.error('Overleaf API 失败:', error) + } + + // 方案2: 修改LaTeX代码以使用更通用的字体设置 + console.log('尝试修改LaTeX代码以支持中文') + let modifiedCode = processedCode // 使用已经处理过(包含图片)的代码 + + // 如果代码中没有ctex相关包,添加中文支持 + if (!processedCode.includes('ctex') && !processedCode.includes('CJK')) { + // 在documentclass后添加中文支持 + modifiedCode = processedCode.replace( + /\\documentclass(\[[^\]]*\])?\{([^}]+)\}/, + (match, options, docclass) => { + if (docclass === 'ctexart') { + return match // 已经是ctexart,不修改 + } + return `\\documentclass${options || ''}{${docclass}}\n\\usepackage{CJKutf8}\n\\usepackage{CJK}` + } + ) + + // 在document环境中添加CJK支持 + if (modifiedCode.includes('\\begin{document}')) { + modifiedCode = modifiedCode.replace( + '\\begin{document}', + '\\begin{document}\n\\begin{CJK*}{UTF8}{gbsn}' + ) + } + + if (modifiedCode.includes('\\end{document}')) { + modifiedCode = modifiedCode.replace( + '\\end{document}', + '\\end{CJK*}\n\\end{document}' + ) + } + } + + console.log('修改后的代码预览:', modifiedCode.substring(0, 200) + '...') + + // 使用修改后的代码尝试编译 + const latexApiUrl = 'https://latex.ytotech.com/builds/sync' + + // 构建请求数据 - 使用正确的 resources 格式 + const resources: any[] = [{ + main: true, + content: modifiedCode + }] + + // 添加附加文件(图片等)- 使用正确的格式 + if (files && files.length > 0) { + for (const file of files) { + if (file.name && file.content) { + // 提取纯 base64 数据(去掉 data:image/...;base64, 前缀) + let base64Data = file.content + if (base64Data.startsWith('data:')) { + base64Data = base64Data.split(',')[1] || base64Data + } + + // 使用正确的 API 格式:path + file + resources.push({ + path: file.name, + file: base64Data + }) + + console.log(`添加图片资源(中文处理): ${file.name}`) + } + } + } + + const requestData = { + compiler: compiler, + resources: resources + } + + console.log('发送到 LaTeX API 的请求(中文处理):', { + compiler, + codeLength: modifiedCode.length, + 资源数量: resources.length, + 包含图片: files && files.length > 0 + }) + + const response = await fetch(latexApiUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData), + }) + + if (response.ok) { + const contentType = response.headers.get('content-type') || '' + if (contentType.includes('application/pdf')) { + const pdfBuffer = await response.arrayBuffer() + console.log('中文PDF生成成功,大小:', pdfBuffer.byteLength, '字节') + + return new Response(pdfBuffer, { + headers: { + 'Content-Type': 'application/pdf', + 'Content-Disposition': 'attachment; filename="document.pdf"', + 'Access-Control-Allow-Origin': '*', + }, + }) + } + } + } + + // 非中文内容或中文处理失败,使用标准流程 + const latexApiUrl = 'https://latex.ytotech.com/builds/sync' + + // 构建请求数据 - 使用正确的 resources 格式 + const resources: any[] = [{ + main: true, + content: processedCode + }] + + // 添加附加文件(图片等)- 使用正确的格式 + if (files && files.length > 0) { + for (const file of files) { + if (file.name && file.content) { + // 提取纯 base64 数据(去掉 data:image/...;base64, 前缀) + let base64Data = file.content + if (base64Data.startsWith('data:')) { + base64Data = base64Data.split(',')[1] || base64Data + } + + // 使用正确的 API 格式:path + file + resources.push({ + path: file.name, + file: base64Data + }) + + console.log(`添加图片资源: ${file.name}`) + } + } + } + + const requestData = { + compiler: compiler, + resources: resources + } + + console.log('发送到 LaTeX API 的请求:', { + compiler, + codeLength: processedCode.length, + 资源数量: resources.length, + 包含图片: files && files.length > 0 + }) + + const response = await fetch(latexApiUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData), + }) + + console.log('API 响应状态:', response.status, response.statusText) + + if (!response.ok) { + const errorText = await response.text() + console.error('LaTeX API 错误响应:', errorText) + console.error('请求体详情:', JSON.stringify(requestData, null, 2)) + throw new Error(`LaTeX API 返回错误: ${response.status} ${response.statusText} - ${errorText}`) + } + + const contentType = response.headers.get('content-type') || '' + console.log('响应内容类型:', contentType) + + if (contentType.includes('application/pdf')) { + const pdfBuffer = await response.arrayBuffer() + console.log('PDF 生成成功,大小:', pdfBuffer.byteLength, '字节') + + return new Response(pdfBuffer, { + headers: { + 'Content-Type': 'application/pdf', + 'Content-Disposition': 'attachment; filename="document.pdf"', + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', + 'Access-Control-Allow-Headers': 'Content-Type, Authorization', + }, + }) + } + + const errorText = await response.text() + console.error('非 PDF 响应:', errorText) + return c.json({ + success: false, + error: `编译失败,服务器返回非 PDF 内容: ${errorText.substring(0, 200)}` + }, 500) + + } catch (error) { + console.error('LaTeX 编译代理错误:', error) + + const errorMessage = error instanceof Error ? error.message : '未知错误' + return c.json({ + success: false, + error: `LaTeX 编译失败: ${errorMessage}` + }, 500) + } +}) + +// LaTeX 编译健康检查 +app.get('/api/latex/health', async (c) => { + try { + const testCode = '\\documentclass{article}\\begin{document}Hello World\\end{document}' + const response = await fetch(`https://latex.ytotech.com/builds/sync?content=${encodeURIComponent(testCode)}`, { + method: 'GET', + }) + + return c.json({ + status: response.ok ? 'available' : 'unavailable', + statusCode: response.status, + timestamp: new Date().toISOString() + }) + } catch (error) { + return c.json({ + status: 'error', + error: error instanceof Error ? error.message : '未知错误', + timestamp: new Date().toISOString() + }, 503) + } +}) + +// 视频下载API代理 +app.post('/api/resolve', async (c) => { + const targetUrl = 'https://xiazaishipin.com/api/resolve' + + try { + const body = await c.req.json() + console.log('[Video API] 解析请求:', body.url?.substring(0, 50)) + + const response = await fetch(targetUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Referer': 'https://xiazaishipin.com/', + 'Origin': 'https://xiazaishipin.com', + 'Accept': 'application/json, text/plain, */*', + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', + }, + body: JSON.stringify(body), + }) + + const responseData = await response.json() + console.log('[Video API] 解析成功:', responseData.title) + + // 将thumbnail URL替换为代理URL + if (responseData.thumbnail) { + responseData.thumbnail = `/api/image-proxy?url=${encodeURIComponent(responseData.thumbnail)}` + } + + return c.json(responseData, response.status as any) + } catch (error) { + console.error('[Video API] 错误:', error) + return c.json({ + error: '视频解析失败', + message: error instanceof Error ? error.message : 'Unknown error' + }, 500) + } +}) + +// 图片代理 - 绕过防盗链 +app.get('/api/image-proxy', async (c) => { + const imageUrl = c.req.query('url') + + if (!imageUrl) { + return c.json({ error: 'Missing url parameter' }, 400) + } + + try { + console.log('[Image Proxy] 代理图片:', imageUrl.substring(0, 80)) + + const response = await fetch(imageUrl, { + headers: { + 'Referer': 'https://www.bilibili.com/', + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', + }, + }) + + if (!response.ok) { + throw new Error(`Failed to fetch image: ${response.status}`) + } + + const imageBuffer = await response.arrayBuffer() + const contentType = response.headers.get('Content-Type') || 'image/jpeg' + + return new Response(imageBuffer, { + headers: { + 'Content-Type': contentType, + 'Cache-Control': 'public, max-age=86400', // 缓存1天 + }, + }) + } catch (error) { + console.error('[Image Proxy] 错误:', error) + return c.json({ + error: 'Failed to proxy image', + message: error instanceof Error ? error.message : 'Unknown error' + }, 500) + } +}) + +// B站视频下载代理 +app.post('/api/bilibili-download', async (c) => { + const targetUrl = 'https://xiazaishipin.com/api/bilibili-download' + + try { + const body = await c.req.json() + console.log('[Bilibili Download] 下载请求:', body.url?.substring(0, 50)) + + const response = await fetch(targetUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Referer': 'https://xiazaishipin.com/', + 'Origin': 'https://xiazaishipin.com', + 'Accept': '*/*', + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', + }, + body: JSON.stringify(body), + }) + + console.log('[Bilibili Download] 下载响应:', response.status, response.headers.get('content-type')) + + // 检查响应类型 + const contentType = response.headers.get('content-type') || '' + + if (contentType.includes('application/json')) { + // JSON响应 - 可能包含下载链接或错误信息 + const jsonData = await response.json() + return c.json(jsonData) + } else { + // 视频文件响应 - 流式转发以支持前端进度显示 + const reader = response.body?.getReader() + + if (!reader) { + throw new Error('无法获取响应流') + } + + // 创建一个新的 ReadableStream 来转发数据 + const stream = new ReadableStream({ + async start(controller) { + try { + while (true) { + const { done, value } = await reader.read() + if (done) { + controller.close() + break + } + controller.enqueue(value) + } + } catch (error) { + console.error('[Bilibili Download] 流传输错误:', error) + controller.error(error) + } finally { + reader.releaseLock() + } + } + }) + + return new Response(stream, { + status: response.status, + headers: { + 'Content-Type': contentType, + 'Content-Disposition': response.headers.get('Content-Disposition') || `attachment; filename="video.mp4"`, + 'Content-Length': response.headers.get('Content-Length') || '', + 'Cache-Control': 'no-cache', + }, + }) + } + } catch (error) { + console.error('[Bilibili Download] 错误:', error) + return c.json({ + error: 'B站视频下载失败', + message: error instanceof Error ? error.message : 'Unknown error' + }, 500) + } +}) + +// 抖音和小红书视频下载代理 +app.post('/api/proxy-download', async (c) => { + const targetUrl = 'https://xiazaishipin.com/api/proxy-download' + + try { + const body = await c.req.json() + console.log('[Douyin Download] 下载请求:', body.url?.substring(0, 50), 'filename:', body.filename) + + const response = await fetch(targetUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Referer': 'https://xiazaishipin.com/', + 'Origin': 'https://xiazaishipin.com', + 'Accept': '*/*', + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', + }, + body: JSON.stringify(body), + }) + + console.log('[Douyin Download] 下载响应:', response.status, response.headers.get('content-type')) + + // 检查响应类型 + const contentType = response.headers.get('content-type') || '' + + if (contentType.includes('application/json')) { + // JSON响应 - 可能包含错误信息 + const jsonData = await response.json() + return c.json(jsonData) + } else { + // 视频文件响应 - 流式转发以支持前端进度显示 + const reader = response.body?.getReader() + + if (!reader) { + throw new Error('无法获取响应流') + } + + // 创建一个新的 ReadableStream 来转发数据 + const stream = new ReadableStream({ + async start(controller) { + try { + while (true) { + const { done, value } = await reader.read() + if (done) { + controller.close() + break + } + controller.enqueue(value) + } + } catch (error) { + console.error('[Douyin Download] 流传输错误:', error) + controller.error(error) + } finally { + reader.releaseLock() + } + } + }) + + return new Response(stream, { + status: response.status, + headers: { + 'Content-Type': contentType, + 'Content-Disposition': response.headers.get('Content-Disposition') || `attachment; filename="${body.filename || 'video.mp4'}"`, + 'Content-Length': response.headers.get('Content-Length') || '', + 'Cache-Control': 'no-cache', + }, + }) + } + } catch (error) { + console.error('[Douyin Download] 错误:', error) + return c.json({ + error: '抖音视频下载失败', + message: error instanceof Error ? error.message : 'Unknown error' + }, 500) + } +}) + +// 代理配置映射 +const PROXY_CONFIG: Record +}> = { + '/api/translate': { + target: 'https://fanyi-api.baidu.com/api/trans/vip', + pathRewrite: '/translate', + timeout: 10000, + headers: { + 'Referer': 'https://fanyi.baidu.com/', + 'Origin': 'https://fanyi.baidu.com', + }, + }, + '/api/kuaikan': { + target: 'https://www.kuaikanmanhua.com', + pathRewrite: '', + timeout: 15000, + headers: { + 'Referer': 'https://www.kuaikanmanhua.com/', + 'Origin': 'https://www.kuaikanmanhua.com', + }, + }, + '/api/kuaikan-m': { + target: 'https://m.kuaikanmanhua.com', + pathRewrite: '', + timeout: 15000, + headers: { + 'Referer': 'https://m.kuaikanmanhua.com/', + 'Origin': 'https://m.kuaikanmanhua.com', + }, + }, + '/api/netease': { + target: 'https://netease-cloud-music-api.fe-mm.com', + pathRewrite: '', + timeout: 10000, + headers: { + 'Referer': 'https://netease-cloud-music-api.fe-mm.com/', + }, + }, +} + +// 匹配代理目标(优先匹配最长路径) +function matchProxyTarget(path: string): { prefix: string; config: typeof PROXY_CONFIG[keyof typeof PROXY_CONFIG] } | null { + // 排除 Goofish 路由和认证路由 + const goofishRoutes = ['/api/accounts', '/api/goods', '/api/messages', '/api/conversations', '/api/logs', '/api/autoreply', '/api/orders', '/api/autosell', '/api/workflows', '/api/status', '/api/auth', '/ws'] + for (const route of goofishRoutes) { + if (path.startsWith(route)) { + return null + } + } + + const sortedPrefixes = Object.keys(PROXY_CONFIG).sort((a, b) => b.length - a.length) + for (const prefix of sortedPrefixes) { + if (path.startsWith(prefix)) { + return { prefix, config: PROXY_CONFIG[prefix] } + } + } + return null +} + +// 路径重写 +function rewritePath(path: string, prefix: string, replacement: string): string { + return path.replace(new RegExp(`^${prefix}`), replacement) +} + +// 请求缓存(仅用于开发环境) +const cache = new Map() +const CACHE_TTL = 5 * 60 * 1000 // 5分钟 + +// 代理中间件(必须在所有 goofish 路由之后注册) +app.all('/api/*', async (c, next) => { + const path = c.req.path + const method = c.req.method + + // 添加调试日志 + console.log(`[Proxy] ${method} ${path}`) + + // 检查是否是 goofish 路由,如果是则跳过代理处理,让下一个处理程序处理 + const goofishRoutes = ['/api/accounts', '/api/goods', '/api/messages', '/api/conversations', '/api/logs', '/api/autoreply', '/api/orders', '/api/autosell', '/api/workflows', '/api/status', '/api/info', '/api/auth'] + for (const route of goofishRoutes) { + if (path.startsWith(route)) { + // 这是一个 goofish 路由,让下一个处理程序处理 + console.log(`[Proxy] Skipping goofish route: ${path}`) + return next() + } + } + + const matched = matchProxyTarget(path) + + if (!matched) { + console.log(`[Proxy] No proxy target found for: ${path}`) + return c.json( + { + error: 'No proxy target found', + availableEndpoints: Object.keys(PROXY_CONFIG), + path: path, + }, + 404 + ) + } + + console.log(`[Proxy] Matched target for ${path}:`, matched.prefix, '->', matched.config.target) + + const { prefix, config } = matched + const { target, pathRewrite, timeout = 10000, headers: customHeaders = {} } = config + + // 构建目标URL + const rewrittenPath = rewritePath(path, prefix, pathRewrite) + const queryString = c.req.query() + const queryParams = new URLSearchParams(queryString).toString() + const targetUrl = `${target}${rewrittenPath}${queryParams ? `?${queryParams}` : ''}` + + // 检查缓存(仅GET请求) + if (isDev && c.req.method === 'GET') { + const cached = cache.get(targetUrl) + if (cached && cached.expiry > Date.now()) { + return new Response(cached.data, { + status: 200, + headers: { + 'Content-Type': 'application/json', + 'X-Cache': 'HIT', + }, + }) + } + } + + try { + // 构建 AbortController 用于超时控制 + const controller = new AbortController() + const timeoutId = setTimeout(() => controller.abort(), timeout) + + // 获取请求体(非 GET/HEAD 请求) + let body: ArrayBuffer | undefined + if (c.req.method !== 'GET' && c.req.method !== 'HEAD') { + body = await c.req.arrayBuffer() + } + + console.log(`[Proxy] Forwarding ${c.req.method} request to: ${targetUrl}`) + if (body) { + console.log(`[Proxy] Request body:`, new TextDecoder().decode(body)) + } + + // 转发请求 + const response = await fetch(targetUrl, { + method: c.req.method, + headers: { + 'Content-Type': c.req.header('Content-Type') || 'application/json', + 'User-Agent': c.req.header('User-Agent') || + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', + 'Accept': 'application/json, text/plain, */*', + 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', + ...customHeaders, + }, + body, + signal: controller.signal, + }) + + clearTimeout(timeoutId) + + console.log(`[Proxy] Response status: ${response.status} ${response.statusText}`) + + // 获取响应内容 + const responseData = await response.arrayBuffer() + + // 缓存成功的 GET 响应 + if (isDev && c.req.method === 'GET' && response.ok) { + cache.set(targetUrl, { + data: responseData, + expiry: Date.now() + CACHE_TTL, + }) + // 限制缓存大小 + if (cache.size > 100) { + const firstKey = cache.keys().next().value + if (firstKey) cache.delete(firstKey) + } + } + + // 返回响应 + return new Response(responseData, { + status: response.status, + statusText: response.statusText, + headers: { + 'Content-Type': response.headers.get('Content-Type') || 'application/json', + 'X-Cache': 'MISS', + 'Access-Control-Expose-Headers': 'Content-Type, X-Cache, X-Response-Time', + }, + }) + } catch (error) { + // 清理超时的缓存 + if (c.req.method === 'GET') { + cache.delete(targetUrl) + } + + const errorMessage = error instanceof Error ? error.message : 'Unknown error' + const isAbort = error instanceof Error && error.name === 'AbortError' + + console.error('Proxy error:', { + url: targetUrl, + method: c.req.method, + error: errorMessage, + timestamp: new Date().toISOString(), + }) + + return c.json( + { + error: isAbort ? 'Request timeout' : 'Proxy request failed', + message: errorMessage, + target: targetUrl, + method: c.req.method, + timestamp: new Date().toISOString(), + }, + isAbort ? 504 : 502 + ) + } +}) + +// 404 处理 +app.notFound((c) => { + return c.json({ + error: 'Not Found', + message: `Route ${c.req.method} ${c.req.path} not found`, + availableRoutes: [ + 'GET /health', + 'GET /ws', + 'GET /api/info', + '/api/accounts/*', + '/api/conversations/*', + '/api/orders/*', + '/api/autoreply/*', + '/api/autosell/*', + '/api/workflows/*', + '/api/logs/*', + '/api/auth/*', + 'ALL /api/* (proxy)', + ], + }, 404) +}) + +// 错误处理 +app.onError((err, c) => { + console.error('Server error:', err) + return c.json({ + error: 'Internal Server Error', + message: err.message, + timestamp: new Date().toISOString(), + }, 500) +}) + +// 启动服务器 +const port = Number(process.env.PORT) || 3001 +const hostname = '0.0.0.0' + +console.log('\n' + '='.repeat(50)) +console.log(`Hono Proxy Server with Goofish`) +console.log('='.repeat(50)) +console.log(`Environment: ${isDev ? 'development' : 'production'}`) +console.log(`Local access: http://localhost:${port}`) +console.log(`Network access: http://${localIP}:${port}`) +console.log(`API info: http://${localIP}:${port}/api/info`) +console.log(`Health check: http://${localIP}:${port}/health`) +console.log(`WebSocket: ws://${localIP}:${port}/ws`) +console.log('='.repeat(50) + '\n') + +// 初始化 Goofish 后启动服务器 +initGoofish().then(() => { + const server = serve({ + fetch: app.fetch, + port, + hostname, + }) + + // 注入 WebSocket 支持 + injectWebSocket(server) + + // 优雅退出 + process.on('SIGINT', () => { + goofishLogger.info('收到退出信号,正在断开连接...') + if (clientManager) { + clientManager.stopAll() + } + closeDatabase() + process.exit(0) + }) + + process.on('SIGTERM', () => { + goofishLogger.info('收到终止信号,正在断开连接...') + if (clientManager) { + clientManager.stopAll() + } + closeDatabase() + process.exit(0) + }) +}).catch((err) => { + console.error('Failed to initialize Goofish:', err) + process.exit(1) +}) diff --git a/goofish_backend/src/services/turnstile.ts b/goofish_backend/src/services/turnstile.ts new file mode 100644 index 0000000..dcf9c42 --- /dev/null +++ b/goofish_backend/src/services/turnstile.ts @@ -0,0 +1,58 @@ +/** + * Cloudflare Turnstile 验证服务 + */ + +const TURNSTILE_SECRET_KEY = process.env.TURNSTILE_SECRET_KEY || '' +const TURNSTILE_VERIFY_URL = 'https://challenges.cloudflare.com/turnstile/v0/siteverify' + +export interface TurnstileVerifyResult { + success: boolean + 'error-codes'?: string[] + validation?: string + expire?: string +} + +/** + * 验证 Turnstile token + */ +export async function verifyTurnstileToken(token: string): Promise<{ + success: boolean + error?: string +}> { + if (!TURNSTILE_SECRET_KEY) { + console.warn('Turnstile secret key not configured, skipping verification') + return { success: true } + } + + try { + const response = await fetch(TURNSTILE_VERIFY_URL, { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: new URLSearchParams({ + secret: TURNSTILE_SECRET_KEY, + response: token, + }), + }) + + const result: TurnstileVerifyResult = await response.json() + + if (result.success) { + return { success: true } + } else { + const errorCodes = result['error-codes'] || [] + console.error('Turnstile verification failed:', errorCodes) + return { + success: false, + error: errorCodes.length > 0 ? errorCodes.join(', ') : 'Verification failed', + } + } + } catch (error) { + console.error('Turnstile verification error:', error) + return { + success: false, + error: 'Verification service unavailable', + } + } +} diff --git a/goofish_backend/tsconfig.json b/goofish_backend/tsconfig.json new file mode 100644 index 0000000..454ff02 --- /dev/null +++ b/goofish_backend/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "types": ["node"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Path aliases */ + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + }, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src", "api"], + "exclude": ["src/services/server.ts", "src/services/worker.ts", "src/goofish"], + "references": [{ "path": "./tsconfig.node.json" }] +} \ No newline at end of file diff --git a/goofish_backend/tsconfig.node.json b/goofish_backend/tsconfig.node.json new file mode 100644 index 0000000..b940375 --- /dev/null +++ b/goofish_backend/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "types": ["node"] + }, + "include": ["vite.config.ts"] +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..96a7a5a --- /dev/null +++ b/index.html @@ -0,0 +1,201 @@ + + + + + + + + ChattyPlay + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/office_pixel/Dockerfile b/office_pixel/Dockerfile new file mode 100644 index 0000000..58d538a --- /dev/null +++ b/office_pixel/Dockerfile @@ -0,0 +1,18 @@ +# HuggingFace Space — OpenClaw Virtual Office +# Docker SDK image. Serves the FastAPI app on port 7860. + +FROM python:3.11-slim + +WORKDIR /app + +# Install Python dependencies first for better layer caching. +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +# Copy the rest of the project (app, dashboard, assets, config). +COPY . . + +EXPOSE 7860 + +# FastAPI listens on 0.0.0.0:7860 — the port declared in README.md (app_port). +CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"] diff --git a/office_pixel/README.md b/office_pixel/README.md new file mode 100644 index 0000000..41a988e --- /dev/null +++ b/office_pixel/README.md @@ -0,0 +1,3 @@ +该项目部署于Hugging face的Spaces上 + +在线地址:https://chatty-play-agent.vercel.app/worker diff --git a/office_pixel/app.py b/office_pixel/app.py new file mode 100644 index 0000000..f65cfb5 --- /dev/null +++ b/office_pixel/app.py @@ -0,0 +1,155 @@ +import os +import time +import json +from pathlib import Path + +from fastapi import FastAPI +from fastapi.responses import JSONResponse, FileResponse +from fastapi.staticfiles import StaticFiles + +BASE_DIR = Path(__file__).parent.resolve() +ASSETS_DIR = BASE_DIR / "assets" +INDEX_FILE = BASE_DIR / "index.html" +CONFIG_FILE = BASE_DIR / "config.json" + +PORT = int(os.environ.get("PORT", 7860)) + +app = FastAPI(title="OpenClaw Virtual Office") + + +def load_config() -> dict: + try: + with open(CONFIG_FILE, encoding="utf-8") as f: + return json.load(f) + except Exception as e: + print(f"[Config] Could not load config.json: {e}") + return {"title": "OpenClaw Virtual Office", "agents": []} + + +CONFIG = load_config() +AGENTS = CONFIG.get("agents", []) +START_TIME = 0 + + +TASK_POOL = [ + "修复线上Bug", + "编写单元测试", + "代码审查与合并请求", + "设计数据库表结构", + "开发新API接口", + "前端页面切版与适配", + "搭建开发环境与依赖", + "性能压测与调优", + "撰写接口文档", + "部署测试环境", + "重构旧模块代码", + "排查内存泄漏问题", + "实现用户认证与权限模块", + "对接第三方支付接口", + "优化SQL查询性能", + "配置CI/CD流水线", + "编写集成测试用例", + "升级依赖库版本", + "处理跨域与安全策略", + "设计缓存策略与Redis接入", + "实现消息队列消费者", + "开发定时任务脚本", + "搭建微服务网关", + "编写Dockerfile与容器化部署", + "实现日志收集与监控告警", + "设计分布式锁方案", + "开发文件上传与处理功能", + "实现数据导出报表功能", + "优化前端首屏加载速度", + "处理并发冲突与事务管理", + "编写架构设计文档", + "进行技术选型与评估", + "搭建本地开发环境", + "维护公共组件库", + "实现WebSocket实时通信", + "配置Nginx反向代理", + "编写数据库迁移脚本", + "实现搜索功能与索引优化", + "开发管理后台仪表盘", + "处理异常与全局错误拦截", + "实现多语言国际化", + "配置日志分级与存储", + "编写运维部署手册", +] + +STATUS_CYCLE = ["busy", "online", "busy", "idle", "online", "idle", "offline"] + + +def _now_ms() -> int: + return int(time.time() * 1000) + + +def _task_for(agent_id: int, tick: int) -> str: + idx = (agent_id + tick) % len(TASK_POOL) + return TASK_POOL[idx] + + +def build_status() -> dict: + now = _now_ms() + agents_out = [] + + for i, agent in enumerate(AGENTS): + step_len = 45 + offset = i * 13 + tick = (now // 1000 // step_len) + offset + status = STATUS_CYCLE[tick % len(STATUS_CYCLE)] + + if status == "busy": + last_active = (now // 1000) % 2 # 0-1 min + elif status == "online": + last_active = 2 + ((now // 1000) % 8) # 2-9 min + elif status == "idle": + last_active = 10 + ((now // 1000) % 40) # 10-49 min + else: + last_active = 61 + ((now // 1000) % 30) + + if status == "offline": + task = "尚未建立 session" + tokens = 0 + else: + task = _task_for(i, tick) + tokens = 1200 + (i * 537) + (tick * 89 % 4000) + + agents_out.append({ + "id": agent.get("id", f"agent-{i}"), + "name": agent.get("name", "Agent"), + "sprite": agent.get("sprite", "agent-boss"), + "role": agent.get("role", ""), + "status": status, + "task": task, + "lastActive": last_active, + "session": f"oc_demo_{agent.get('id', i)}", + "tokens": tokens, + }) + + return { + "title": CONFIG.get("title", "OpenClaw Virtual Office"), + "timestamp": now, + "agents": agents_out, + } + + +@app.get("/api/status") +def api_status(): + """Current agent status (polled by the dashboard).""" + return JSONResponse(build_status()) + + +@app.get("/") +def index(): + return FileResponse(INDEX_FILE) + + +app.mount("", StaticFiles(directory=str(BASE_DIR)), name="root") + + +if __name__ == "__main__": + import uvicorn + print(f" http://0.0.0.0:{PORT}") + print(f" Agents: {len(AGENTS)} configured (simulated data)\n") + uvicorn.run(app, host="0.0.0.0", port=PORT) diff --git a/office_pixel/assets/office/Chair.png b/office_pixel/assets/office/Chair.png new file mode 100644 index 0000000..c9789e7 Binary files /dev/null and b/office_pixel/assets/office/Chair.png differ diff --git a/office_pixel/assets/office/Julia-Idle.png b/office_pixel/assets/office/Julia-Idle.png new file mode 100644 index 0000000..9616291 Binary files /dev/null and b/office_pixel/assets/office/Julia-Idle.png differ diff --git a/office_pixel/assets/office/Julia.png b/office_pixel/assets/office/Julia.png new file mode 100644 index 0000000..570e602 Binary files /dev/null and b/office_pixel/assets/office/Julia.png differ diff --git a/office_pixel/assets/office/Julia_Drinking_Coffee.png b/office_pixel/assets/office/Julia_Drinking_Coffee.png new file mode 100644 index 0000000..4968eb2 Binary files /dev/null and b/office_pixel/assets/office/Julia_Drinking_Coffee.png differ diff --git a/office_pixel/assets/office/Julia_PC.png b/office_pixel/assets/office/Julia_PC.png new file mode 100644 index 0000000..9311ee1 Binary files /dev/null and b/office_pixel/assets/office/Julia_PC.png differ diff --git a/office_pixel/assets/office/Julia_walk_Foward.png b/office_pixel/assets/office/Julia_walk_Foward.png new file mode 100644 index 0000000..eefbc47 Binary files /dev/null and b/office_pixel/assets/office/Julia_walk_Foward.png differ diff --git a/office_pixel/assets/office/Julia_walk_Left.png b/office_pixel/assets/office/Julia_walk_Left.png new file mode 100644 index 0000000..dd3992d Binary files /dev/null and b/office_pixel/assets/office/Julia_walk_Left.png differ diff --git a/office_pixel/assets/office/Julia_walk_Rigth.png b/office_pixel/assets/office/Julia_walk_Rigth.png new file mode 100644 index 0000000..fb95c24 Binary files /dev/null and b/office_pixel/assets/office/Julia_walk_Rigth.png differ diff --git a/office_pixel/assets/office/Julia_walk_Up.png b/office_pixel/assets/office/Julia_walk_Up.png new file mode 100644 index 0000000..62e5b96 Binary files /dev/null and b/office_pixel/assets/office/Julia_walk_Up.png differ diff --git a/office_pixel/assets/office/PC1.png b/office_pixel/assets/office/PC1.png new file mode 100644 index 0000000..f0b647b Binary files /dev/null and b/office_pixel/assets/office/PC1.png differ diff --git a/office_pixel/assets/office/PC2.png b/office_pixel/assets/office/PC2.png new file mode 100644 index 0000000..3de8c9e Binary files /dev/null and b/office_pixel/assets/office/PC2.png differ diff --git a/office_pixel/assets/office/Trash.png b/office_pixel/assets/office/Trash.png new file mode 100644 index 0000000..051a5f4 Binary files /dev/null and b/office_pixel/assets/office/Trash.png differ diff --git a/office_pixel/assets/office/agent-admin-full.png b/office_pixel/assets/office/agent-admin-full.png new file mode 100644 index 0000000..99cc1a6 Binary files /dev/null and b/office_pixel/assets/office/agent-admin-full.png differ diff --git a/office_pixel/assets/office/agent-admin-walk-down.png b/office_pixel/assets/office/agent-admin-walk-down.png new file mode 100644 index 0000000..475a134 Binary files /dev/null and b/office_pixel/assets/office/agent-admin-walk-down.png differ diff --git a/office_pixel/assets/office/agent-admin-walk-left.png b/office_pixel/assets/office/agent-admin-walk-left.png new file mode 100644 index 0000000..24129bf Binary files /dev/null and b/office_pixel/assets/office/agent-admin-walk-left.png differ diff --git a/office_pixel/assets/office/agent-admin-walk-right.png b/office_pixel/assets/office/agent-admin-walk-right.png new file mode 100644 index 0000000..8619484 Binary files /dev/null and b/office_pixel/assets/office/agent-admin-walk-right.png differ diff --git a/office_pixel/assets/office/agent-admin-walk-up.png b/office_pixel/assets/office/agent-admin-walk-up.png new file mode 100644 index 0000000..9cdaf93 Binary files /dev/null and b/office_pixel/assets/office/agent-admin-walk-up.png differ diff --git a/office_pixel/assets/office/agent-boss-full.png b/office_pixel/assets/office/agent-boss-full.png new file mode 100644 index 0000000..582897b Binary files /dev/null and b/office_pixel/assets/office/agent-boss-full.png differ diff --git a/office_pixel/assets/office/agent-boss-walk-down.png b/office_pixel/assets/office/agent-boss-walk-down.png new file mode 100644 index 0000000..7f36df4 Binary files /dev/null and b/office_pixel/assets/office/agent-boss-walk-down.png differ diff --git a/office_pixel/assets/office/agent-boss-walk-left.png b/office_pixel/assets/office/agent-boss-walk-left.png new file mode 100644 index 0000000..6b08c28 Binary files /dev/null and b/office_pixel/assets/office/agent-boss-walk-left.png differ diff --git a/office_pixel/assets/office/agent-boss-walk-right.png b/office_pixel/assets/office/agent-boss-walk-right.png new file mode 100644 index 0000000..fca844c Binary files /dev/null and b/office_pixel/assets/office/agent-boss-walk-right.png differ diff --git a/office_pixel/assets/office/agent-boss-walk-up.png b/office_pixel/assets/office/agent-boss-walk-up.png new file mode 100644 index 0000000..2716dc1 Binary files /dev/null and b/office_pixel/assets/office/agent-boss-walk-up.png differ diff --git a/office_pixel/assets/office/agent-dev-full.png b/office_pixel/assets/office/agent-dev-full.png new file mode 100644 index 0000000..36907bc Binary files /dev/null and b/office_pixel/assets/office/agent-dev-full.png differ diff --git a/office_pixel/assets/office/agent-dev-walk-down.png b/office_pixel/assets/office/agent-dev-walk-down.png new file mode 100644 index 0000000..1e80f81 Binary files /dev/null and b/office_pixel/assets/office/agent-dev-walk-down.png differ diff --git a/office_pixel/assets/office/agent-dev-walk-left.png b/office_pixel/assets/office/agent-dev-walk-left.png new file mode 100644 index 0000000..4f86ea6 Binary files /dev/null and b/office_pixel/assets/office/agent-dev-walk-left.png differ diff --git a/office_pixel/assets/office/agent-dev-walk-right.png b/office_pixel/assets/office/agent-dev-walk-right.png new file mode 100644 index 0000000..6a24636 Binary files /dev/null and b/office_pixel/assets/office/agent-dev-walk-right.png differ diff --git a/office_pixel/assets/office/agent-dev-walk-up.png b/office_pixel/assets/office/agent-dev-walk-up.png new file mode 100644 index 0000000..d6eb0b3 Binary files /dev/null and b/office_pixel/assets/office/agent-dev-walk-up.png differ diff --git a/office_pixel/assets/office/agent-listing-full.png b/office_pixel/assets/office/agent-listing-full.png new file mode 100644 index 0000000..8427586 Binary files /dev/null and b/office_pixel/assets/office/agent-listing-full.png differ diff --git a/office_pixel/assets/office/agent-listing-walk-down.png b/office_pixel/assets/office/agent-listing-walk-down.png new file mode 100644 index 0000000..3586b84 Binary files /dev/null and b/office_pixel/assets/office/agent-listing-walk-down.png differ diff --git a/office_pixel/assets/office/agent-listing-walk-left.png b/office_pixel/assets/office/agent-listing-walk-left.png new file mode 100644 index 0000000..a21efb5 Binary files /dev/null and b/office_pixel/assets/office/agent-listing-walk-left.png differ diff --git a/office_pixel/assets/office/agent-listing-walk-right.png b/office_pixel/assets/office/agent-listing-walk-right.png new file mode 100644 index 0000000..a3f8880 Binary files /dev/null and b/office_pixel/assets/office/agent-listing-walk-right.png differ diff --git a/office_pixel/assets/office/agent-listing-walk-up.png b/office_pixel/assets/office/agent-listing-walk-up.png new file mode 100644 index 0000000..d31c235 Binary files /dev/null and b/office_pixel/assets/office/agent-listing-walk-up.png differ diff --git a/office_pixel/assets/office/agent-marketing-full.png b/office_pixel/assets/office/agent-marketing-full.png new file mode 100644 index 0000000..b8e2c95 Binary files /dev/null and b/office_pixel/assets/office/agent-marketing-full.png differ diff --git a/office_pixel/assets/office/agent-marketing-walk-down.png b/office_pixel/assets/office/agent-marketing-walk-down.png new file mode 100644 index 0000000..d3096f3 Binary files /dev/null and b/office_pixel/assets/office/agent-marketing-walk-down.png differ diff --git a/office_pixel/assets/office/agent-marketing-walk-left.png b/office_pixel/assets/office/agent-marketing-walk-left.png new file mode 100644 index 0000000..18d9902 Binary files /dev/null and b/office_pixel/assets/office/agent-marketing-walk-left.png differ diff --git a/office_pixel/assets/office/agent-marketing-walk-right.png b/office_pixel/assets/office/agent-marketing-walk-right.png new file mode 100644 index 0000000..388b43a Binary files /dev/null and b/office_pixel/assets/office/agent-marketing-walk-right.png differ diff --git a/office_pixel/assets/office/agent-marketing-walk-up.png b/office_pixel/assets/office/agent-marketing-walk-up.png new file mode 100644 index 0000000..d5401c3 Binary files /dev/null and b/office_pixel/assets/office/agent-marketing-walk-up.png differ diff --git a/office_pixel/assets/office/agent-tech-full.png b/office_pixel/assets/office/agent-tech-full.png new file mode 100644 index 0000000..cb843fb Binary files /dev/null and b/office_pixel/assets/office/agent-tech-full.png differ diff --git a/office_pixel/assets/office/agent-tech-walk-down.png b/office_pixel/assets/office/agent-tech-walk-down.png new file mode 100644 index 0000000..3f06f44 Binary files /dev/null and b/office_pixel/assets/office/agent-tech-walk-down.png differ diff --git a/office_pixel/assets/office/agent-tech-walk-left.png b/office_pixel/assets/office/agent-tech-walk-left.png new file mode 100644 index 0000000..6b76b8c Binary files /dev/null and b/office_pixel/assets/office/agent-tech-walk-left.png differ diff --git a/office_pixel/assets/office/agent-tech-walk-right.png b/office_pixel/assets/office/agent-tech-walk-right.png new file mode 100644 index 0000000..de83868 Binary files /dev/null and b/office_pixel/assets/office/agent-tech-walk-right.png differ diff --git a/office_pixel/assets/office/agent-tech-walk-up.png b/office_pixel/assets/office/agent-tech-walk-up.png new file mode 100644 index 0000000..aa61318 Binary files /dev/null and b/office_pixel/assets/office/agent-tech-walk-up.png differ diff --git a/office_pixel/assets/office/boss.png b/office_pixel/assets/office/boss.png new file mode 100644 index 0000000..4bedfa7 Binary files /dev/null and b/office_pixel/assets/office/boss.png differ diff --git a/office_pixel/assets/office/cabinet.png b/office_pixel/assets/office/cabinet.png new file mode 100644 index 0000000..1ea1a62 Binary files /dev/null and b/office_pixel/assets/office/cabinet.png differ diff --git a/office_pixel/assets/office/chair-flip.png b/office_pixel/assets/office/chair-flip.png new file mode 100644 index 0000000..c9789e7 Binary files /dev/null and b/office_pixel/assets/office/chair-flip.png differ diff --git a/office_pixel/assets/office/chair-orig.png b/office_pixel/assets/office/chair-orig.png new file mode 100644 index 0000000..f369236 Binary files /dev/null and b/office_pixel/assets/office/chair-orig.png differ diff --git a/office_pixel/assets/office/coffee-maker.png b/office_pixel/assets/office/coffee-maker.png new file mode 100644 index 0000000..d96d72f Binary files /dev/null and b/office_pixel/assets/office/coffee-maker.png differ diff --git a/office_pixel/assets/office/desk-with-pc.png b/office_pixel/assets/office/desk-with-pc.png new file mode 100644 index 0000000..5d2e49f Binary files /dev/null and b/office_pixel/assets/office/desk-with-pc.png differ diff --git a/office_pixel/assets/office/desk.png b/office_pixel/assets/office/desk.png new file mode 100644 index 0000000..2ba37da Binary files /dev/null and b/office_pixel/assets/office/desk.png differ diff --git a/office_pixel/assets/office/generated-office.png b/office_pixel/assets/office/generated-office.png new file mode 100644 index 0000000..d0a46dd Binary files /dev/null and b/office_pixel/assets/office/generated-office.png differ diff --git a/office_pixel/assets/office/office-partitions-1.png b/office_pixel/assets/office/office-partitions-1.png new file mode 100644 index 0000000..22f5625 Binary files /dev/null and b/office_pixel/assets/office/office-partitions-1.png differ diff --git a/office_pixel/assets/office/office-partitions-2.png b/office_pixel/assets/office/office-partitions-2.png new file mode 100644 index 0000000..a957c54 Binary files /dev/null and b/office_pixel/assets/office/office-partitions-2.png differ diff --git a/office_pixel/assets/office/osslab-rpg-office.png b/office_pixel/assets/office/osslab-rpg-office.png new file mode 100644 index 0000000..e4849b3 Binary files /dev/null and b/office_pixel/assets/office/osslab-rpg-office.png differ diff --git a/office_pixel/assets/office/plant.png b/office_pixel/assets/office/plant.png new file mode 100644 index 0000000..b2cedc6 Binary files /dev/null and b/office_pixel/assets/office/plant.png differ diff --git a/office_pixel/assets/office/printer.png b/office_pixel/assets/office/printer.png new file mode 100644 index 0000000..b6c9159 Binary files /dev/null and b/office_pixel/assets/office/printer.png differ diff --git a/office_pixel/assets/office/sink.png b/office_pixel/assets/office/sink.png new file mode 100644 index 0000000..b7d3ebd Binary files /dev/null and b/office_pixel/assets/office/sink.png differ diff --git a/office_pixel/assets/office/stamping-table.png b/office_pixel/assets/office/stamping-table.png new file mode 100644 index 0000000..84cdfe8 Binary files /dev/null and b/office_pixel/assets/office/stamping-table.png differ diff --git a/office_pixel/assets/office/typing-spritesheet.png b/office_pixel/assets/office/typing-spritesheet.png new file mode 100644 index 0000000..bec9788 Binary files /dev/null and b/office_pixel/assets/office/typing-spritesheet.png differ diff --git a/office_pixel/assets/office/water-cooler.png b/office_pixel/assets/office/water-cooler.png new file mode 100644 index 0000000..8621cb7 Binary files /dev/null and b/office_pixel/assets/office/water-cooler.png differ diff --git a/office_pixel/assets/office/worker1.png b/office_pixel/assets/office/worker1.png new file mode 100644 index 0000000..0f6032f Binary files /dev/null and b/office_pixel/assets/office/worker1.png differ diff --git a/office_pixel/assets/office/worker2.png b/office_pixel/assets/office/worker2.png new file mode 100644 index 0000000..2f7dc23 Binary files /dev/null and b/office_pixel/assets/office/worker2.png differ diff --git a/office_pixel/assets/office/worker4.png b/office_pixel/assets/office/worker4.png new file mode 100644 index 0000000..cf0d960 Binary files /dev/null and b/office_pixel/assets/office/worker4.png differ diff --git a/office_pixel/assets/office/writing-table.png b/office_pixel/assets/office/writing-table.png new file mode 100644 index 0000000..adad810 Binary files /dev/null and b/office_pixel/assets/office/writing-table.png differ diff --git a/office_pixel/config.json b/office_pixel/config.json new file mode 100644 index 0000000..eab2ccf --- /dev/null +++ b/office_pixel/config.json @@ -0,0 +1,48 @@ +{ + "title": "不见水星记的 Agent 办公区", + "refreshInterval": 30, + "agents": [ + { + "id": "main", + "name": "技术总监", + "sprite": "agent-boss", + "sessionMatch": "oc_b2331eeae9ef02caf25c3d0bcc4add8c", + "role": "技术总监" + }, + { + "id": "tech", + "name": "资深架构师", + "sprite": "agent-tech", + "sessionMatch": "oc_aefa4080bf40004cf7020d499b0963a3", + "role": "资深架构师" + }, + { + "id": "admin", + "name": "高级开发工程师", + "sprite": "agent-admin", + "sessionMatch": "oc_4f0b4ed5fc44d0796a95ce3df753dcac", + "role": "高级开发工程师" + }, + { + "id": "listing", + "name": "硬件工程师", + "sprite": "agent-listing", + "sessionMatch": "oc_401d7f1a0f57920cf17816a3d86eec82", + "role": "硬件工程师" + }, + { + "id": "marketing", + "name": "测试工程师", + "sprite": "agent-marketing", + "sessionMatch": "oc_c60e92c74088c980420b4e5b1065472f", + "role": "测试工程师" + }, + { + "id": "dev", + "name": "运维工程师", + "sprite": "agent-dev", + "sessionMatch": "oc_ff3cef9252a5903ed5d20826007dfbc5", + "role": "运维工程师" + } + ] +} diff --git a/office_pixel/index.html b/office_pixel/index.html new file mode 100644 index 0000000..0887fc4 --- /dev/null +++ b/office_pixel/index.html @@ -0,0 +1,971 @@ + + + + + + Agents Office + + + +
+
+
+
+
+
🏢 不见水星记的 Agent 办公区
+
+ + + + + + + + + + + + + + + +
+
+
+
+ +
+

Agents: 0/0 在线

+
+
⏳ 加载中...
+
+
+ + + + diff --git a/office_pixel/refresh-status.py b/office_pixel/refresh-status.py new file mode 100755 index 0000000..223915f --- /dev/null +++ b/office_pixel/refresh-status.py @@ -0,0 +1,128 @@ +import json, subprocess, time, os, sys + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +CONFIG_FILE = os.path.join(BASE_DIR, 'config.json') +STATUS_FILE = os.path.join(BASE_DIR, 'status.json') + + +def load_config(): + with open(CONFIG_FILE) as f: + return json.load(f) + + +def get_sessions(): + try: + result = subprocess.run( + ['openclaw', 'sessions', 'list', '--json'], + capture_output=True, text=True, timeout=10 + ) + data = json.loads(result.stdout) + return data.get('sessions', data) if isinstance(data, dict) else data + except Exception as e: + print(f" Warning: Could not get sessions: {e}", file=sys.stderr) + return [] + + +def match_session(agent, sessions): + pattern = agent.get('sessionMatch', '') + if not pattern: + return None + for s in sessions: + key = s.get('key', '') + '|' + s.get('displayName', '') + if pattern in key: + return s + return None + + +def determine_status(age_min): + if age_min < 2: + return 'busy' + elif age_min < 10: + return 'online' + elif age_min < 60: + return 'idle' + return 'offline' + + +def extract_last_message(session): + for msg in reversed(session.get('messages', [])): + content = msg.get('content', '') + if isinstance(content, list): + for c in content: + if isinstance(c, dict) and c.get('type') == 'text': + text = c['text'].strip() + if text and len(text) > 2: + return text[:80] + elif isinstance(content, str) and len(content.strip()) > 2: + return content.strip()[:80] + return '...' + + +def refresh(): + config = load_config() + sessions = get_sessions() + now = time.time() * 1000 + + agents_out = [] + for agent in config.get('agents', []): + s = match_session(agent, sessions) + if s: + updated = s.get('updatedAt', 0) + age_min = int((now - updated) / 60000) if updated else 999 + status = determine_status(age_min) + task = extract_last_message(s) + + agents_out.append({ + 'id': agent['id'], + 'name': agent['name'], + 'sprite': agent.get('sprite', 'desk-with-pc.png'), + 'role': agent.get('role', ''), + 'status': status, + 'task': task, + 'lastActive': age_min, + 'session': s.get('key'), + 'tokens': s.get('totalTokens', 0), + }) + else: + agents_out.append({ + 'id': agent['id'], + 'name': agent['name'], + 'sprite': agent.get('sprite', 'desk-with-pc.png'), + 'role': agent.get('role', ''), + 'status': 'offline', + 'task': '尚未建立 session', + 'lastActive': -1, + 'session': None, + 'tokens': 0, + }) + + output = { + 'title': config.get('title', 'OpenClaw Virtual Office'), + 'timestamp': int(now), + 'agents': agents_out, + } + + with open(STATUS_FILE, 'w') as f: + json.dump(output, f, ensure_ascii=False, indent=2) + + online = sum(1 for a in agents_out if a['status'] != 'offline') + print(f"[{time.strftime('%H:%M:%S')}] {online}/{len(agents_out)} agents active") + + +def main(): + if '--loop' in sys.argv: + idx = sys.argv.index('--loop') + interval = int(sys.argv[idx + 1]) if idx + 1 < len(sys.argv) else 30 + print(f"Refreshing every {interval}s. Press Ctrl+C to stop.") + while True: + try: + refresh() + time.sleep(interval) + except KeyboardInterrupt: + break + else: + refresh() + + +if __name__ == '__main__': + main() diff --git a/office_pixel/requirements.txt b/office_pixel/requirements.txt new file mode 100644 index 0000000..4178b85 --- /dev/null +++ b/office_pixel/requirements.txt @@ -0,0 +1,2 @@ +fastapi>=0.110 +uvicorn[standard]>=0.27 diff --git a/package-lock.json b/package-lock.json index aa6066e..0a50642 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8071 +1,11828 @@ { - "name": "vip-video-parsing", - "version": "0.1.0", - "lockfileVersion": 1, + "name": "chattyplay-agent", + "version": "4.9.0", + "lockfileVersion": 3, "requires": true, - "dependencies": { - "@achrinza/node-ipc": { - "version": "9.2.6", - "resolved": "https://registry.npmmirror.com/@achrinza/node-ipc/-/node-ipc-9.2.6.tgz", - "integrity": "sha512-ULSIYPy4ZPM301dfCxRz0l2GJjOwIo/PqmWonIu1bLml7UmnVQmH+juJcoyXp6E8gIRRNAjGYftJnNQlfy4vPg==", + "packages": { + "": { + "name": "chattyplay-agent", + "version": "4.9.0", + "dependencies": { + "@emailjs/browser": "^4.4.1", + "@hcaptcha/react-hcaptcha": "^2.0.2", + "@hono/node-server": "^1.19.9", + "@hono/node-ws": "^1.3.0", + "@monaco-editor/react": "^4.7.0", + "@react-oauth/google": "^0.13.4", + "@types/better-sqlite3": "^7.6.13", + "@types/three": "^0.182.0", + "@types/ws": "^8.18.1", + "@upstash/redis": "^1.37.0", + "@vercel/hono": "^0.2.51", + "antd": "^5.12.0", + "axios": "^1.6.0", + "better-sqlite3": "^12.6.2", + "crypto-js": "^4.2.0", + "echarts": "^6.0.0", + "echarts-for-react": "^3.0.6", + "fflate": "^0.8.2", + "fundebug-javascript": "^2.8.8", + "fundebug-revideo": "^0.8.0", + "gsap": "^3.14.2", + "highlight.js": "^11.9.0", + "hono": "^4.11.7", + "http-proxy-middleware": "^3.0.5", + "i18next": "^25.8.0", + "i18next-browser-languagedetector": "^8.2.0", + "marked": "^11.1.0", + "monaco-editor": "^0.55.1", + "nprogress": "^0.2.0", + "oh-my-live2d": "^0.19.3", + "openai": "^6.25.0", + "pdfjs-dist": "^5.6.205", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-i18next": "^16.5.4", + "react-icons": "^5.5.0", + "react-pdf": "^10.4.1", + "react-router-dom": "^6.22.0", + "simplex-noise": "^4.0.3", + "styled-components": "^6.1.0", + "three": "^0.182.0", + "three-stdlib": "^2.36.1", + "vite-plugin-oh-my-live2d": "^0.19.3", + "ws": "^8.19.0" + }, + "devDependencies": { + "@types/crypto-js": "^4.2.2", + "@types/node": "^25.2.1", + "@types/nprogress": "^0.2.3", + "@types/react": "^18.2.43", + "@types/react-dom": "^18.2.17", + "@types/styled-components": "^5.1.34", + "@typescript-eslint/eslint-plugin": "^6.14.0", + "@typescript-eslint/parser": "^6.14.0", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.24", + "eslint": "^8.55.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.5", + "postcss": "^8.5.6", + "sass-embedded": "^1.97.3", + "tailwindcss": "^3.4.19", + "tsx": "^4.21.0", + "typescript": "^5.2.2", + "vite": "^5.0.8", + "wrangler": "^3.78.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", "dev": true, - "requires": { - "@node-ipc/js-queue": "2.0.3", - "event-pubsub": "4.3.0", - "js-message": "1.0.7" + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" + "node_modules/@ant-design/colors": { + "version": "7.2.1", + "resolved": "https://registry.npmmirror.com/@ant-design/colors/-/colors-7.2.1.tgz", + "integrity": "sha512-lCHDcEzieu4GA3n8ELeZ5VQ8pKQAWcGGLRTQ50aQM2iqPpq2evTxER84jfdPvsPAtEcZ7m44NI45edFMo8oOYQ==", + "license": "MIT", + "dependencies": { + "@ant-design/fast-color": "^2.0.6" } }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" + "node_modules/@ant-design/cssinjs": { + "version": "1.24.0", + "resolved": "https://registry.npmmirror.com/@ant-design/cssinjs/-/cssinjs-1.24.0.tgz", + "integrity": "sha512-K4cYrJBsgvL+IoozUXYjbT6LHHNt+19a9zkvpBPxLjFHas1UpPM2A5MlhROb0BT8N8WoavM5VsP9MeSeNK/3mg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@emotion/hash": "^0.8.0", + "@emotion/unitless": "^0.7.5", + "classnames": "^2.3.1", + "csstype": "^3.1.3", + "rc-util": "^5.35.0", + "stylis": "^4.3.4" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" } }, - "@babel/compat-data": { - "version": "7.20.10", - "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.20.10.tgz", - "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==", - "dev": true - }, - "@babel/core": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.20.7.tgz", - "integrity": "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.7", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "node_modules/@ant-design/cssinjs-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/@ant-design/cssinjs-utils/-/cssinjs-utils-1.1.3.tgz", + "integrity": "sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg==", + "license": "MIT", + "dependencies": { + "@ant-design/cssinjs": "^1.21.0", + "@babel/runtime": "^7.23.2", + "rc-util": "^5.38.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "@babel/generator": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.20.7.tgz", - "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", - "dev": true, - "requires": { - "@babel/types": "^7.20.7", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } + "node_modules/@ant-design/fast-color": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/@ant-design/fast-color/-/fast-color-2.0.6.tgz", + "integrity": "sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7" + }, + "engines": { + "node": ">=8.x" } }, - "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" + "node_modules/@ant-design/icons": { + "version": "5.6.1", + "resolved": "https://registry.npmmirror.com/@ant-design/icons/-/icons-5.6.1.tgz", + "integrity": "sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^7.0.0", + "@ant-design/icons-svg": "^4.4.0", + "@babel/runtime": "^7.24.8", + "classnames": "^2.2.6", + "rc-util": "^5.31.1" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" } }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" - } + "node_modules/@ant-design/icons-svg": { + "version": "4.4.2", + "resolved": "https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==", + "license": "MIT" }, - "@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "node_modules/@ant-design/react-slick": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@ant-design/react-slick/-/react-slick-1.1.2.tgz", + "integrity": "sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "resize-observer-polyfill": "^1.5.1", + "throttle-debounce": "^5.0.0" + }, + "peerDependencies": { + "react": ">=16.9.0" } }, - "@babel/helper-create-class-features-plugin": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.7.tgz", - "integrity": "sha512-LtoWbDXOaidEf50hmdDqn9g8VEzsorMexoWMQdQODbvmqYmaF23pBP5VNPAGIFHsFQCIeKokDiz3CH5Y2jlY6w==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6" + "node_modules/@ant-design/react-slick/node_modules/throttle-debounce": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "license": "MIT", + "engines": { + "node": ">=12.22" } }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.20.5", - "resolved": "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz", - "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==", + "node_modules/@babel/code-frame": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.2.1" + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "node_modules/@babel/compat-data": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.28.6.tgz", + "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "node_modules/@babel/core": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.28.6.tgz", + "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", "dev": true, - "requires": { - "@babel/types": "^7.18.6" + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "node_modules/@babel/generator": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", "dev": true, - "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "dev": true, - "requires": { - "@babel/types": "^7.18.6" + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz", - "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==", + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "dev": true, - "requires": { - "@babel/types": "^7.20.7" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "dev": true, - "requires": { - "@babel/types": "^7.18.6" + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-module-transforms": { - "version": "7.20.11", - "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", - "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.10", - "@babel/types": "^7.20.7" + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "dev": true, - "requires": { - "@babel/types": "^7.18.6" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-replace-supers": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", - "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, - "requires": { - "@babel/types": "^7.20.2" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", "dev": true, - "requires": { - "@babel/types": "^7.20.0" + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "node_modules/@babel/parser": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", "dev": true, - "requires": { - "@babel/types": "^7.18.6" + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "dev": true, - "requires": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/helpers": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.20.7.tgz", - "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "dev": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "@babel/parser": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.20.7.tgz", - "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==" - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", + "node_modules/@babel/traverse": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "node_modules/@babel/types": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "node_modules/@bufbuild/protobuf": { + "version": "2.11.0", + "resolved": "https://registry.npmmirror.com/@bufbuild/protobuf/-/protobuf-2.11.0.tgz", + "integrity": "sha512-sBXGT13cpmPR5BMgHE6UEEfEaShh5Ror6rfN3yEK5si7QVrtZg8LEPQb0VVhiLRUslD2yLnXtnRzG035J/mZXQ==", "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } + "license": "(Apache-2.0 AND BSD-3-Clause)" }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz", - "integrity": "sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "node_modules/@bugsnag/safe-json-stringify": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/@bugsnag/safe-json-stringify/-/safe-json-stringify-6.1.0.tgz", + "integrity": "sha512-ImA35rnM7bGr+J30R979FQ95BhRB4UO1KfJA0J2sVqc8nwnrS9hhE5mkTmQWMs8Vh1Da+hkLKs5jJB4JjNZp4A==", + "license": "MIT" + }, + "node_modules/@bytecodealliance/preview2-shim": { + "version": "0.17.6", + "resolved": "https://registry.npmmirror.com/@bytecodealliance/preview2-shim/-/preview2-shim-0.17.6.tgz", + "integrity": "sha512-n3cM88gTen5980UOBAD6xDcNNL3ocTK8keab21bpx1ONdA+ARj7uD1qoFxOWCyKlkpSi195FH+GeAut7Oc6zZw==", + "license": "(Apache-2.0 WITH LLVM-exception)" + }, + "node_modules/@cloudflare/kv-asset-handler": { + "version": "0.3.4", + "resolved": "https://registry.npmmirror.com/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.4.tgz", + "integrity": "sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==", + "dev": true, + "license": "MIT OR Apache-2.0", + "dependencies": { + "mime": "^3.0.0" + }, + "engines": { + "node": ">=16.13" } }, - "@babel/plugin-proposal-decorators": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.7.tgz", - "integrity": "sha512-JB45hbUweYpwAGjkiM7uCyXMENH2lG+9r3G2E+ttc2PRXAoEkpfd/KW5jDg4j8RS6tLtTG1jZi9LbHZVSfs1/A==", + "node_modules/@cloudflare/kv-asset-handler/node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/plugin-syntax-decorators": "^7.19.0" + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" } }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "node_modules/@cloudflare/unenv-preset": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/@cloudflare/unenv-preset/-/unenv-preset-2.0.2.tgz", + "integrity": "sha512-nyzYnlZjjV5xT3LizahG1Iu6mnrCaxglJ04rZLpDwlDVDZ7v46lNsfxhV3A/xtfgQuSHmLnc6SVI+KwBpc3Lwg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "license": "MIT OR Apache-2.0", + "peerDependencies": { + "unenv": "2.0.0-rc.14", + "workerd": "^1.20250124.0" + }, + "peerDependenciesMeta": { + "workerd": { + "optional": true + } } }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "node_modules/@cloudflare/workerd-darwin-64": { + "version": "1.20250718.0", + "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20250718.0.tgz", + "integrity": "sha512-FHf4t7zbVN8yyXgQ/r/GqLPaYZSGUVzeR7RnL28Mwj2djyw2ZergvytVc7fdGcczl6PQh+VKGfZCfUqpJlbi9g==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-darwin-arm64": { + "version": "1.20250718.0", + "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20250718.0.tgz", + "integrity": "sha512-fUiyUJYyqqp4NqJ0YgGtp4WJh/II/YZsUnEb6vVy5Oeas8lUOxnN+ZOJ8N/6/5LQCVAtYCChRiIrBbfhTn5Z8Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-64": { + "version": "1.20250718.0", + "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20250718.0.tgz", + "integrity": "sha512-5+eb3rtJMiEwp08Kryqzzu8d1rUcK+gdE442auo5eniMpT170Dz0QxBrqkg2Z48SFUPYbj+6uknuA5tzdRSUSg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-arm64": { + "version": "1.20250718.0", + "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20250718.0.tgz", + "integrity": "sha512-Aa2M/DVBEBQDdATMbn217zCSFKE+ud/teS+fFS+OQqKABLn0azO2qq6ANAHYOIE6Q3Sq4CxDIQr8lGdaJHwUog==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-windows-64": { + "version": "1.20250718.0", + "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20250718.0.tgz", + "integrity": "sha512-dY16RXKffmugnc67LTbyjdDHZn5NoTF1yHEf2fN4+OaOnoGSp3N1x77QubTDwqZ9zECWxgQfDLjddcH8dWeFhg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16" } }, - "@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" } }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } + "node_modules/@dimforge/rapier3d-compat": { + "version": "0.12.0", + "resolved": "https://registry.npmmirror.com/@dimforge/rapier3d-compat/-/rapier3d-compat-0.12.0.tgz", + "integrity": "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==", + "license": "Apache-2.0" }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "node_modules/@edge-runtime/format": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/@edge-runtime/format/-/format-2.2.1.tgz", + "integrity": "sha512-JQTRVuiusQLNNLe2W9tnzBlV/GvSVcozLl4XZHk5swnRZ/v6jp8TqR8P7sqmJsQqblDZ3EztcWmLDbhRje/+8g==", + "license": "MPL-2.0", + "engines": { + "node": ">=16" } }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" + "node_modules/@edge-runtime/node-utils": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/@edge-runtime/node-utils/-/node-utils-2.3.0.tgz", + "integrity": "sha512-uUtx8BFoO1hNxtHjp3eqVPC/mWImGb2exOfGjMLUoipuWgjej+f4o/VP4bUI8U40gu7Teogd5VTeZUkGvJSPOQ==", + "license": "MPL-2.0", + "engines": { + "node": ">=16" } }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "node_modules/@edge-runtime/ponyfill": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/@edge-runtime/ponyfill/-/ponyfill-2.4.2.tgz", + "integrity": "sha512-oN17GjFr69chu6sDLvXxdhg0Qe8EZviGSuqzR9qOiKh4MhFYGdBBcqRNzdmYeAdeRzOW2mM9yil4RftUQ7sUOA==", + "license": "MPL-2.0", + "engines": { + "node": ">=16" } }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz", - "integrity": "sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "node_modules/@edge-runtime/primitives": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/@edge-runtime/primitives/-/primitives-4.1.0.tgz", + "integrity": "sha512-Vw0lbJ2lvRUqc7/soqygUX216Xb8T3WBZ987oywz6aJqRxcwSVWwr9e+Nqo2m9bxobA9mdbWNNoRY6S9eko1EQ==", + "license": "MPL-2.0", + "engines": { + "node": ">=16" } }, - "@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "node_modules/@edge-runtime/vm": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/@edge-runtime/vm/-/vm-3.2.0.tgz", + "integrity": "sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==", + "license": "MPL-2.0", + "dependencies": { + "@edge-runtime/primitives": "4.1.0" + }, + "engines": { + "node": ">=16" } }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.20.5", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz", - "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "node_modules/@emailjs/browser": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/@emailjs/browser/-/browser-4.4.1.tgz", + "integrity": "sha512-DGSlP9sPvyFba3to2A50kDtZ+pXVp/0rhmqs2LmbMS3I5J8FSOgLwzY2Xb4qfKlOVHh29EAutLYwe5yuEZmEFg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" } }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmmirror.com/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" } }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmmirror.com/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmmirror.com/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", + "license": "MIT" + }, + "node_modules/@esbuild-plugins/node-globals-polyfill": { + "version": "0.2.3", + "resolved": "https://registry.npmmirror.com/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz", + "integrity": "sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "license": "ISC", + "peerDependencies": { + "esbuild": "*" } }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "node_modules/@esbuild-plugins/node-modules-polyfill": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.2.2.tgz", + "integrity": "sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "license": "ISC", + "dependencies": { + "escape-string-regexp": "^4.0.0", + "rollup-plugin-node-polyfills": "^0.2.1" + }, + "peerDependencies": { + "esbuild": "*" } }, - "@babel/plugin-syntax-decorators": { - "version": "7.19.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.19.0.tgz", - "integrity": "sha512-xaBZUEDntt4faL1yN8oIFlhfXeQAWJW7CLKYsHTUqriCUbj8xOra8bfxxKGi/UwExPFBuPdH4XfHc9rGQhrVkQ==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0" + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0" + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "license": "MIT", + "engines": { + "node": ">=14" } }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "node_modules/@hcaptcha/react-hcaptcha": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/@hcaptcha/react-hcaptcha/-/react-hcaptcha-2.0.2.tgz", + "integrity": "sha512-VbuH6VJ6m3BHmVBHs0fL9t+suZd7PQEqCzqL2BiUbBvbHI3XfvSgdiug2QiEPN8zskbPTIV/FfGPF53JCckrow==", + "license": "MIT" + }, + "node_modules/@hono/node-server": { + "version": "1.19.9", + "resolved": "https://registry.npmmirror.com/@hono/node-server/-/node-server-1.19.9.tgz", + "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==", + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" } }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "node_modules/@hono/node-ws": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/@hono/node-ws/-/node-ws-1.3.0.tgz", + "integrity": "sha512-ju25YbbvLuXdqBCmLZLqnNYu1nbHIQjoyUqA8ApZOeL1k4skuiTcw5SW77/5SUYo2Xi2NVBJoVlfQurnKEp03Q==", + "license": "MIT", + "dependencies": { + "ws": "^8.17.0" + }, + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "@hono/node-server": "^1.19.2", + "hono": "^4.6.0" } }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" } }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } + "license": "BSD-3-Clause" }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" } }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", - "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" } }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "@babel/plugin-transform-block-scoping": { - "version": "7.20.11", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.11.tgz", - "integrity": "sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw==", + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "@babel/plugin-transform-classes": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz", - "integrity": "sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==", + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "@babel/plugin-transform-computed-properties": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", - "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/template": "^7.20.7" + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "@babel/plugin-transform-destructuring": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz", - "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==", + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" } }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" } }, - "@babel/plugin-transform-for-of": { - "version": "7.18.8", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", - "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" } }, - "@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" } }, - "@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" } }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" } }, - "@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.20.11", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz", - "integrity": "sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==", + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "license": "MIT", + "engines": { + "node": "20 || >=22" } }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz", + "integrity": "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==", + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" } }, - "@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" } }, - "@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "@babel/plugin-transform-parameters": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz", - "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==", + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", - "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "regenerator-transform": "^0.15.1" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.19.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz", - "integrity": "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.19.0", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "semver": "^6.3.0" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/preset-env": { - "version": "7.20.2", - "resolved": "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.20.2.tgz", - "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.20.1", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.20.2", - "@babel/plugin-transform-classes": "^7.20.2", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.20.2", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.19.6", - "@babel/plugin-transform-modules-commonjs": "^7.19.6", - "@babel/plugin-transform-modules-systemjs": "^7.19.6", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.20.1", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.19.0", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" - } - }, - "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/runtime": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.20.7.tgz", - "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true, - "requires": { - "regenerator-runtime": "^0.13.11" + "engines": { + "node": ">=6.0.0" } }, - "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, - "@babel/traverse": { - "version": "7.20.10", - "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.20.10.tgz", - "integrity": "sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "debug": "^4.1.0", - "globals": "^11.1.0" - } + "license": "MIT" }, - "@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmmirror.com/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "dev": true - }, - "@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dev": true, - "requires": { - "@hapi/hoek": "^9.0.0" + "node_modules/@mapbox/node-pre-gyp": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.3.tgz", + "integrity": "sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==", + "license": "BSD-3-Clause", + "dependencies": { + "consola": "^3.2.3", + "detect-libc": "^2.0.0", + "https-proxy-agent": "^7.0.5", + "node-fetch": "^2.6.7", + "nopt": "^8.0.0", + "semver": "^7.5.3", + "tar": "^7.4.0" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + }, + "engines": { + "node": ">=18" } }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, + "node_modules/@monaco-editor/loader": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/@monaco-editor/loader/-/loader-1.7.0.tgz", + "integrity": "sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA==", + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } + "state-local": "^1.0.6" } }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "node_modules/@monaco-editor/react": { + "version": "4.7.0", + "resolved": "https://registry.npmmirror.com/@monaco-editor/react/-/react-4.7.0.tgz", + "integrity": "sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==", + "license": "MIT", + "dependencies": { + "@monaco-editor/loader": "^1.5.0" + }, + "peerDependencies": { + "monaco-editor": ">= 0.25.0 < 1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "dev": true - }, - "@node-ipc/js-queue": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/@node-ipc/js-queue/-/js-queue-2.0.3.tgz", - "integrity": "sha512-fL1wpr8hhD5gT2dA1qifeVaoDFlQR5es8tFuKqjHX+kdOtdNHnxkVZbtIrR2rxnMFvehkjaZRNV2H/gPXlb0hw==", - "dev": true, - "requires": { - "easy-stack": "1.0.1" + "node_modules/@napi-rs/canvas": { + "version": "0.1.99", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas/-/canvas-0.1.99.tgz", + "integrity": "sha512-zN4eQlK3eBf7aJBcTHZilpBH3tDekBzPMIWC8r0s94Ecl73XfOyFi4w7yKFMRVUT0lvNQjtOL8YSrwqQj6mZFg==", + "license": "MIT", + "optional": true, + "workspaces": [ + "e2e/*" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@napi-rs/canvas-android-arm64": "0.1.99", + "@napi-rs/canvas-darwin-arm64": "0.1.99", + "@napi-rs/canvas-darwin-x64": "0.1.99", + "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.99", + "@napi-rs/canvas-linux-arm64-gnu": "0.1.99", + "@napi-rs/canvas-linux-arm64-musl": "0.1.99", + "@napi-rs/canvas-linux-riscv64-gnu": "0.1.99", + "@napi-rs/canvas-linux-x64-gnu": "0.1.99", + "@napi-rs/canvas-linux-x64-musl": "0.1.99", + "@napi-rs/canvas-win32-arm64-msvc": "0.1.99", + "@napi-rs/canvas-win32-x64-msvc": "0.1.99" + } + }, + "node_modules/@napi-rs/canvas-android-arm64": { + "version": "0.1.99", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.99.tgz", + "integrity": "sha512-9OCRt8VVxA17m32NWZKyNC2qamdaS/SC5CEOIQwFngRq0DIeVm4PDal+6Ljnhqm2whZiC63DNuKZ4xSp2nbj9w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-darwin-arm64": { + "version": "0.1.99", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.99.tgz", + "integrity": "sha512-lupMDMy1+H38dhyCcLirOKKVUyzzlxi7j7rGPLI3vViMHOoPjcXO1b10ivy+ad+q6MiwHfoLjKTCoLke5ySOBg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-darwin-x64": { + "version": "0.1.99", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.99.tgz", + "integrity": "sha512-fdz02t4w8n6Ii/rYhWig6STb/zcTmCC/6YZTGmjoDeidDwn9Wf0ukQVynhCPEs29vqUc66wHZKsuIgMs9tycCg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-linux-arm-gnueabihf": { + "version": "0.1.99", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.99.tgz", + "integrity": "sha512-w4FwVwlNo00ezeRhfY62IVIyt6G3u8wodkPtiqWc52BUHx+VDBUM2vkS3ogfANaLI7hnf3s6WK4LyZVUjBg1lA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-linux-arm64-gnu": { + "version": "0.1.99", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.99.tgz", + "integrity": "sha512-8JvHeexKQ8c7g0q7YJ29NVQwnf1ePghP9ys9ZN0R0qzyqJQ9Uw6N9qnDINArlm3IYHexB7LjzArIfhQiqSDGvQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-linux-arm64-musl": { + "version": "0.1.99", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.99.tgz", + "integrity": "sha512-Z+6nyLdJXWzLPVxi4H6g9TJop4DwN3KSgHWto5JCbZV5/uKoVqcSynPs0tGlUHOoWI8S8tEvJspz51GQkvr07w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-linux-riscv64-gnu": { + "version": "0.1.99", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.99.tgz", + "integrity": "sha512-jAnfOUv4IO1l8Levk5t85oVtEBOXLa07KnIUgWo1CDlPxiqpxS3uBfiE38Lvj/CQgHaNF6Nxk/SaemwLgsVJgw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-linux-x64-gnu": { + "version": "0.1.99", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.99.tgz", + "integrity": "sha512-mIkXw3fGmbYyFjSmfWEvty4jN+rwEOmv0+Dy9bRvvTzLYWCgm3RMgUEQVfAKFw96nIRFnyNZiK83KNQaVVFjng==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-linux-x64-musl": { + "version": "0.1.99", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.99.tgz", + "integrity": "sha512-f3Uz2P0RgrtBHISxZqr6yiYXJlTDyCVBumDacxo+4AmSg7z0HiqYZKGWC/gszq3fbPhyQUya1W2AEteKxT9Y6A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-win32-arm64-msvc": { + "version": "0.1.99", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-win32-arm64-msvc/-/canvas-win32-arm64-msvc-0.1.99.tgz", + "integrity": "sha512-XE6KUkfqRsCNejcoRMiMr3RaUeObxNf6y7dut3hrq2rn7PzfRTZgrjF1F/B2C7FcdgqY/vSHWpQeMuNz1vTNHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-win32-x64-msvc": { + "version": "0.1.99", + "resolved": "https://registry.npmmirror.com/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.99.tgz", + "integrity": "sha512-plMYGVbc/vmmPF9MtmHbwNk1rL1Aj53vQZt+Gnv1oZn6gmd9jEHHJ0n9Nd2nxa5sKH7TS5IjkCDM6289O0d6PQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } }, - "@nodelib/fs.scandir": { + "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { + "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" } }, - "@nodelib/fs.stat": { + "node_modules/@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true + "engines": { + "node": ">= 8" + } }, - "@nodelib/fs.walk": { + "node_modules/@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { + "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" } }, - "@polka/url": { - "version": "1.0.0-next.21", - "resolved": "https://registry.npmmirror.com/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", - "dev": true - }, - "@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmmirror.com/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "node_modules/@parcel/watcher": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.5.6.tgz", + "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", "dev": true, - "requires": { - "@hapi/hoek": "^9.0.0" + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.6", + "@parcel/watcher-darwin-arm64": "2.5.6", + "@parcel/watcher-darwin-x64": "2.5.6", + "@parcel/watcher-freebsd-x64": "2.5.6", + "@parcel/watcher-linux-arm-glibc": "2.5.6", + "@parcel/watcher-linux-arm-musl": "2.5.6", + "@parcel/watcher-linux-arm64-glibc": "2.5.6", + "@parcel/watcher-linux-arm64-musl": "2.5.6", + "@parcel/watcher-linux-x64-glibc": "2.5.6", + "@parcel/watcher-linux-x64-musl": "2.5.6", + "@parcel/watcher-win32-arm64": "2.5.6", + "@parcel/watcher-win32-ia32": "2.5.6", + "@parcel/watcher-win32-x64": "2.5.6" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", + "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", - "dev": true - }, - "@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "dev": true - }, - "@soda/friendly-errors-webpack-plugin": { - "version": "1.8.1", - "resolved": "https://registry.npmmirror.com/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz", - "integrity": "sha512-h2ooWqP8XuFqTXT+NyAFbrArzfQA7R6HTezADrvD9Re8fxMLTPPniLdqVTdDaO0eIoLaAwKT+d6w+5GeTk7Vbg==", - "dev": true, - "requires": { - "chalk": "^3.0.0", - "error-stack-parser": "^2.0.6", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", + "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "@soda/get-current-script": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/@soda/get-current-script/-/get-current-script-1.0.2.tgz", - "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==", - "dev": true - }, - "@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true - }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmmirror.com/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", + "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmmirror.com/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", + "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "@types/node": "*" + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmmirror.com/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", + "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", + "cpu": [ + "arm" + ], "dev": true, - "requires": { - "@types/node": "*" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmmirror.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", + "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", + "cpu": [ + "arm" + ], "dev": true, - "requires": { - "@types/express-serve-static-core": "*", - "@types/node": "*" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "@types/eslint": { - "version": "8.4.10", - "resolved": "https://registry.npmmirror.com/@types/eslint/-/eslint-8.4.10.tgz", - "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", + "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", + "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "@types/express": { - "version": "4.17.15", - "resolved": "https://registry.npmmirror.com/@types/express/-/express-4.17.15.tgz", - "integrity": "sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==", + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", + "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.31", - "@types/qs": "*", - "@types/serve-static": "*" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "@types/express-serve-static-core": { - "version": "4.17.32", - "resolved": "https://registry.npmmirror.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.32.tgz", - "integrity": "sha512-aI5h/VOkxOF2Z1saPy0Zsxs5avets/iaiAJYznQFm5By/pamU31xWKL//epiF4OfUA2qTOc9PV6tCUjhO8wlZA==", + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", + "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true - }, - "@types/http-proxy": { - "version": "1.17.9", - "resolved": "https://registry.npmmirror.com/@types/http-proxy/-/http-proxy-1.17.9.tgz", - "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", + "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "@types/node": "*" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", - "dev": true - }, - "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmmirror.com/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "@types/node": { - "version": "18.11.18", - "resolved": "https://registry.npmmirror.com/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmmirror.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmmirror.com/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmmirror.com/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true - }, - "@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmmirror.com/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true - }, - "@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmmirror.com/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", + "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", + "cpu": [ + "ia32" + ], "dev": true, - "requires": { - "@types/express": "*" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "@types/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmmirror.com/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", + "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "@types/mime": "*", - "@types/node": "*" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmmirror.com/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "node_modules/@parcel/watcher/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, - "requires": { - "@types/node": "*" + "license": "MIT", + "optional": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmmirror.com/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", - "dev": true, - "requires": { - "@types/node": "*" + "node_modules/@rc-component/async-validator": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/@rc-component/async-validator/-/async-validator-5.1.0.tgz", + "integrity": "sha512-n4HcR5siNUXRX23nDizbZBQPO0ZM/5oTtmKZ6/eqL0L2bo747cklFdZGRN2f+c9qWGICwDzrhW0H7tE9PptdcA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.4" + }, + "engines": { + "node": ">=14.x" + } + }, + "node_modules/@rc-component/color-picker": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/@rc-component/color-picker/-/color-picker-2.0.1.tgz", + "integrity": "sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==", + "license": "MIT", + "dependencies": { + "@ant-design/fast-color": "^2.0.6", + "@babel/runtime": "^7.23.6", + "classnames": "^2.2.6", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "@vue/babel-helper-vue-jsx-merge-props": { + "node_modules/@rc-component/context": { "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz", - "integrity": "sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA==", - "dev": true + "resolved": "https://registry.npmmirror.com/@rc-component/context/-/context-1.4.0.tgz", + "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } }, - "@vue/babel-helper-vue-transform-on": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz", - "integrity": "sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==", - "dev": true + "node_modules/@rc-component/mini-decimal": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", + "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0" + }, + "engines": { + "node": ">=8.x" + } }, - "@vue/babel-plugin-jsx": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz", - "integrity": "sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "@vue/babel-helper-vue-transform-on": "^1.0.2", - "camelcase": "^6.0.0", - "html-tags": "^3.1.0", - "svg-tags": "^1.0.0" - } - }, - "@vue/babel-plugin-transform-vue-jsx": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.4.0.tgz", - "integrity": "sha512-Fmastxw4MMx0vlgLS4XBX0XiBbUFzoMGeVXuMV08wyOfXdikAFqBTuYPR0tlk+XskL19EzHc39SgjrPGY23JnA==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", - "html-tags": "^2.0.0", - "lodash.kebabcase": "^4.1.1", - "svg-tags": "^1.0.0" - }, - "dependencies": { - "html-tags": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/html-tags/-/html-tags-2.0.0.tgz", - "integrity": "sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==", - "dev": true - } + "node_modules/@rc-component/mutate-observer": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz", + "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "@vue/babel-preset-app": { - "version": "5.0.8", - "resolved": "https://registry.npmmirror.com/@vue/babel-preset-app/-/babel-preset-app-5.0.8.tgz", - "integrity": "sha512-yl+5qhpjd8e1G4cMXfORkkBlvtPCIgmRf3IYCWYDKIQ7m+PPa5iTm4feiNmCMD6yGqQWMhhK/7M3oWGL9boKwg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.16", - "@babel/helper-compilation-targets": "^7.12.16", - "@babel/helper-module-imports": "^7.12.13", - "@babel/plugin-proposal-class-properties": "^7.12.13", - "@babel/plugin-proposal-decorators": "^7.12.13", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.12.13", - "@babel/plugin-transform-runtime": "^7.12.15", - "@babel/preset-env": "^7.12.16", - "@babel/runtime": "^7.12.13", - "@vue/babel-plugin-jsx": "^1.0.3", - "@vue/babel-preset-jsx": "^1.1.2", - "babel-plugin-dynamic-import-node": "^2.3.3", - "core-js": "^3.8.3", - "core-js-compat": "^3.8.3", - "semver": "^7.3.4" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } + "node_modules/@rc-component/portal": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@rc-component/portal/-/portal-1.1.2.tgz", + "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "@vue/babel-preset-jsx": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/@vue/babel-preset-jsx/-/babel-preset-jsx-1.4.0.tgz", - "integrity": "sha512-QmfRpssBOPZWL5xw7fOuHNifCQcNQC1PrOo/4fu6xlhlKJJKSA3HqX92Nvgyx8fqHZTUGMPHmFA+IDqwXlqkSA==", - "dev": true, - "requires": { - "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", - "@vue/babel-sugar-composition-api-inject-h": "^1.4.0", - "@vue/babel-sugar-composition-api-render-instance": "^1.4.0", - "@vue/babel-sugar-functional-vue": "^1.4.0", - "@vue/babel-sugar-inject-h": "^1.4.0", - "@vue/babel-sugar-v-model": "^1.4.0", - "@vue/babel-sugar-v-on": "^1.4.0" + "node_modules/@rc-component/qrcode": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/@rc-component/qrcode/-/qrcode-1.1.1.tgz", + "integrity": "sha512-LfLGNymzKdUPjXUbRP+xOhIWY4jQ+YMj5MmWAcgcAq1Ij8XP7tRmAXqyuv96XvLUBE/5cA8hLFl9eO1JQMujrA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "@vue/babel-sugar-composition-api-inject-h": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.4.0.tgz", - "integrity": "sha512-VQq6zEddJHctnG4w3TfmlVp5FzDavUSut/DwR0xVoe/mJKXyMcsIibL42wPntozITEoY90aBV0/1d2KjxHU52g==", - "dev": true, - "requires": { - "@babel/plugin-syntax-jsx": "^7.2.0" + "node_modules/@rc-component/tour": { + "version": "1.15.1", + "resolved": "https://registry.npmmirror.com/@rc-component/tour/-/tour-1.15.1.tgz", + "integrity": "sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/portal": "^1.0.0-9", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "@vue/babel-sugar-composition-api-render-instance": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.4.0.tgz", - "integrity": "sha512-6ZDAzcxvy7VcnCjNdHJ59mwK02ZFuP5CnucloidqlZwVQv5CQLijc3lGpR7MD3TWFi78J7+a8J56YxbCtHgT9Q==", - "dev": true, - "requires": { - "@babel/plugin-syntax-jsx": "^7.2.0" + "node_modules/@rc-component/trigger": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/@rc-component/trigger/-/trigger-2.3.1.tgz", + "integrity": "sha512-ORENF39PeXTzM+gQEshuk460Z8N4+6DkjpxlpE7Q3gYy1iBpLrx0FOJz3h62ryrJZ/3zCAUIkT1Pb/8hHWpb3A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@rc-component/portal": "^1.1.0", + "classnames": "^2.3.2", + "rc-motion": "^2.0.0", + "rc-resize-observer": "^1.3.1", + "rc-util": "^5.44.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "@vue/babel-sugar-functional-vue": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.4.0.tgz", - "integrity": "sha512-lTEB4WUFNzYt2In6JsoF9sAYVTo84wC4e+PoZWSgM6FUtqRJz7wMylaEhSRgG71YF+wfLD6cc9nqVeXN2rwBvw==", - "dev": true, - "requires": { - "@babel/plugin-syntax-jsx": "^7.2.0" + "node_modules/@react-oauth/google": { + "version": "0.13.4", + "resolved": "https://registry.npmmirror.com/@react-oauth/google/-/google-0.13.4.tgz", + "integrity": "sha512-hGKyNEH+/PK8M0sFEuo3MAEk0txtHpgs94tDQit+s2LXg7b6z53NtzHfqDvoB2X8O6lGB+FRg80hY//X6hfD+w==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "@vue/babel-sugar-inject-h": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.4.0.tgz", - "integrity": "sha512-muwWrPKli77uO2fFM7eA3G1lAGnERuSz2NgAxuOLzrsTlQl8W4G+wwbM4nB6iewlKbwKRae3nL03UaF5ffAPMA==", - "dev": true, - "requires": { - "@babel/plugin-syntax-jsx": "^7.2.0" + "node_modules/@remix-run/router": { + "version": "1.23.2", + "resolved": "https://registry.npmmirror.com/@remix-run/router/-/router-1.23.2.tgz", + "integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" } }, - "@vue/babel-sugar-v-model": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.4.0.tgz", - "integrity": "sha512-0t4HGgXb7WHYLBciZzN5s0Hzqan4Ue+p/3FdQdcaHAb7s5D9WZFGoSxEZHrR1TFVZlAPu1bejTKGeAzaaG3NCQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", - "camelcase": "^5.0.0", - "html-tags": "^2.0.0", - "svg-tags": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "html-tags": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/html-tags/-/html-tags-2.0.0.tgz", - "integrity": "sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==", - "dev": true - } + "node_modules/@renovatebot/pep440": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/@renovatebot/pep440/-/pep440-4.2.1.tgz", + "integrity": "sha512-2FK1hF93Fuf1laSdfiEmJvSJPVIDHEUTz68D3Fi9s0IZrrpaEcj6pTFBTbYvsgC5du4ogrtf5re7yMMvrKNgkw==", + "license": "Apache-2.0", + "engines": { + "node": "^20.9.0 || ^22.11.0 || ^24", + "pnpm": "^10.0.0" } }, - "@vue/babel-sugar-v-on": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.4.0.tgz", - "integrity": "sha512-m+zud4wKLzSKgQrWwhqRObWzmTuyzl6vOP7024lrpeJM4x2UhQtRDLgYjXAw9xBXjCwS0pP9kXjg91F9ZNo9JA==", + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", "dev": true, - "requires": { - "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", - "camelcase": "^5.0.0" - }, + "license": "MIT" + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "license": "MIT", "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true } } }, - "@vue/cli-overlay": { - "version": "5.0.8", - "resolved": "https://registry.npmmirror.com/@vue/cli-overlay/-/cli-overlay-5.0.8.tgz", - "integrity": "sha512-KmtievE/B4kcXp6SuM2gzsnSd8WebkQpg3XaB6GmFh1BJGRqa1UiW9up7L/Q67uOdTigHxr5Ar2lZms4RcDjwQ==", - "dev": true + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" }, - "@vue/cli-plugin-babel": { - "version": "5.0.8", - "resolved": "https://registry.npmmirror.com/@vue/cli-plugin-babel/-/cli-plugin-babel-5.0.8.tgz", - "integrity": "sha512-a4qqkml3FAJ3auqB2kN2EMPocb/iu0ykeELwed+9B1c1nQ1HKgslKMHMPavYx3Cd/QAx2mBD4hwKBqZXEI/CsQ==", - "dev": true, - "requires": { - "@babel/core": "^7.12.16", - "@vue/babel-preset-app": "^5.0.8", - "@vue/cli-shared-utils": "^5.0.8", - "babel-loader": "^8.2.2", - "thread-loader": "^3.0.0", - "webpack": "^5.54.0" + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "@vue/cli-plugin-router": { - "version": "5.0.8", - "resolved": "https://registry.npmmirror.com/@vue/cli-plugin-router/-/cli-plugin-router-5.0.8.tgz", - "integrity": "sha512-Gmv4dsGdAsWPqVijz3Ux2OS2HkMrWi1ENj2cYL75nUeL+Xj5HEstSqdtfZ0b1q9NCce+BFB6QnHfTBXc/fCvMg==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "cpu": [ + "arm" + ], "dev": true, - "requires": { - "@vue/cli-shared-utils": "^5.0.8" + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@ts-morph/common": { + "version": "0.11.1", + "resolved": "https://registry.npmmirror.com/@ts-morph/common/-/common-0.11.1.tgz", + "integrity": "sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==", + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.7", + "minimatch": "^3.0.4", + "mkdirp": "^1.0.4", + "path-browserify": "^1.0.1" } }, - "@vue/cli-plugin-vuex": { - "version": "5.0.8", - "resolved": "https://registry.npmmirror.com/@vue/cli-plugin-vuex/-/cli-plugin-vuex-5.0.8.tgz", - "integrity": "sha512-HSYWPqrunRE5ZZs8kVwiY6oWcn95qf/OQabwLfprhdpFWAGtLStShjsGED2aDpSSeGAskQETrtR/5h7VqgIlBA==", - "dev": true + "node_modules/@tweenjs/tween.js": { + "version": "23.1.3", + "resolved": "https://registry.npmmirror.com/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", + "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", + "license": "MIT" }, - "@vue/cli-service": { - "version": "5.0.8", - "resolved": "https://registry.npmmirror.com/@vue/cli-service/-/cli-service-5.0.8.tgz", - "integrity": "sha512-nV7tYQLe7YsTtzFrfOMIHc5N2hp5lHG2rpYr0aNja9rNljdgcPZLyQRb2YRivTHqTv7lI962UXFURcpStHgyFw==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.12.16", - "@soda/friendly-errors-webpack-plugin": "^1.8.0", - "@soda/get-current-script": "^1.0.2", - "@types/minimist": "^1.2.0", - "@vue/cli-overlay": "^5.0.8", - "@vue/cli-plugin-router": "^5.0.8", - "@vue/cli-plugin-vuex": "^5.0.8", - "@vue/cli-shared-utils": "^5.0.8", - "@vue/component-compiler-utils": "^3.3.0", - "@vue/vue-loader-v15": "npm:vue-loader@^15.9.7", - "@vue/web-component-wrapper": "^1.3.0", - "acorn": "^8.0.5", - "acorn-walk": "^8.0.2", - "address": "^1.1.2", - "autoprefixer": "^10.2.4", - "browserslist": "^4.16.3", - "case-sensitive-paths-webpack-plugin": "^2.3.0", - "cli-highlight": "^2.1.10", - "clipboardy": "^2.3.0", - "cliui": "^7.0.4", - "copy-webpack-plugin": "^9.0.1", - "css-loader": "^6.5.0", - "css-minimizer-webpack-plugin": "^3.0.2", - "cssnano": "^5.0.0", - "debug": "^4.1.1", - "default-gateway": "^6.0.3", - "dotenv": "^10.0.0", - "dotenv-expand": "^5.1.0", - "fs-extra": "^9.1.0", - "globby": "^11.0.2", - "hash-sum": "^2.0.0", - "html-webpack-plugin": "^5.1.0", - "is-file-esm": "^1.0.0", - "launch-editor-middleware": "^2.2.1", - "lodash.defaultsdeep": "^4.6.1", - "lodash.mapvalues": "^4.6.0", - "mini-css-extract-plugin": "^2.5.3", - "minimist": "^1.2.5", - "module-alias": "^2.2.2", - "portfinder": "^1.0.26", - "postcss": "^8.2.6", - "postcss-loader": "^6.1.1", - "progress-webpack-plugin": "^1.0.12", - "ssri": "^8.0.1", - "terser-webpack-plugin": "^5.1.1", - "thread-loader": "^3.0.0", - "vue-loader": "^17.0.0", - "vue-style-loader": "^4.1.3", - "webpack": "^5.54.0", - "webpack-bundle-analyzer": "^4.4.0", - "webpack-chain": "^6.5.1", - "webpack-dev-server": "^4.7.3", - "webpack-merge": "^5.7.3", - "webpack-virtual-modules": "^0.4.2", - "whatwg-fetch": "^3.6.2" - }, - "dependencies": { - "@vue/vue-loader-v15": { - "version": "npm:vue-loader@15.10.1", - "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-15.10.1.tgz", - "integrity": "sha512-SaPHK1A01VrNthlix6h1hq4uJu7S/z0kdLUb6klubo738NeQoLbS6V9/d8Pv19tU0XdQKju3D1HSKuI8wJ5wMA==", - "dev": true, - "requires": { - "@vue/component-compiler-utils": "^3.1.0", - "hash-sum": "^1.0.2", - "loader-utils": "^1.1.0", - "vue-hot-reload-api": "^2.3.0", - "vue-style-loader": "^4.1.0" - }, - "dependencies": { - "hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", - "dev": true - } - } - }, - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "@vue/cli-shared-utils": { - "version": "5.0.8", - "resolved": "https://registry.npmmirror.com/@vue/cli-shared-utils/-/cli-shared-utils-5.0.8.tgz", - "integrity": "sha512-uK2YB7bBVuQhjOJF+O52P9yFMXeJVj7ozqJkwYE9PlMHL1LMHjtCYm4cSdOebuPzyP+/9p0BimM/OqxsevIopQ==", + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, - "requires": { - "@achrinza/node-ipc": "^9.2.5", - "chalk": "^4.1.2", - "execa": "^1.0.0", - "joi": "^17.4.0", - "launch-editor": "^2.2.1", - "lru-cache": "^6.0.0", - "node-fetch": "^2.6.7", - "open": "^8.0.2", - "ora": "^5.3.0", - "read-pkg": "^5.1.1", - "semver": "^7.3.4", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" } }, - "@vue/compiler-sfc": { - "version": "2.7.14", - "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz", - "integrity": "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==", - "requires": { - "@babel/parser": "^7.18.4", - "postcss": "^8.4.14", - "source-map": "^0.6.1" + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "@vue/component-compiler-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmmirror.com/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz", - "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==", - "dev": true, - "requires": { - "consolidate": "^0.15.1", - "hash-sum": "^1.0.2", - "lru-cache": "^4.1.2", - "merge-source-map": "^1.1.0", - "postcss": "^7.0.36", - "postcss-selector-parser": "^6.0.2", - "prettier": "^1.18.2 || ^2.0.0", - "source-map": "~0.6.1", - "vue-template-es2015-compiler": "^1.9.0" - }, - "dependencies": { - "hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true - } + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" } }, - "@vue/web-component-wrapper": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz", - "integrity": "sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==", - "dev": true - }, - "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "node_modules/@types/better-sqlite3": { + "version": "7.6.13", + "resolved": "https://registry.npmmirror.com/@types/better-sqlite3/-/better-sqlite3-7.6.13.tgz", + "integrity": "sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" } }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true + "node_modules/@types/crypto-js": { + "version": "4.2.2", + "resolved": "https://registry.npmmirror.com/@types/crypto-js/-/crypto-js-4.2.2.tgz", + "integrity": "sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==", + "dev": true, + "license": "MIT" }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true + "node_modules/@types/draco3d": { + "version": "1.4.10", + "resolved": "https://registry.npmmirror.com/@types/draco3d/-/draco3d-1.4.10.tgz", + "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==", + "license": "MIT" }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.7", + "resolved": "https://registry.npmmirror.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.7.tgz", + "integrity": "sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g==", "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" + "license": "MIT", + "dependencies": { + "hoist-non-react-statics": "^3.3.0" + }, + "peerDependencies": { + "@types/react": "*" } }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true + "node_modules/@types/http-proxy": { + "version": "1.17.17", + "resolved": "https://registry.npmmirror.com/@types/http-proxy/-/http-proxy-1.17.17.tgz", + "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.2.1", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-25.2.1.tgz", + "integrity": "sha512-CPrnr8voK8vC6eEtyRzvMpgp3VyVRhgclonE7qYi6P9sXwYb59ucfrnmFBTaP0yUi8Gk4yZg/LlTJULGxvTNsg==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/nprogress": { + "version": "0.2.3", + "resolved": "https://registry.npmmirror.com/@types/nprogress/-/nprogress-0.2.3.tgz", + "integrity": "sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/offscreencanvas": { + "version": "2019.7.3", + "resolved": "https://registry.npmmirror.com/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.27", + "resolved": "https://registry.npmmirror.com/@types/react/-/react-18.3.27.tgz", + "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" } }, - "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmmirror.com/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" } }, - "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "node_modules/@types/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } + "license": "MIT" }, - "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true + "node_modules/@types/stats.js": { + "version": "0.17.4", + "resolved": "https://registry.npmmirror.com/@types/stats.js/-/stats.js-0.17.4.tgz", + "integrity": "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==", + "license": "MIT" }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "node_modules/@types/styled-components": { + "version": "5.1.36", + "resolved": "https://registry.npmmirror.com/@types/styled-components/-/styled-components-5.1.36.tgz", + "integrity": "sha512-pGMRNY5G2rNDKEv2DOiFYa7Ft1r0jrhmgBwHhOMzPTgCjO76bCot0/4uEfqj7K0Jf1KdQmDtAuaDk9EAs9foSw==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "license": "MIT", + "dependencies": { + "@types/hoist-non-react-statics": "*", + "@types/react": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/stylis": { + "version": "4.2.7", + "resolved": "https://registry.npmmirror.com/@types/stylis/-/stylis-4.2.7.tgz", + "integrity": "sha512-VgDNokpBoKF+wrdvhAAfS55OMQpL6QRglwTwNC3kIgBrzZxA4WsFj+2eLfEA/uMUDzBcEhYmjSbwQakn/i3ajA==", + "license": "MIT" + }, + "node_modules/@types/three": { + "version": "0.182.0", + "resolved": "https://registry.npmmirror.com/@types/three/-/three-0.182.0.tgz", + "integrity": "sha512-WByN9V3Sbwbe2OkWuSGyoqQO8Du6yhYaXtXLoA5FkKTUJorZ+yOHBZ35zUUPQXlAKABZmbYp5oAqpA4RBjtJ/Q==", + "license": "MIT", + "dependencies": { + "@dimforge/rapier3d-compat": "~0.12.0", + "@tweenjs/tween.js": "~23.1.3", + "@types/stats.js": "*", + "@types/webxr": ">=0.5.17", + "@webgpu/types": "*", + "fflate": "~0.8.2", + "meshoptimizer": "~0.22.0" } }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/webxr": { + "version": "0.5.24", + "resolved": "https://registry.npmmirror.com/@types/webxr/-/webxr-0.5.24.tgz", + "integrity": "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmmirror.com/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" } }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true - }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmmirror.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "address": { - "version": "1.2.2", - "resolved": "https://registry.npmmirror.com/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "dev": true + "node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "license": "MIT", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "requires": { - "ajv": "^8.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true } } }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmmirror.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, - "requires": { - "color-convert": "^1.9.0" + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" } }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "arch": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "dev": true - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true + "node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } }, - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmmirror.com/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, - "requires": { - "lodash": "^4.17.14" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "async-validator": { - "version": "1.8.5", - "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-1.8.5.tgz", - "integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==", - "requires": { - "babel-runtime": "6.x" + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "autoprefixer": { - "version": "10.4.13", - "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.13.tgz", - "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" + "node_modules/@upstash/redis": { + "version": "1.37.0", + "resolved": "https://registry.npmmirror.com/@upstash/redis/-/redis-1.37.0.tgz", + "integrity": "sha512-LqOJ3+XWPLSZ2rGSed5DYG3ixybxb8EhZu3yQqF7MdZX1wLBG/FRcI6xcUZXHy/SS7mmXWyadrud0HJHkOc+uw==", + "license": "MIT", + "dependencies": { + "uncrypto": "^0.1.3" + } + }, + "node_modules/@vercel/build-utils": { + "version": "13.8.0", + "resolved": "https://registry.npmmirror.com/@vercel/build-utils/-/build-utils-13.8.0.tgz", + "integrity": "sha512-moQS4Qd0pvluPd6WRTHxLN3Hh0oSObVNdFv3V0spiEmCk/wm6571up3n1th2PQFqf1a3gheNfxzL7h4I9CWs2A==", + "license": "Apache-2.0", + "dependencies": { + "@vercel/python-analysis": "0.9.1" } }, - "babel-helper-vue-jsx-merge-props": { + "node_modules/@vercel/error-utils": { "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz", - "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==" + "resolved": "https://registry.npmmirror.com/@vercel/error-utils/-/error-utils-2.0.3.tgz", + "integrity": "sha512-CqC01WZxbLUxoiVdh9B/poPbNpY9U+tO1N9oWHwTl5YAZxcqXmmWJ8KNMFItJCUUWdY3J3xv8LvAuQv2KZ5YdQ==", + "license": "Apache-2.0" + }, + "node_modules/@vercel/hono": { + "version": "0.2.51", + "resolved": "https://registry.npmmirror.com/@vercel/hono/-/hono-0.2.51.tgz", + "integrity": "sha512-iYEjjF4qR3gTZpVoB4sMQNm5OOdKw5/P2bL1CtolDTeGaea9KwqUrLyXmdK4N41HIRZr/wduID31mmHhSdC3sA==", + "license": "Apache-2.0", + "dependencies": { + "@vercel/nft": "1.1.1", + "@vercel/node": "5.6.15", + "@vercel/static-config": "3.2.0", + "fs-extra": "11.1.0", + "path-to-regexp": "8.3.0", + "ts-morph": "12.0.0", + "zod": "3.22.4" + } }, - "babel-loader": { + "node_modules/@vercel/hono/node_modules/path-to-regexp": { "version": "8.3.0", - "resolved": "https://registry.npmmirror.com/babel-loader/-/babel-loader-8.3.0.tgz", - "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", - "dev": true, - "requires": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" + "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@vercel/hono/node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmmirror.com/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" } }, - "babel-plugin-component": { + "node_modules/@vercel/nft": { "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/babel-plugin-component/-/babel-plugin-component-1.1.1.tgz", - "integrity": "sha512-WUw887kJf2GH80Ng/ZMctKZ511iamHNqPhd9uKo14yzisvV7Wt1EckIrb8oq/uCz3B3PpAW7Xfl7AkTLDYT6ag==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "7.0.0-beta.35" - }, - "dependencies": { - "@babel/helper-module-imports": { - "version": "7.0.0-beta.35", - "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0-beta.35.tgz", - "integrity": "sha512-vaC1KyIZSuyWb3Lj277fX0pxivyHwuDU4xZsofqgYAbkDxNieMg2vuhzP5AgMweMY7fCQUMTi+BgPqTLjkxXFg==", - "dev": true, - "requires": { - "@babel/types": "7.0.0-beta.35", - "lodash": "^4.2.0" - } - }, - "@babel/types": { - "version": "7.0.0-beta.35", - "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.0.0-beta.35.tgz", - "integrity": "sha512-y9XT11CozHDgjWcTdxmhSj13rJVXpa5ZXwjjOiTedjaM0ba5ItqdS02t31EhPl7HtOWxsZkYCCUNrSfrOisA6w==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.2.0", - "to-fast-properties": "^2.0.0" - } - } + "resolved": "https://registry.npmmirror.com/@vercel/nft/-/nft-1.1.1.tgz", + "integrity": "sha512-mKMGa7CEUcXU75474kOeqHbtvK1kAcu4wiahhmlUenB5JbTQB8wVlDI8CyHR3rpGo0qlzoRWqcDzI41FUoBJCA==", + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^2.0.0", + "@rollup/pluginutils": "^5.1.3", + "acorn": "^8.6.0", + "acorn-import-attributes": "^1.9.5", + "async-sema": "^3.1.1", + "bindings": "^1.4.0", + "estree-walker": "2.0.2", + "glob": "^13.0.0", + "graceful-fs": "^4.2.9", + "node-gyp-build": "^4.2.2", + "picomatch": "^4.0.2", + "resolve-from": "^5.0.0" + }, + "bin": { + "nft": "out/cli.js" + }, + "engines": { + "node": ">=20" } }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmmirror.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" + "node_modules/@vercel/nft/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" } }, - "babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" + "node_modules/@vercel/nft/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, - "babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" + "node_modules/@vercel/nft/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@vercel/nft/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmmirror.com/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3" + "node_modules/@vercel/nft/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmmirror.com/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" + "node_modules/@vercel/nft/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" }, - "dependencies": { - "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmmirror.com/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "node_modules/@vercel/nft/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@vercel/node": { + "version": "5.6.15", + "resolved": "https://registry.npmmirror.com/@vercel/node/-/node-5.6.15.tgz", + "integrity": "sha512-xc5fxmdk8jtuUY8y9/8W5UhTn8R1Ii1Fb3q+V8Zv+2moU9enrrBADA9ercHgE0/DtoiNDpb9Wmvnrb4bUcFOzA==", + "license": "Apache-2.0", + "dependencies": { + "@edge-runtime/node-utils": "2.3.0", + "@edge-runtime/primitives": "4.1.0", + "@edge-runtime/vm": "3.2.0", + "@types/node": "20.11.0", + "@vercel/build-utils": "13.8.0", + "@vercel/error-utils": "2.0.3", + "@vercel/nft": "1.1.1", + "@vercel/static-config": "3.2.0", + "async-listen": "3.0.0", + "cjs-module-lexer": "1.2.3", + "edge-runtime": "2.5.9", + "es-module-lexer": "1.4.1", + "esbuild": "0.27.0", + "etag": "1.8.1", + "mime-types": "2.1.35", + "node-fetch": "2.6.9", + "path-to-regexp": "6.1.0", + "path-to-regexp-updated": "npm:path-to-regexp@6.3.0", + "ts-morph": "12.0.0", + "tsx": "4.21.0", + "typescript": "npm:typescript@5.9.3", + "undici": "5.28.4" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.0.tgz", + "integrity": "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/android-arm": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.27.0.tgz", + "integrity": "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/android-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.27.0.tgz", + "integrity": "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/android-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.27.0.tgz", + "integrity": "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.0.tgz", + "integrity": "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/darwin-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.27.0.tgz", + "integrity": "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.0.tgz", + "integrity": "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.0.tgz", + "integrity": "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-arm": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.27.0.tgz", + "integrity": "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.27.0.tgz", + "integrity": "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-ia32": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.27.0.tgz", + "integrity": "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-loong64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.27.0.tgz", + "integrity": "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.0.tgz", + "integrity": "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.0.tgz", + "integrity": "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.0.tgz", + "integrity": "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-s390x": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.27.0.tgz", + "integrity": "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/linux-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.27.0.tgz", + "integrity": "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.0.tgz", + "integrity": "sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.0.tgz", + "integrity": "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.0.tgz", + "integrity": "sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.0.tgz", + "integrity": "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.0.tgz", + "integrity": "sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/sunos-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.27.0.tgz", + "integrity": "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/win32-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.27.0.tgz", + "integrity": "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/win32-ia32": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.27.0.tgz", + "integrity": "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@esbuild/win32-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.27.0.tgz", + "integrity": "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@vercel/node/node_modules/@types/node": { + "version": "20.11.0", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.11.0.tgz", + "integrity": "sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true + "node_modules/@vercel/node/node_modules/esbuild": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.27.0.tgz", + "integrity": "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.0", + "@esbuild/android-arm": "0.27.0", + "@esbuild/android-arm64": "0.27.0", + "@esbuild/android-x64": "0.27.0", + "@esbuild/darwin-arm64": "0.27.0", + "@esbuild/darwin-x64": "0.27.0", + "@esbuild/freebsd-arm64": "0.27.0", + "@esbuild/freebsd-x64": "0.27.0", + "@esbuild/linux-arm": "0.27.0", + "@esbuild/linux-arm64": "0.27.0", + "@esbuild/linux-ia32": "0.27.0", + "@esbuild/linux-loong64": "0.27.0", + "@esbuild/linux-mips64el": "0.27.0", + "@esbuild/linux-ppc64": "0.27.0", + "@esbuild/linux-riscv64": "0.27.0", + "@esbuild/linux-s390x": "0.27.0", + "@esbuild/linux-x64": "0.27.0", + "@esbuild/netbsd-arm64": "0.27.0", + "@esbuild/netbsd-x64": "0.27.0", + "@esbuild/openbsd-arm64": "0.27.0", + "@esbuild/openbsd-x64": "0.27.0", + "@esbuild/openharmony-arm64": "0.27.0", + "@esbuild/sunos-x64": "0.27.0", + "@esbuild/win32-arm64": "0.27.0", + "@esbuild/win32-ia32": "0.27.0", + "@esbuild/win32-x64": "0.27.0" + } + }, + "node_modules/@vercel/node/node_modules/node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true + "node_modules/@vercel/node/node_modules/path-to-regexp": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-6.1.0.tgz", + "integrity": "sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==", + "license": "MIT" + }, + "node_modules/@vercel/node/node_modules/undici": { + "version": "5.28.4", + "resolved": "https://registry.npmmirror.com/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + "node_modules/@vercel/node/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true + "node_modules/@vercel/python-analysis": { + "version": "0.9.1", + "resolved": "https://registry.npmmirror.com/@vercel/python-analysis/-/python-analysis-0.9.1.tgz", + "integrity": "sha512-ZwEi/F2DPxFPYmfjHFy7qM3+JTWRxD1EMpbIotNNhUyd/pnIG0wNt7S73RJSx62n1Y7pmFOFowoImnhULQgKvA==", + "license": "Apache-2.0", + "dependencies": { + "@bytecodealliance/preview2-shim": "0.17.6", + "@renovatebot/pep440": "4.2.1", + "fs-extra": "11.1.1", + "js-yaml": "4.1.1", + "minimatch": "10.1.1", + "pip-requirements-js": "1.0.3", + "smol-toml": "1.5.2", + "zod": "3.22.4" + } + }, + "node_modules/@vercel/python-analysis/node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "node_modules/@vercel/python-analysis/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vercel/python-analysis/node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmmirror.com/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@vercel/static-config": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/@vercel/static-config/-/static-config-3.2.0.tgz", + "integrity": "sha512-UpOEIgWxWx0M+mDe1IMdHS6JuWM/L5nNIJ4ixX8v9JgBAejymo88OkgnmfLCNMem0Wd+b5vcQPWLdZybCndlsA==", + "license": "Apache-2.0", + "dependencies": { + "ajv": "8.6.3", + "json-schema-to-ts": "1.6.4", + "ts-morph": "12.0.0" + } + }, + "node_modules/@vercel/static-config/node_modules/ajv": { + "version": "8.6.3", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@vercel/static-config/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true + "node_modules/@webgpu/types": { + "version": "0.1.69", + "resolved": "https://registry.npmmirror.com/@webgpu/types/-/types-0.1.69.tgz", + "integrity": "sha512-RPmm6kgRbI8e98zSD3RVACvnuktIja5+yLgDAkTmxLr90BEwdTXRQWNLF3ETTTyH/8mKhznZuN5AveXYFEsMGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmmirror.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } }, - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/antd": { + "version": "5.29.3", + "resolved": "https://registry.npmmirror.com/antd/-/antd-5.29.3.tgz", + "integrity": "sha512-3DdbGCa9tWAJGcCJ6rzR8EJFsv2CtyEbkVabZE14pfgUHfCicWCj0/QzQVLDYg8CPfQk9BH7fHCoTXHTy7MP/A==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^7.2.1", + "@ant-design/cssinjs": "^1.23.0", + "@ant-design/cssinjs-utils": "^1.1.3", + "@ant-design/fast-color": "^2.0.6", + "@ant-design/icons": "^5.6.1", + "@ant-design/react-slick": "~1.1.2", + "@babel/runtime": "^7.26.0", + "@rc-component/color-picker": "~2.0.1", + "@rc-component/mutate-observer": "^1.1.0", + "@rc-component/qrcode": "~1.1.0", + "@rc-component/tour": "~1.15.1", + "@rc-component/trigger": "^2.3.0", + "classnames": "^2.5.1", + "copy-to-clipboard": "^3.3.3", + "dayjs": "^1.11.11", + "rc-cascader": "~3.34.0", + "rc-checkbox": "~3.5.0", + "rc-collapse": "~3.9.0", + "rc-dialog": "~9.6.0", + "rc-drawer": "~7.3.0", + "rc-dropdown": "~4.2.1", + "rc-field-form": "~2.7.1", + "rc-image": "~7.12.0", + "rc-input": "~1.8.0", + "rc-input-number": "~9.5.0", + "rc-mentions": "~2.20.0", + "rc-menu": "~9.16.1", + "rc-motion": "^2.9.5", + "rc-notification": "~5.6.4", + "rc-pagination": "~5.1.0", + "rc-picker": "~4.11.3", + "rc-progress": "~4.0.0", + "rc-rate": "~2.13.1", + "rc-resize-observer": "^1.4.3", + "rc-segmented": "~2.7.0", + "rc-select": "~14.16.8", + "rc-slider": "~11.1.9", + "rc-steps": "~6.0.1", + "rc-switch": "~4.1.0", + "rc-table": "~7.54.0", + "rc-tabs": "~15.7.0", + "rc-textarea": "~1.10.2", + "rc-tooltip": "~6.4.0", + "rc-tree": "~5.13.1", + "rc-tree-select": "~5.27.0", + "rc-upload": "~4.11.0", + "rc-util": "^5.44.4", + "scroll-into-view-if-needed": "^3.1.0", + "throttle-debounce": "^5.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/antd/node_modules/throttle-debounce": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "license": "MIT", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/as-table": { + "version": "1.0.55", + "resolved": "https://registry.npmmirror.com/as-table/-/as-table-1.0.55.tgz", + "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "printable-characters": "^1.0.42" + } + }, + "node_modules/async-listen": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/async-listen/-/async-listen-3.0.0.tgz", + "integrity": "sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/async-sema": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/async-sema/-/async-sema-3.1.1.tgz", + "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.24", + "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.24.tgz", + "integrity": "sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + { + "type": "github", + "url": "https://github.com/sponsors/ai" } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001766", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.13.4", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.13.4.tgz", + "integrity": "sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" } }, - "bonjour-service": { - "version": "1.0.14", - "resolved": "https://registry.npmmirror.com/bonjour-service/-/bonjour-service-1.0.14.tgz", - "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", "dev": true, - "requires": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" } }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true + "node_modules/better-sqlite3": { + "version": "12.6.2", + "resolved": "https://registry.npmmirror.com/better-sqlite3/-/better-sqlite3-12.6.2.tgz", + "integrity": "sha512-8VYKM3MjCa9WcaSAI3hzwhmyHVlH8tiGFwf0RlTsZPWJ1I5MkzjiudCo4KC4DxOaL/53A5B1sI/IbldNFDbsKA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.1" + }, + "engines": { + "node": "20.x || 22.x || 23.x || 24.x || 25.x" + } }, - "brace-expansion": { + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/blake3-wasm": { + "version": "2.1.5", + "resolved": "https://registry.npmmirror.com/blake3-wasm/-/blake3-wasm-2.1.5.tgz", + "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { + "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" } }, - "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "buffer": { + "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, - "buffer-from": { + "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, - "call-bind": { + "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "callsites": { + "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", "dev": true, - "requires": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" + "license": "MIT", + "engines": { + "node": ">= 6" } }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001766", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", + "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" + "license": "MIT", + "optional": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "caniuse-lite": { - "version": "1.0.30001441", - "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", - "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", - "dev": true + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" }, - "case-sensitive-paths-webpack-plugin": { - "version": "2.4.0", - "resolved": "https://registry.npmmirror.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", - "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", - "dev": true + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "license": "MIT" }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" } }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "node_modules/code-block-writer": { + "version": "10.1.1", + "resolved": "https://registry.npmmirror.com/code-block-writer/-/code-block-writer-10.1.1.tgz", + "integrity": "sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==", + "license": "MIT" + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" }, - "clean-css": { - "version": "5.3.1", - "resolved": "https://registry.npmmirror.com/clean-css/-/clean-css-5.3.1.tgz", - "integrity": "sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==", + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "dev": true, - "requires": { - "source-map": "~0.6.0" + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" } }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "node_modules/colorjs.io": { + "version": "0.5.2", + "resolved": "https://registry.npmmirror.com/colorjs.io/-/colorjs.io-0.5.2.tgz", + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", "dev": true, - "requires": { - "restore-cursor": "^3.1.0" + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "cli-highlight": { - "version": "2.1.11", - "resolved": "https://registry.npmmirror.com/cli-highlight/-/cli-highlight-2.1.11.tgz", - "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, - "requires": { - "chalk": "^4.0.0", - "highlight.js": "^10.7.1", - "mz": "^2.4.0", - "parse5": "^5.1.1", - "parse5-htmlparser2-tree-adapter": "^6.0.0", - "yargs": "^16.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "optional": true, + "peer": true + }, + "node_modules/compute-scroll-into-view": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", + "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmmirror.com/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" } }, - "cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", - "dev": true + "node_modules/convert-hrtime": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/convert-hrtime/-/convert-hrtime-3.0.0.tgz", + "integrity": "sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==", + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "clipboardy": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/clipboardy/-/clipboardy-2.3.0.tgz", - "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true, - "requires": { - "arch": "^2.1.1", - "execa": "^1.0.0", - "is-wsl": "^2.1.1" + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "optional": true, + "peer": true, + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" } }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmmirror.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "license": "MIT", + "dependencies": { + "toggle-selection": "^1.0.6" + } }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "license": "MIT", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, - "requires": { - "color-name": "1.1.3" + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" }, - "colord": { - "version": "2.9.3", - "resolved": "https://registry.npmmirror.com/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true + "node_modules/data-uri-to-buffer": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", + "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", + "dev": true, + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.19", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.19.tgz", + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/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 + } + } }, - "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmmirror.com/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmmirror.com/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" } }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmmirror.com/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" + "license": "Apache-2.0" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" } }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "node_modules/dompurify": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/dompurify/-/dompurify-3.2.7.tgz", + "integrity": "sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } }, - "connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true + "node_modules/draco3d": { + "version": "1.5.7", + "resolved": "https://registry.npmmirror.com/draco3d/-/draco3d-1.5.7.tgz", + "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==", + "license": "Apache-2.0" }, - "consolidate": { - "version": "0.15.1", - "resolved": "https://registry.npmmirror.com/consolidate/-/consolidate-0.15.1.tgz", - "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", - "dev": true, - "requires": { - "bluebird": "^3.1.1" + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" } }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "requires": { - "safe-buffer": "5.2.1" + "node_modules/echarts": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/echarts/-/echarts-6.0.0.tgz", + "integrity": "sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "2.3.0", + "zrender": "6.0.0" } }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true + "node_modules/echarts-for-react": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/echarts-for-react/-/echarts-for-react-3.0.6.tgz", + "integrity": "sha512-4zqLgTGWS3JvkQDXjzkR1k1CHRdpd6by0988TWMJgnvDytegWLbeP/VNZmMa+0VJx2eD7Y632bi2JquXDgiGJg==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "size-sensor": "^1.0.1" + }, + "peerDependencies": { + "echarts": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", + "react": "^15.0.0 || >=16.0.0" + } }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "node_modules/echarts/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "license": "0BSD" + }, + "node_modules/edge-runtime": { + "version": "2.5.9", + "resolved": "https://registry.npmmirror.com/edge-runtime/-/edge-runtime-2.5.9.tgz", + "integrity": "sha512-pk+k0oK0PVXdlT4oRp4lwh+unuKB7Ng4iZ2HB+EZ7QCEQizX360Rp/F4aRpgpRgdP2ufB35N+1KppHmYjqIGSg==", + "license": "MPL-2.0", + "dependencies": { + "@edge-runtime/format": "2.2.1", + "@edge-runtime/ponyfill": "2.4.2", + "@edge-runtime/vm": "3.2.0", + "async-listen": "3.0.1", + "mri": "1.2.0", + "picocolors": "1.0.0", + "pretty-ms": "7.0.1", + "signal-exit": "4.0.2", + "time-span": "4.0.0" + }, + "bin": { + "edge-runtime": "dist/cli/index.js" + }, + "engines": { + "node": ">=16" + } }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true + "node_modules/edge-runtime/node_modules/async-listen": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/async-listen/-/async-listen-3.0.1.tgz", + "integrity": "sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA==", + "license": "MIT", + "engines": { + "node": ">= 14" + } }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true + "node_modules/edge-runtime/node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "license": "ISC" }, - "copy-anything": { - "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "node_modules/electron-to-chromium": { + "version": "1.5.283", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.283.tgz", + "integrity": "sha512-3vifjt1HgrGW/h76UEeny+adYApveS9dH2h3p57JYzBSXJIKUJAvtmIytDKjcSCt9xHfrNCFJ7gts6vkhuq++w==", "dev": true, - "requires": { - "is-what": "^3.14.1" + "license": "ISC" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" } }, - "copy-webpack-plugin": { - "version": "9.1.0", - "resolved": "https://registry.npmmirror.com/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz", - "integrity": "sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==", + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, - "requires": { - "fast-glob": "^3.2.7", - "glob-parent": "^6.0.1", - "globby": "^11.0.3", - "normalize-path": "^3.0.0", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } + "optional": true, + "peer": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" } }, - "core-js": { - "version": "3.27.1", - "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.27.1.tgz", - "integrity": "sha512-GutwJLBChfGCpwwhbYoqfv03LAfmiz7e7D/BNxzeMxwQf10GRSzqiOjx7AmtEk+heiD/JWmBuyBPgFtx0Sg1ww==" + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } }, - "core-js-compat": { - "version": "3.27.1", - "resolved": "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.27.1.tgz", - "integrity": "sha512-Dg91JFeCDA17FKnneN7oCMz4BkQ4TcffkgHP4OWwp9yx3pi7ubqMDXXSacfNak1PQqjc95skyt+YBLHQJnkJwA==", - "dev": true, - "requires": { - "browserslist": "^4.21.4" + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" } }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "license": "MIT" }, - "cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" } }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmmirror.com/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" } }, - "css-declaration-sorter": { - "version": "6.3.1", - "resolved": "https://registry.npmmirror.com/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", - "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", - "dev": true - }, - "css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmmirror.com/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", - "dev": true, - "requires": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.19", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "css-minimizer-webpack-plugin": { - "version": "3.4.1", - "resolved": "https://registry.npmmirror.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", - "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, - "requires": { - "cssnano": "^5.0.6", - "jest-worker": "^27.0.2", - "postcss": "^8.3.5", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" - }, + "license": "MIT", "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - } + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" } }, - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.26", + "resolved": "https://registry.npmmirror.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz", + "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==", "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" } }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "cssnano": { - "version": "5.1.14", - "resolved": "https://registry.npmmirror.com/cssnano/-/cssnano-5.1.14.tgz", - "integrity": "sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==", - "dev": true, - "requires": { - "cssnano-preset-default": "^5.2.13", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - } - }, - "cssnano-preset-default": { - "version": "5.2.13", - "resolved": "https://registry.npmmirror.com/cssnano-preset-default/-/cssnano-preset-default-5.2.13.tgz", - "integrity": "sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ==", - "dev": true, - "requires": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.3", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.1", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - } - }, - "cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "requires": { - "css-tree": "^1.1.2" + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" - }, - "de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "requires": { - "ms": "2.1.2" + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==" - }, - "deepmerge": { - "version": "1.5.2", - "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-1.5.2.tgz", - "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==" - }, - "default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmmirror.com/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "requires": { - "execa": "^5.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "node_modules/eslint/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, - "requires": { - "clone": "^1.0.2" + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true - }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "requires": { - "path-type": "^4.0.0" + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" } }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, - "dns-packet": { - "version": "5.4.0", - "resolved": "https://registry.npmmirror.com/dns-packet/-/dns-packet-5.4.0.tgz", - "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "requires": { - "@leichtgewicht/ip-codec": "^2.0.1" + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "requires": { - "utila": "~0.4" + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "dom7": { - "version": "2.1.5", - "resolved": "https://registry.npmmirror.com/dom7/-/dom7-2.1.5.tgz", - "integrity": "sha512-xnhwVgyOh3eD++/XGtH+5qBwYTgCm0aW91GFgPJ3XG+jlsRLyJivnbP0QmUBFhI+Oaz9FV0s7cxgXHezwOEBYA==", - "requires": { - "ssr-window": "^2.0.0" - }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", "dependencies": { - "ssr-window": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-2.0.0.tgz", - "integrity": "sha512-NXzN+/HPObKAx191H3zKlYomE5WrVIkoCB5IaSdvKokxTpjBdWfr0RaP+1Z5KOfDT0ZVz+2tdtiBkhsEQ9p+0A==" - } + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "requires": { - "domelementtype": "^2.2.0" + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "node_modules/eslint/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "node_modules/eslint/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", - "dev": true - }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmmirror.com/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "easy-stack": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/easy-stack/-/easy-stack-1.0.1.tgz", - "integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==", - "dev": true - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true - }, - "element-ui": { - "version": "2.15.12", - "resolved": "https://registry.npmmirror.com/element-ui/-/element-ui-2.15.12.tgz", - "integrity": "sha512-Y5FMT2BPOindU2GkDEQ5ZKUVxDawKONRNMh2eL3uBx1FOtvUJ+L6IxXLVsNxq4WnaX/UnVNgWXebl7DobygZMg==", - "requires": { - "async-validator": "~1.8.1", - "babel-helper-vue-jsx-merge-props": "^2.0.0", - "deepmerge": "^1.2.0", - "normalize-wheel": "^1.0.1", - "resize-observer-polyfill": "^1.5.0", - "throttle-debounce": "^1.0.1" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "emojis-list": { + "node_modules/eslint/node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "requires": { - "once": "^1.4.0" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "optional": true, - "requires": { - "prr": "~1.0.1" + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/eslint/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "requires": { - "is-arrayish": "^0.2.1" + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmmirror.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, - "requires": { - "stackframe": "^1.3.4" + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" } }, - "esrecurse": { + "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "requires": { + "dependencies": { "estraverse": "^5.2.0" }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" } }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true + "node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true, + "license": "MIT" }, - "esutils": { + "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "etag": { + "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true - }, - "event-pubsub": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/event-pubsub/-/event-pubsub-4.3.0.tgz", - "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==", - "dev": true + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, - "eventemitter3": { + "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "license": "MIT" }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true + "node_modules/exit-hook": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/exit-hook/-/exit-hook-2.2.1.tgz", + "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmmirror.com/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dev": true, - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "dev": true, + "license": "MIT" }, - "fast-deep-equal": { + "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, - "fast-json-stable-stringify": { + "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "fastq": { + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz", "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "requires": { + "dependencies": { "reusify": "^1.0.4" } }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmmirror.com/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmmirror.com/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, - "requires": { - "to-regex-range": "^5.0.1" + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmmirror.com/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" }, - "dependencies": { + "peerDependenciesMeta": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "optional": true } } }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/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" } }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" } }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true - }, - "fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "dev": true - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", + "node_modules/fs-extra": { + "version": "11.1.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.1.0.tgz", + "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", + "license": "MIT", + "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" } }, - "fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true - }, - "fs.realpath": { + "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fundebug-javascript": { + "version": "2.8.8", + "resolved": "https://registry.npmmirror.com/fundebug-javascript/-/fundebug-javascript-2.8.8.tgz", + "integrity": "sha512-7F8usYnRfwIkYHDC2RGAyXQ/muE3+NRLjT9CxXUQH6JUSjewRPVqj9Eb7/McTc4ZtAGAdMlLk08vYK04uNyEEQ==", + "dependencies": { + "@bugsnag/safe-json-stringify": "^6.0.0" + } }, - "gensync": { + "node_modules/fundebug-revideo": { + "version": "0.8.0", + "resolved": "https://registry.npmmirror.com/fundebug-revideo/-/fundebug-revideo-0.8.0.tgz", + "integrity": "sha512-Wwo6/tr2YCtQ3WnjLrUht8ncGvQfsqEH1uiKWz6E/qHcP9Bk9xc6NdaXnV/lhdZilhlMo2ZD6ZLrK6+8tCB29Q==" + }, + "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" } }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "node_modules/get-source": { + "version": "2.0.12", + "resolved": "https://registry.npmmirror.com/get-source/-/get-source-2.0.12.tgz", + "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", "dev": true, - "requires": { - "pump": "^3.0.0" + "license": "Unlicense", + "dependencies": { + "data-uri-to-buffer": "^2.0.0", + "source-map": "^0.6.1" } }, - "glob": { + "node_modules/get-tsconfig": { + "version": "4.13.1", + "resolved": "https://registry.npmmirror.com/get-tsconfig/-/get-tsconfig-4.13.1.tgz", + "integrity": "sha512-EoY1N2xCn44xU6750Sx7OjOIT59FkmstNc3X6y5xpz7D5cBtZRe/3pSlTkDJgqsOk3WwZPkWfonhhUJfttQo3w==", + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmmirror.com/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, + "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "glob-parent": { + "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "requires": { + "dependencies": { "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" } }, - "glob-to-regexp": { + "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, - "globby": { + "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, - "requires": { + "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "graceful-fs": { + "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, - "gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, - "requires": { - "duplexer": "^0.1.2" - } + "license": "MIT" }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true + "node_modules/gsap": { + "version": "3.14.2", + "resolved": "https://registry.npmmirror.com/gsap/-/gsap-3.14.2.tgz", + "integrity": "sha512-P8/mMxVLU7o4+55+1TCnQrPmgjPKnwkzkXOK1asnR9Jg2lna4tEY5qBJjMmAaOBDDZWtlRjBXjLa0w53G/uBLA==", + "license": "Standard 'no charge' license: https://gsap.com/standard-license." }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "requires": { - "function-bind": "^1.1.1" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "requires": { - "ansi-regex": "^2.0.0" + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "hash-sum": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-2.0.0.tgz", - "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", - "dev": true - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmmirror.com/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", - "dev": true - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmmirror.com/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmmirror.com/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true - }, - "html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dev": true, - "requires": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "dependencies": { - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true - } + "node_modules/highlight.js": { + "version": "11.11.1", + "resolved": "https://registry.npmmirror.com/highlight.js/-/highlight.js-11.11.1.tgz", + "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12.0.0" } }, - "html-tags": { - "version": "3.2.0", - "resolved": "https://registry.npmmirror.com/html-tags/-/html-tags-3.2.0.tgz", - "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", - "dev": true - }, - "html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmmirror.com/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmmirror.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", "dev": true, - "requires": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" } }, - "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" + "node_modules/hono": { + "version": "4.11.7", + "resolved": "https://registry.npmmirror.com/hono/-/hono-4.11.7.tgz", + "integrity": "sha512-l7qMiNee7t82bH3SeyUCt9UF15EVmaBvsppY2zQtrbIhl/yzBTny+YUxsVjSjQ6gaqaeVtZmGocom8TzBlA4Yw==", + "license": "MIT", + "engines": { + "node": ">=16.9.0" } }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmmirror.com/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "license": "MIT", + "dependencies": { + "void-elements": "3.1.0" } }, - "http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmmirror.com/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "http-proxy": { + "node_modules/http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmmirror.com/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dev": true, - "requires": { - "@types/http-proxy": "^1.17.8", + "node_modules/http-proxy-middleware": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/http-proxy-middleware/-/http-proxy-middleware-3.0.5.tgz", + "integrity": "sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.15", + "debug": "^4.3.6", "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" + "is-glob": "^4.0.3", + "is-plain-object": "^5.0.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/i18next": { + "version": "25.8.0", + "resolved": "https://registry.npmmirror.com/i18next/-/i18next-25.8.0.tgz", + "integrity": "sha512-urrg4HMFFMQZ2bbKRK7IZ8/CTE7D8H4JRlAwqA2ZwDRFfdd0K/4cdbNNLgfn9mo+I/h9wJu61qJzH7jCFAhUZQ==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4" + }, + "peerDependencies": { + "typescript": "^5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true + "node_modules/i18next-browser-languagedetector": { + "version": "8.2.0", + "resolved": "https://registry.npmmirror.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.2.0.tgz", + "integrity": "sha512-P+3zEKLnOF0qmiesW383vsLdtQVyKtCNA9cjSoKCppTKPQVfKd2W8hbVo5ZhNJKDqeM7BOcvNoKJOjpHh4Js9g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" + } }, - "ieee754": { + "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true + "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" }, - "ignore": { + "node_modules/ignore": { "version": "5.2.4", "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz", "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true + "dev": true, + "engines": { + "node": ">= 4" + } }, - "image-size": { + "node_modules/image-size": { "version": "0.5.5", "resolved": "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz", "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", "dev": true, - "optional": true + "optional": true, + "peer": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "5.1.4", + "resolved": "https://registry.npmmirror.com/immutable/-/immutable-5.1.4.tgz", + "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==", + "dev": true, + "license": "MIT" }, - "import-fresh": { + "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "requires": { + "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" } }, - "inflight": { + "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, - "inherits": { + "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "dev": true, + "license": "MIT", + "optional": true }, - "is-binary-path": { + "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, - "requires": { - "has": "^1.0.3" + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extglob": { + "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-file-esm": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/is-file-esm/-/is-file-esm-1.0.0.tgz", - "integrity": "sha512-rZlaNKb4Mr8WlRu2A9XdeoKgnO5aA53XdPHgCKVyCrQ/rWi89RET1+bq37Ru46obaQXeiX4vmFIm1vks41hoSA==", - "dev": true, - "requires": { - "read-pkg-up": "^7.0.1" + "engines": { + "node": ">=0.10.0" } }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { + "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { + "dependencies": { "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true - }, - "is-number": { + "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, - "requires": { - "isobject": "^3.0.1" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "is-what": { + "node_modules/is-what": { "version": "3.14.1", "resolved": "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz", "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "optional": true, + "peer": true }, - "isexe": { + "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, - "javascript-stringify": { + "node_modules/javascript-stringify": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz", "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", - "dev": true - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } + "license": "MIT" }, - "joi": { - "version": "17.7.0", - "resolved": "https://registry.npmmirror.com/joi/-/joi-17.7.0.tgz", - "integrity": "sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==", + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmmirror.com/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "dev": true, - "requires": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.0", - "@sideway/pinpoint": "^2.0.0" + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" } }, - "js-base64": { - "version": "2.6.4", - "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-2.6.4.tgz", - "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==" - }, - "js-message": { - "version": "1.0.7", - "resolved": "https://registry.npmmirror.com/js-message/-/js-message-1.0.7.tgz", - "integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==", - "dev": true - }, - "js-tokens": { + "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "license": "MIT" }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-to-ts": { + "version": "1.6.4", + "resolved": "https://registry.npmmirror.com/json-schema-to-ts/-/json-schema-to-ts-1.6.4.tgz", + "integrity": "sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.6", + "ts-toolbelt": "^6.15.5" + } }, - "json-schema-traverse": { + "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "json5": { + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "license": "MIT", + "dependencies": { + "string-convert": "^0.2.0" + } + }, + "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" } }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "klona": { - "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", - "dev": true - }, - "launch-editor": { - "version": "2.6.0", - "resolved": "https://registry.npmmirror.com/launch-editor/-/launch-editor-2.6.0.tgz", - "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", - "dev": true, - "requires": { - "picocolors": "^1.0.0", - "shell-quote": "^1.7.3" + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "launch-editor-middleware": { - "version": "2.6.0", - "resolved": "https://registry.npmmirror.com/launch-editor-middleware/-/launch-editor-middleware-2.6.0.tgz", - "integrity": "sha512-K2yxgljj5TdCeRN1lBtO3/J26+AIDDDw+04y6VAiZbWcTdBwsYN6RrZBnW5DN/QiSIdKNjKdATLUUluWWFYTIA==", + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, - "requires": { - "launch-editor": "^2.6.0" + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" } }, - "less": { + "node_modules/less": { "version": "4.1.3", "resolved": "https://registry.npmmirror.com/less/-/less-4.1.3.tgz", "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", "dev": true, - "requires": { + "optional": true, + "peer": true, + "dependencies": { "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "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", - "parse-node-version": "^1.0.1", - "source-map": "~0.6.0", - "tslib": "^2.3.0" - }, - "dependencies": { - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "optional": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "optional": true - } + "source-map": "~0.6.0" } }, - "less-loader": { - "version": "8.1.1", - "resolved": "https://registry.npmmirror.com/less-loader/-/less-loader-8.1.1.tgz", - "integrity": "sha512-K93jJU7fi3n6rxVvzp8Cb88Uy9tcQKfHlkoezHwKILXhlNYiRQl4yowLIkQqmBXOH/5I8yoKiYeIf781HGkW9g==", + "node_modules/less/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, - "requires": { - "klona": "^2.0.4" + "optional": true, + "peer": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" } }, - "lib-flexible": { - "version": "0.3.2", - "resolved": "https://registry.npmmirror.com/lib-flexible/-/lib-flexible-0.3.2.tgz", - "integrity": "sha512-9yowMWA70tKhKdCJDaltY0mNQG4OWo7pWKScnTp9aiSxS7s20ZYlwBRE3335nweOf5qKXVC7sDxJwMPM8/MFZg==" - }, - "lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "dev": true + "node_modules/less/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "semver": "bin/semver" + } }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } }, - "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "dev": true, + "license": "MPL-2.0", + "optional": true, + "peer": true, + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmmirror.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "p-locate": "^4.1.0" + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmmirror.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "lodash.defaultsdeep": { - "version": "4.6.1", - "resolved": "https://registry.npmmirror.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", - "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", - "dev": true + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "lodash.kebabcase": { - "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", - "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", - "dev": true + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "lodash.mapvalues": { - "version": "4.6.0", - "resolved": "https://registry.npmmirror.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", - "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==", - "dev": true + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmmirror.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmmirror.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "log-update": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/log-update/-/log-update-2.3.0.tgz", - "integrity": "sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==", + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "cli-cursor": "^2.0.0", - "wrap-ansi": "^3.0.1" + "license": "MIT", + "engines": { + "node": ">=14" }, - "dependencies": { - "ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz", - "integrity": "sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0" - } - } + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, - "lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, - "requires": { - "tslib": "^2.0.3" + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" } }, - "lru-cache": { + "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "requires": { + "dependencies": { "yallist": "^3.0.2" } }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "dev": true, - "requires": { - "semver": "^6.0.0" + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" } }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true - }, - "memfs": { - "version": "3.4.12", - "resolved": "https://registry.npmmirror.com/memfs/-/memfs-3.4.12.tgz", - "integrity": "sha512-BcjuQn6vfqP+k100e0E9m61Hyqa//Brp+I3f0OBmN0ATHlFA8vx3Lt8z57R3u2bPqe3WGDBC+nF72fTH7isyEw==", - "dev": true, - "requires": { - "fs-monkey": "^1.0.3" + "node_modules/make-cancellable-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/make-cancellable-promise/-/make-cancellable-promise-2.0.0.tgz", + "integrity": "sha512-3SEQqTpV9oqVsIWqAcmDuaNeo7yBO3tqPtqGRcKkEo0lrzD3wqbKG9mkxO65KoOgXqj+zH2phJ2LiAsdzlogSw==", + "license": "MIT", + "funding": { + "url": "https://github.com/wojtekmaj/make-cancellable-promise?sponsor=1" } }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true + "node_modules/make-event-props": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/make-event-props/-/make-event-props-2.0.0.tgz", + "integrity": "sha512-G/hncXrl4Qt7mauJEXSg3AcdYzmpkIITTNl5I+rH9sog5Yw0kK6vseJjCaPfOXqOqQuPUP89Rkhfz5kPS8ijtw==", + "license": "MIT", + "funding": { + "url": "https://github.com/wojtekmaj/make-event-props?sponsor=1" + } + }, + "node_modules/marked": { + "version": "11.2.0", + "resolved": "https://registry.npmmirror.com/marked/-/marked-11.2.0.tgz", + "integrity": "sha512-HR0m3bvu0jAPYiIvLUUQtdg1g6D247//lvcekpHO1WMvbwDlwSkZAX9Lw4F4YHE1T0HaaNve0tuAWuV1UJ6vtw==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } }, - "merge-source-map": { + "node_modules/math-intrinsics": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "source-map": "^0.6.1" + "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" } }, - "merge-stream": { + "node_modules/merge-refs": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "resolved": "https://registry.npmmirror.com/merge-refs/-/merge-refs-2.0.0.tgz", + "integrity": "sha512-3+B21mYK2IqUWnd2EivABLT7ueDhb0b8/dGK8LoFQPrU61YITeCMn14F7y7qZafWNZhUEKb24cJdiT5Wxs3prg==", + "license": "MIT", + "funding": { + "url": "https://github.com/wojtekmaj/merge-refs?sponsor=1" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } }, - "merge2": { + "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true + "engines": { + "node": ">= 8" + } }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true + "node_modules/meshoptimizer": { + "version": "0.22.0", + "resolved": "https://registry.npmmirror.com/meshoptimizer/-/meshoptimizer-0.22.0.tgz", + "integrity": "sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==", + "license": "MIT" }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" } }, - "mime": { + "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true + "dev": true, + "optional": true, + "peer": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } }, - "mime-db": { + "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true + "engines": { + "node": ">= 0.6" + } }, - "mime-types": { + "node_modules/mime-types": { "version": "2.1.35", "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { + "dependencies": { "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "mini-css-extract-plugin": { - "version": "2.7.2", - "resolved": "https://registry.npmmirror.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", - "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", - "dev": true, - "requires": { - "schema-utils": "^4.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "node_modules/miniflare": { + "version": "3.20250718.3", + "resolved": "https://registry.npmmirror.com/miniflare/-/miniflare-3.20250718.3.tgz", + "integrity": "sha512-JuPrDJhwLrNLEJiNLWO7ZzJrv/Vv9kZuwMYCfv0LskQDM6Eonw4OvywO3CH/wCGjgHzha/qyjUh8JQ068TjDgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "0.8.1", + "acorn": "8.14.0", + "acorn-walk": "8.3.2", + "exit-hook": "2.2.1", + "glob-to-regexp": "0.4.1", + "stoppable": "1.1.0", + "undici": "^5.28.5", + "workerd": "1.20250718.0", + "ws": "8.18.0", + "youch": "3.3.4", + "zod": "3.22.3" + }, + "bin": { + "miniflare": "bootstrap.js" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/miniflare/node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/miniflare/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmmirror.com/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } + "utf-8-validate": { + "optional": true } } }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "node_modules/miniflare/node_modules/zod": { + "version": "3.22.3", + "resolved": "https://registry.npmmirror.com/zod/-/zod-3.22.3.tgz", + "integrity": "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } }, - "minimatch": { + "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { + "dependencies": { "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" } }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" } }, - "module-alias": { - "version": "2.2.2", - "resolved": "https://registry.npmmirror.com/module-alias/-/module-alias-2.2.2.tgz", - "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==", - "dev": true + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmmirror.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, + "node_modules/monaco-editor": { + "version": "0.55.1", + "resolved": "https://registry.npmmirror.com/monaco-editor/-/monaco-editor-0.55.1.tgz", + "integrity": "sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==", + "license": "MIT", + "dependencies": { + "dompurify": "3.2.7", + "marked": "14.0.0" + } }, - "mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", - "dev": true + "node_modules/monaco-editor/node_modules/marked": { + "version": "14.0.0", + "resolved": "https://registry.npmmirror.com/marked/-/marked-14.0.0.tgz", + "integrity": "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, - "multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmmirror.com/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", "dev": true, - "requires": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" + "license": "MIT", + "bin": { + "mustache": "bin/mustache" } }, - "mz": { + "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmmirror.com/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" + } }, - "natives": { - "version": "1.1.6", - "resolved": "https://registry.npmmirror.com/natives/-/natives-1.1.6.tgz", - "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==" + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" }, - "needle": { + "node_modules/needle": { "version": "3.2.0", "resolved": "https://registry.npmmirror.com/needle/-/needle-3.2.0.tgz", "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", "dev": true, "optional": true, - "requires": { + "peer": true, + "dependencies": { "debug": "^3.2.6", "iconv-lite": "^0.6.3", "sax": "^1.2.4" }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } + "ms": "^2.1.1" } }, - "negotiator": { + "node_modules/needle/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true + "node_modules/node-abi": { + "version": "3.87.0", + "resolved": "https://registry.npmmirror.com/node-abi/-/node-abi-3.87.0.tgz", + "integrity": "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } }, - "no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" + "node_modules/node-abi/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", "dev": true, - "requires": { + "license": "MIT", + "optional": true + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmmirror.com/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmmirror.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } }, - "node-releases": { - "version": "2.0.8", - "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.8.tgz", - "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", - "dev": true + "node_modules/node-readable-to-web-readable-stream": { + "version": "0.4.2", + "resolved": "https://registry.npmmirror.com/node-readable-to-web-readable-stream/-/node-readable-to-web-readable-stream-0.4.2.tgz", + "integrity": "sha512-/cMZNI34v//jUTrI+UIo4ieHAB5EZRY/+7OmXZgBxaWBMcW2tGdceIw06RFxWxrKZ5Jp3sI2i5TsRo+CBhtVLQ==", + "license": "MIT", + "optional": true }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "license": "ISC", "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "abbrev": "^3.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "normalize-path": { + "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - }, - "normalize-wheel": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/normalize-wheel/-/normalize-wheel-1.0.1.tgz", - "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==" - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", "dev": true, - "requires": { - "path-key": "^2.0.0" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "nprogress": { + "node_modules/nprogress": { "version": "0.2.0", "resolved": "https://registry.npmmirror.com/nprogress/-/nprogress-0.2.0.tgz", "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "object-assign": { + "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "license": "MIT", + "engines": { + "node": ">= 6" } }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true + "node_modules/oh-my-live2d": { + "version": "0.19.3", + "resolved": "https://registry.npmmirror.com/oh-my-live2d/-/oh-my-live2d-0.19.3.tgz", + "integrity": "sha512-EWva8OUmcExIFIhqGkeiVPQt44RvYYFg+nmpkrZgQVQ+xofVFq4SDYAg5NcdK40HxyV4vORBJEg4OHIHP96MrA==", + "license": "MIT" }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", "dev": true, - "requires": { - "ee-first": "1.1.1" - } + "license": "MIT" }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true + "node_modules/ohm-js": { + "version": "17.5.0", + "resolved": "https://registry.npmmirror.com/ohm-js/-/ohm-js-17.5.0.tgz", + "integrity": "sha512-l4Sa7026+6jsvYbt0PXKmL+f+ML32fD++IznLgxDhx2t9Cx6NC7zwRqblCujPHGGmkQerHoeBzRutdxaw/S72g==", + "license": "MIT", + "engines": { + "node": ">=0.12.1" + } }, - "once": { + "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { + "dependencies": { "wrappy": "1" } }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "8.4.0", - "resolved": "https://registry.npmmirror.com/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "opener": { - "version": "1.5.2", - "resolved": "https://registry.npmmirror.com/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true - }, - "ora": { - "version": "5.4.1", - "resolved": "https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "requires": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "node_modules/openai": { + "version": "6.25.0", + "resolved": "https://registry.npmmirror.com/openai/-/openai-6.25.0.tgz", + "integrity": "sha512-mEh6VZ2ds2AGGokWARo18aPISI1OhlgdEIC1ewhkZr8pSIT31dec0ecr9Nhxx0JlybyOgoAT1sWeKtwPZzJyww==", + "license": "Apache-2.0", + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "ws": "^8.18.0", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } + "zod": { + "optional": true } } }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmmirror.com/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dev": true, - "requires": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" } }, - "parent-module": { + "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "requires": { + "dependencies": { "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "node_modules/parse-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "license": "MIT", + "engines": { + "node": ">=6" } }, - "parse-node-version": { + "node_modules/parse-node-version": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz", "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "dev": true - }, - "parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", "dev": true, - "requires": { - "parse5": "^6.0.1" - }, - "dependencies": { - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - } + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.10" } }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "license": "MIT" }, - "path-exists": { + "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "path-is-absolute": { + "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "path-parse": { + "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.2.6", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" }, - "path-type": { + "node_modules/path-to-regexp-updated": { + "name": "path-to-regexp", + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "license": "MIT" + }, + "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pdfjs-dist": { + "version": "5.6.205", + "resolved": "https://registry.npmmirror.com/pdfjs-dist/-/pdfjs-dist-5.6.205.tgz", + "integrity": "sha512-tlUj+2IDa7G1SbvBNN74UHRLJybZDWYom+k6p5KIZl7huBvsA4APi6mKL+zCxd3tLjN5hOOEE9Tv7VdzO88pfg==", + "license": "Apache-2.0", + "engines": { + "node": ">=20.19.0 || >=22.13.0 || >=24" + }, + "optionalDependencies": { + "@napi-rs/canvas": "^0.1.96", + "node-readable-to-web-readable-stream": "^0.4.2" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, - "picomatch": { + "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "pify": { + "node_modules/pify": { "version": "4.0.1", "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "optional": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, - "requires": { - "find-up": "^4.0.0" + "optional": true, + "peer": true, + "engines": { + "node": ">=6" } }, - "portfinder": { - "version": "1.0.32", - "resolved": "https://registry.npmmirror.com/portfinder/-/portfinder-1.0.32.tgz", - "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", - "dev": true, - "requires": { - "async": "^2.6.4", - "debug": "^3.2.7", - "mkdirp": "^0.5.6" - }, + "node_modules/pip-requirements-js": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/pip-requirements-js/-/pip-requirements-js-1.0.3.tgz", + "integrity": "sha512-1O9Bx0mPOZht3tW4LuxOA46qkD8A1AGymWXz3UwIMqGQgiTiOaFptsCf+9IE67qcbBrg8KHG6l8ePF7CoFRW/A==", + "license": "MPL-2.0", "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "ohm-js": "^17.1.0" } }, - "postcss": { - "version": "8.4.20", - "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.20.tgz", - "integrity": "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==", - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmmirror.com/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" } }, - "postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmmirror.com/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" + "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" } }, - "postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmmirror.com/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmmirror.com/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" } }, - "postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmmirror.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", "dev": true, - "requires": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" } }, - "postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "dev": true - }, - "postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true - }, - "postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true - }, - "postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true - }, - "postcss-loader": { - "version": "6.2.1", - "resolved": "https://registry.npmmirror.com/postcss-loader/-/postcss-loader-6.2.1.tgz", - "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", "dev": true, - "requires": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.5" - }, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } + "postcss": { + "optional": true + }, + "tsx": { + "optional": true }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "yaml": { + "optional": true } } }, - "postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmmirror.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" } }, - "postcss-merge-rules": { - "version": "5.1.3", - "resolved": "https://registry.npmmirror.com/postcss-merge-rules/-/postcss-merge-rules-5.1.3.tgz", - "integrity": "sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==", + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dev": true, - "requires": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" } }, - "postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/potpack": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/potpack/-/potpack-1.0.2.tgz", + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==", + "license": "ISC" + }, + "node_modules/prebuild-install": { + "version": "7.1.2", + "resolved": "https://registry.npmmirror.com/prebuild-install/-/prebuild-install-7.1.2.tgz", + "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" } }, - "postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "requires": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" + "license": "MIT", + "engines": { + "node": ">= 0.8.0" } }, - "postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmmirror.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" + "node_modules/pretty-ms": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/pretty-ms/-/pretty-ms-7.0.1.tgz", + "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", + "license": "MIT", + "dependencies": { + "parse-ms": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmmirror.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "node_modules/printable-characters": { + "version": "1.0.42", + "resolved": "https://registry.npmmirror.com/printable-characters/-/printable-characters-1.0.42.tgz", + "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } + "license": "Unlicense" }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, - "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true, - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" + "optional": true, + "peer": true + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" } }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0" + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" } }, - "postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true + "node_modules/rc-cascader": { + "version": "3.34.0", + "resolved": "https://registry.npmmirror.com/rc-cascader/-/rc-cascader-3.34.0.tgz", + "integrity": "sha512-KpXypcvju9ptjW9FaN2NFcA2QH9E9LHKq169Y0eWtH4e/wHQ5Wh5qZakAgvb8EKZ736WZ3B0zLLOBsrsja5Dag==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "classnames": "^2.3.1", + "rc-select": "~14.16.2", + "rc-tree": "~5.13.0", + "rc-util": "^5.43.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } }, - "postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" + "node_modules/rc-checkbox": { + "version": "3.5.0", + "resolved": "https://registry.npmmirror.com/rc-checkbox/-/rc-checkbox-3.5.0.tgz", + "integrity": "sha512-aOAQc3E98HteIIsSqm6Xk2FPKIER6+5vyEFMZfo73TqM+VVAIqOkHoPjgKLqSNtVLWScoaM7vY2ZrGEheI79yg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.25.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" + "node_modules/rc-collapse": { + "version": "3.9.0", + "resolved": "https://registry.npmmirror.com/rc-collapse/-/rc-collapse-3.9.0.tgz", + "integrity": "sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.3.4", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" + "node_modules/rc-dialog": { + "version": "9.6.0", + "resolved": "https://registry.npmmirror.com/rc-dialog/-/rc-dialog-9.6.0.tgz", + "integrity": "sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" + "node_modules/rc-drawer": { + "version": "7.3.0", + "resolved": "https://registry.npmmirror.com/rc-drawer/-/rc-drawer-7.3.0.tgz", + "integrity": "sha512-DX6CIgiBWNpJIMGFO8BAISFkxiuKitoizooj4BDyee8/SnBn0zwO2FHrNDpqqepj0E/TFTDpmEBCyFuTgC7MOg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@rc-component/portal": "^1.1.1", + "classnames": "^2.2.6", + "rc-motion": "^2.6.1", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" + "node_modules/rc-dropdown": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/rc-dropdown/-/rc-dropdown-4.2.1.tgz", + "integrity": "sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.6", + "rc-util": "^5.44.1" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" } }, - "postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" + "node_modules/rc-field-form": { + "version": "2.7.1", + "resolved": "https://registry.npmmirror.com/rc-field-form/-/rc-field-form-2.7.1.tgz", + "integrity": "sha512-vKeSifSJ6HoLaAB+B8aq/Qgm8a3dyxROzCtKNCsBQgiverpc4kWDQihoUwzUj+zNWJOykwSY4dNX3QrGwtVb9A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/async-validator": "^5.0.3", + "rc-util": "^5.32.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dev": true, - "requires": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" + "node_modules/rc-image": { + "version": "7.12.0", + "resolved": "https://registry.npmmirror.com/rc-image/-/rc-image-7.12.0.tgz", + "integrity": "sha512-cZ3HTyyckPnNnUb9/DRqduqzLfrQRyi+CdHjdqgsyDpI3Ln5UX1kXnAhPBSJj9pVRzwRFgqkN7p9b6HBDjmu/Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/portal": "^1.0.2", + "classnames": "^2.2.6", + "rc-dialog": "~9.6.0", + "rc-motion": "^2.6.2", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" + "node_modules/rc-input": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/rc-input/-/rc-input-1.8.0.tgz", + "integrity": "sha512-KXvaTbX+7ha8a/k+eg6SYRVERK0NddX8QX7a7AnRvUa/rEH0CNMlpcBzBkhI0wp2C8C4HlMoYl8TImSN+fuHKA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" } }, - "postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmmirror.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "dev": true, - "requires": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" + "node_modules/rc-input-number": { + "version": "9.5.0", + "resolved": "https://registry.npmmirror.com/rc-input-number/-/rc-input-number-9.5.0.tgz", + "integrity": "sha512-bKaEvB5tHebUURAEXw35LDcnRZLq3x1k7GxfAqBMzmpHkDGzjAtnUL8y4y5N15rIFIg5IJgwr211jInl3cipag==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/mini-decimal": "^1.0.1", + "classnames": "^2.2.5", + "rc-input": "~1.8.0", + "rc-util": "^5.40.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "postcss-px2rem": { - "version": "0.3.0", - "resolved": "https://registry.npmmirror.com/postcss-px2rem/-/postcss-px2rem-0.3.0.tgz", - "integrity": "sha512-ACZRimmOEDma0L/sI5ENREY3BoYB4LNME9iM9VcZU2t598OB9KLEPDYX8JBohNsvwJ+Nvlvk3IcGm0bRqOBC/Q==", - "requires": { - "postcss": "^5.0.0", - "px2rem": "~0.5.0" + "node_modules/rc-mentions": { + "version": "2.20.0", + "resolved": "https://registry.npmmirror.com/rc-mentions/-/rc-mentions-2.20.0.tgz", + "integrity": "sha512-w8HCMZEh3f0nR8ZEd466ATqmXFCMGMN5UFCzEUL0bM/nGw/wOS2GgRzKBcm19K++jDyuWCOJOdgcKGXU3fXfbQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.6", + "rc-input": "~1.8.0", + "rc-menu": "~9.16.0", + "rc-textarea": "~1.10.0", + "rc-util": "^5.34.1" }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-menu": { + "version": "9.16.1", + "resolved": "https://registry.npmmirror.com/rc-menu/-/rc-menu-9.16.1.tgz", + "integrity": "sha512-ghHx6/6Dvp+fw8CJhDUHFHDJ84hJE3BXNCzSgLdmNiFErWSOaZNsihDAsKq9ByTALo/xkNIwtDFGIl6r+RPXBg==", + "license": "MIT", "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmmirror.com/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.0.0", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.3.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-motion": { + "version": "2.9.5", + "resolved": "https://registry.npmmirror.com/rc-motion/-/rc-motion-2.9.5.tgz", + "integrity": "sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.44.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-notification": { + "version": "5.6.4", + "resolved": "https://registry.npmmirror.com/rc-notification/-/rc-notification-5.6.4.tgz", + "integrity": "sha512-KcS4O6B4qzM3KH7lkwOB7ooLPZ4b6J+VMmQgT51VZCeEcmghdeR4IrMcFq0LG+RPdnbe/ArT086tGM8Snimgiw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.9.0", + "rc-util": "^5.20.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-overflow": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/rc-overflow/-/rc-overflow-1.5.0.tgz", + "integrity": "sha512-Lm/v9h0LymeUYJf0x39OveU52InkdRXqnn2aYXfWmo8WdOonIKB2kfau+GF0fWq6jPgtdO9yMqveGcK6aIhJmg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.37.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-pagination": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/rc-pagination/-/rc-pagination-5.1.0.tgz", + "integrity": "sha512-8416Yip/+eclTFdHXLKTxZvn70duYVGTvUUWbckCCZoIl3jagqke3GLsFrMs0bsQBikiYpZLD9206Ej4SOdOXQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.38.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-picker": { + "version": "4.11.3", + "resolved": "https://registry.npmmirror.com/rc-picker/-/rc-picker-4.11.3.tgz", + "integrity": "sha512-MJ5teb7FlNE0NFHTncxXQ62Y5lytq6sh5nUw0iH8OkHL/TjARSEvSHpr940pWgjGANpjCwyMdvsEV55l5tYNSg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.1", + "rc-overflow": "^1.3.2", + "rc-resize-observer": "^1.4.0", + "rc-util": "^5.43.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "date-fns": ">= 2.x", + "dayjs": ">= 1.x", + "luxon": ">= 3.x", + "moment": ">= 2.x", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + }, + "peerDependenciesMeta": { + "date-fns": { + "optional": true }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + "dayjs": { + "optional": true }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "requires": { - "ansi-regex": "^2.0.0" - } + "luxon": { + "optional": true }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", - "requires": { - "has-flag": "^1.0.0" - } + "moment": { + "optional": true } } }, - "postcss-reduce-initial": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.1.tgz", - "integrity": "sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" + "node_modules/rc-progress": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/rc-progress/-/rc-progress-4.0.0.tgz", + "integrity": "sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" + "node_modules/rc-rate": { + "version": "2.13.1", + "resolved": "https://registry.npmmirror.com/rc-rate/-/rc-rate-2.13.1.tgz", + "integrity": "sha512-QUhQ9ivQ8Gy7mtMZPAjLbxBt5y9GRp65VcUyGUMF3N3fhiftivPHdpuDIaWIMOTEprAjZPC08bls1dQB+I1F2Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "node_modules/rc-resize-observer": { + "version": "1.4.3", + "resolved": "https://registry.npmmirror.com/rc-resize-observer/-/rc-resize-observer-1.4.3.tgz", + "integrity": "sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.44.1", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" + "node_modules/rc-segmented": { + "version": "2.7.1", + "resolved": "https://registry.npmmirror.com/rc-segmented/-/rc-segmented-2.7.1.tgz", + "integrity": "sha512-izj1Nw/Dw2Vb7EVr+D/E9lUTkBe+kKC+SAFSU9zqr7WV2W5Ktaa9Gc7cB2jTqgk8GROJayltaec+DBlYKc6d+g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-motion": "^2.4.4", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" } }, - "postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" + "node_modules/rc-select": { + "version": "14.16.8", + "resolved": "https://registry.npmmirror.com/rc-select/-/rc-select-14.16.8.tgz", + "integrity": "sha512-NOV5BZa1wZrsdkKaiK7LHRuo5ZjZYMDxPP6/1+09+FB4KoNi8jcG1ZqLE3AVCxEsYMBe65OBx71wFoHRTP3LRg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.1.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.3.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" } }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "prettier": { - "version": "2.8.1", - "resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.8.1.tgz", - "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", - "dev": true, - "optional": true + "node_modules/rc-slider": { + "version": "11.1.9", + "resolved": "https://registry.npmmirror.com/rc-slider/-/rc-slider-11.1.9.tgz", + "integrity": "sha512-h8IknhzSh3FEM9u8ivkskh+Ef4Yo4JRIY2nj7MrH6GQmrwV6mcpJf5/4KgH5JaVI1H3E52yCdpOlVyGZIeph5A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } }, - "pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dev": true, - "requires": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" + "node_modules/rc-steps": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/rc-steps/-/rc-steps-6.0.1.tgz", + "integrity": "sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.16.7", + "classnames": "^2.2.3", + "rc-util": "^5.16.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "node_modules/rc-switch": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/rc-switch/-/rc-switch-4.1.0.tgz", + "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0", + "classnames": "^2.2.1", + "rc-util": "^5.30.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } }, - "progress-webpack-plugin": { - "version": "1.0.16", - "resolved": "https://registry.npmmirror.com/progress-webpack-plugin/-/progress-webpack-plugin-1.0.16.tgz", - "integrity": "sha512-sdiHuuKOzELcBANHfrupYo+r99iPRyOnw15qX+rNlVUqXGfjXdH4IgxriKwG1kNJwVswKQHMdj1hYZMcb9jFaA==", - "dev": true, - "requires": { - "chalk": "^2.1.0", - "figures": "^2.0.0", - "log-update": "^2.3.0" + "node_modules/rc-table": { + "version": "7.54.0", + "resolved": "https://registry.npmmirror.com/rc-table/-/rc-table-7.54.0.tgz", + "integrity": "sha512-/wDTkki6wBTjwylwAGjpLKYklKo9YgjZwAU77+7ME5mBoS32Q4nAwoqhA2lSge6fobLW3Tap6uc5xfwaL2p0Sw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/context": "^1.4.0", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.1.0", + "rc-util": "^5.44.3", + "rc-virtual-list": "^3.14.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, + "node_modules/rc-tabs": { + "version": "15.7.0", + "resolved": "https://registry.npmmirror.com/rc-tabs/-/rc-tabs-15.7.0.tgz", + "integrity": "sha512-ZepiE+6fmozYdWf/9gVp7k56PKHB1YYoDsKeQA1CBlJ/POIhjkcYiv0AGP0w2Jhzftd3AVvZP/K+V+Lpi2ankA==", + "license": "MIT", "dependencies": { - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - } + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.2.0", + "rc-menu": "~9.16.0", + "rc-motion": "^2.6.2", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.34.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true, - "optional": true + "node_modules/rc-textarea": { + "version": "1.10.2", + "resolved": "https://registry.npmmirror.com/rc-textarea/-/rc-textarea-1.10.2.tgz", + "integrity": "sha512-HfaeXiaSlpiSp0I/pvWpecFEHpVysZ9tpDLNkxQbMvMz6gsr7aVZ7FpWP9kt4t7DB+jJXesYS0us1uPZnlRnwQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-input": "~1.8.0", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true + "node_modules/rc-tooltip": { + "version": "6.4.0", + "resolved": "https://registry.npmmirror.com/rc-tooltip/-/rc-tooltip-6.4.0.tgz", + "integrity": "sha512-kqyivim5cp8I5RkHmpsp1Nn/Wk+1oeloMv9c7LXNgDxUpGm+RbXJGL+OPvDlcRnx9DBeOe4wyOIl4OKUERyH1g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.1", + "rc-util": "^5.44.3" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "node_modules/rc-tree": { + "version": "5.13.1", + "resolved": "https://registry.npmmirror.com/rc-tree/-/rc-tree-5.13.1.tgz", + "integrity": "sha512-FNhIefhftobCdUJshO7M8uZTA9F4OPGVXqGfZkkD/5soDeOhwO06T/aKTrg0WD8gRg/pyfq+ql3aMymLHCTC4A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.1" + }, + "engines": { + "node": ">=10.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" } }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "node_modules/rc-tree-select": { + "version": "5.27.0", + "resolved": "https://registry.npmmirror.com/rc-tree-select/-/rc-tree-select-5.27.0.tgz", + "integrity": "sha512-2qTBTzwIT7LRI1o7zLyrCzmo5tQanmyGbSaGTIf7sYimCklAToVVfpMC6OAldSKolcnjorBYPNSKQqJmN3TCww==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "classnames": "2.x", + "rc-select": "~14.16.2", + "rc-tree": "~5.13.0", + "rc-util": "^5.43.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } }, - "px2rem": { - "version": "0.5.0", - "resolved": "https://registry.npmmirror.com/px2rem/-/px2rem-0.5.0.tgz", - "integrity": "sha512-R+LQj3Evbjbpmglo7D0PBVsnAbKP4WSvZEZUnF8RGIpWkIHFeAT+BlDOxxBxKVyMDecmfv9qdzNLTZLMq32osA==", - "requires": { - "chalk": "~0.5.1", - "commander": "~2.6.0", - "css": "~2.2.0", - "extend": "~3.0.0", - "fs-extra": "~0.16.3" - }, - "dependencies": { - "ansi-regex": { - "version": "0.2.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-0.2.1.tgz", - "integrity": "sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==" - }, - "ansi-styles": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-1.1.0.tgz", - "integrity": "sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA==" - }, - "chalk": { - "version": "0.5.1", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-0.5.1.tgz", - "integrity": "sha512-bIKA54hP8iZhyDT81TOsJiQvR1gW+ZYSXFaZUAvoD4wCHdbHY2actmpTE4x344ZlFqHbvoxKOaESULTZN2gstg==", - "requires": { - "ansi-styles": "^1.1.0", - "escape-string-regexp": "^1.0.0", - "has-ansi": "^0.1.0", - "strip-ansi": "^0.3.0", - "supports-color": "^0.2.0" - } - }, - "commander": { - "version": "2.6.0", - "resolved": "https://registry.npmmirror.com/commander/-/commander-2.6.0.tgz", - "integrity": "sha512-PhbTMT+ilDXZKqH8xbvuUY2ZEQNef0Q7DKxgoEKb4ccytsdvVVJmYqR0sGbi96nxU6oGrwEIQnclpK2NBZuQlg==" - }, - "fs-extra": { - "version": "0.16.5", - "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-0.16.5.tgz", - "integrity": "sha512-yb7ti8kVH+qboUQWYxUuOPj/qcMUA6lO68ErZoPQOTP+7qroCIN/1gZ1lLk/rs2p0gPFzrvPYujKGnHTu+HHxA==", - "requires": { - "graceful-fs": "^3.0.5", - "jsonfile": "^2.0.0", - "rimraf": "^2.2.8" - } - }, - "graceful-fs": { - "version": "3.0.12", - "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-3.0.12.tgz", - "integrity": "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==", - "requires": { - "natives": "^1.1.3" - } - }, - "has-ansi": { - "version": "0.1.0", - "resolved": "https://registry.npmmirror.com/has-ansi/-/has-ansi-0.1.0.tgz", - "integrity": "sha512-1YsTg1fk2/6JToQhtZkArMkurq8UoWU1Qe0aR3VUHjgij4nOylSWLWAtBXoZ4/dXOmugfLGm1c+QhuD0JyedFA==", - "requires": { - "ansi-regex": "^0.2.0" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "requires": { - "graceful-fs": "^4.1.6" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "optional": true - } - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "strip-ansi": { - "version": "0.3.0", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-0.3.0.tgz", - "integrity": "sha512-DerhZL7j6i6/nEnVG0qViKXI0OKouvvpsAiaj7c+LfqZZZxdwZtv8+UiA/w4VUJpT8UzX0pR1dcHOii1GbmruQ==", - "requires": { - "ansi-regex": "^0.2.1" - } - }, - "supports-color": { - "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-0.2.0.tgz", - "integrity": "sha512-tdCZ28MnM7k7cJDJc7Eq80A9CsRFAAOZUy41npOZCs++qSjfIy7o5Rh46CBk+Dk5FbKJ33X3Tqg4YrV07N5RaA==" - } + "node_modules/rc-upload": { + "version": "4.11.0", + "resolved": "https://registry.npmmirror.com/rc-upload/-/rc-upload-4.11.0.tgz", + "integrity": "sha512-ZUyT//2JAehfHzjWowqROcwYJKnZkIUGWaTE/VogVrepSl7AFNbQf4+zGfX4zl9Vrj/Jm8scLO0R6UlPDKK4wA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.5", + "rc-util": "^5.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "px2rem-loader": { - "version": "0.1.9", - "resolved": "https://registry.npmmirror.com/px2rem-loader/-/px2rem-loader-0.1.9.tgz", - "integrity": "sha512-3Ew8At5W/HHIIUe/KZk+FBRRb20KtgP1N1c/BnMlXk6LNkqrFmUIUF35GF/evzNdj/Q63iWJpkmn/c5qSMplRg==", - "requires": { - "loader-utils": "^1.1.0", - "px2rem": "^0.5.0" + "node_modules/rc-util": { + "version": "5.44.4", + "resolved": "https://registry.npmmirror.com/rc-util/-/rc-util-5.44.4.tgz", + "integrity": "sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^18.2.0" }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/rc-virtual-list": { + "version": "3.19.2", + "resolved": "https://registry.npmmirror.com/rc-virtual-list/-/rc-virtual-list-3.19.2.tgz", + "integrity": "sha512-Ys6NcjwGkuwkeaWBDqfI3xWuZ7rDiQXlH1o2zLfFzATfEgXcqpk8CkgMfbJD81McqjcJVez25a3kPxCR807evA==", + "license": "MIT", "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmmirror.com/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmmirror.com/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" } }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, + "node_modules/react-i18next": { + "version": "16.5.4", + "resolved": "https://registry.npmmirror.com/react-i18next/-/react-i18next-16.5.4.tgz", + "integrity": "sha512-6yj+dcfMncEC21QPhOTsW8mOSO+pzFmT6uvU7XXdvM/Cp38zJkmTeMeKmTrmCMD5ToT79FmiE/mRWiYWcJYW4g==", + "license": "MIT", "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true + "@babel/runtime": "^7.28.4", + "html-parse-stringify": "^3.0.1", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "i18next": ">= 25.6.2", + "react": ">= 16.8.0", + "typescript": "^5" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "typescript": { + "optional": true } } }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "node_modules/react-icons": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/react-icons/-/react-icons-5.5.0.tgz", + "integrity": "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==", + "license": "MIT", + "peerDependencies": { + "react": "*" } }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmmirror.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmmirror.com/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, + "license": "MIT" + }, + "node_modules/react-pdf": { + "version": "10.4.1", + "resolved": "https://registry.npmmirror.com/react-pdf/-/react-pdf-10.4.1.tgz", + "integrity": "sha512-kS/35staVCBqS29verTQJQZXw7RfsRCPO3fdJoW1KXylcv7A9dw6DZ3vJXC2w+bIBgLw5FN4pOFvKSQtkQhPfA==", + "license": "MIT", "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true + "clsx": "^2.0.0", + "dequal": "^2.0.3", + "make-cancellable-promise": "^2.0.0", + "make-event-props": "^2.0.0", + "merge-refs": "^2.0.0", + "pdfjs-dist": "5.4.296", + "tiny-invariant": "^1.0.0", + "warning": "^4.0.0" + }, + "funding": { + "url": "https://github.com/wojtekmaj/react-pdf?sponsor=1" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true } } }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "node_modules/react-pdf/node_modules/pdfjs-dist": { + "version": "5.4.296", + "resolved": "https://registry.npmmirror.com/pdfjs-dist/-/pdfjs-dist-5.4.296.tgz", + "integrity": "sha512-DlOzet0HO7OEnmUmB6wWGJrrdvbyJKftI1bhMitK7O2N8W2gc757yyYBbINy9IDafXAV9wmKr9t7xsTaNKRG5Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=20.16.0 || >=22.3.0" + }, + "optionalDependencies": { + "@napi-rs/canvas": "^0.1.80" } }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", "dev": true, - "requires": { - "picomatch": "^2.2.1" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" + "node_modules/react-router": { + "version": "6.30.3", + "resolved": "https://registry.npmmirror.com/react-router/-/react-router-6.30.3.tgz", + "integrity": "sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" } }, - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true + "node_modules/react-router-dom": { + "version": "6.30.3", + "resolved": "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-6.30.3.tgz", + "integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.2", + "react-router": "6.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } }, - "regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmmirror.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" } }, - "regexpu-core": { - "version": "5.2.2", - "resolved": "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-5.2.2.tgz", - "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, - "requires": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsgen": "^0.7.1", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "regjsgen": { - "version": "0.7.1", - "resolved": "https://registry.npmmirror.com/regjsgen/-/regjsgen-0.7.1.tgz", - "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", - "dev": true - }, - "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmmirror.com/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true - }, - "renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, - "requires": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "require-from-string": { + "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "requires-port": { + "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true + "license": "MIT" }, - "resize-observer-polyfill": { + "node_modules/resize-observer-polyfill": { "version": "1.5.1", "resolved": "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dev": true, - "requires": { - "is-core-module": "^2.9.0", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "resolve-from": { + "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmmirror.com/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==" - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "engines": { + "node": ">=4" } }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmmirror.com/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } }, - "reusify": { + "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } }, - "rimraf": { + "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, - "requires": { + "dependencies": { "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.57.1", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.57.1.tgz", + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + "devOptional": 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.57.1", + "@rollup/rollup-android-arm64": "4.57.1", + "@rollup/rollup-darwin-arm64": "4.57.1", + "@rollup/rollup-darwin-x64": "4.57.1", + "@rollup/rollup-freebsd-arm64": "4.57.1", + "@rollup/rollup-freebsd-x64": "4.57.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", + "@rollup/rollup-linux-arm64-gnu": "4.57.1", + "@rollup/rollup-linux-arm64-musl": "4.57.1", + "@rollup/rollup-linux-loong64-gnu": "4.57.1", + "@rollup/rollup-linux-loong64-musl": "4.57.1", + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", + "@rollup/rollup-linux-ppc64-musl": "4.57.1", + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", + "@rollup/rollup-linux-riscv64-musl": "4.57.1", + "@rollup/rollup-linux-s390x-gnu": "4.57.1", + "@rollup/rollup-linux-x64-gnu": "4.57.1", + "@rollup/rollup-linux-x64-musl": "4.57.1", + "@rollup/rollup-openbsd-x64": "4.57.1", + "@rollup/rollup-openharmony-arm64": "4.57.1", + "@rollup/rollup-win32-arm64-msvc": "4.57.1", + "@rollup/rollup-win32-ia32-msvc": "4.57.1", + "@rollup/rollup-win32-x64-gnu": "4.57.1", + "@rollup/rollup-win32-x64-msvc": "4.57.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-inject": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", + "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.", + "dev": true, + "license": "MIT", + "dependencies": { + "estree-walker": "^0.6.1", + "magic-string": "^0.25.3", + "rollup-pluginutils": "^2.8.1" + } + }, + "node_modules/rollup-plugin-node-polyfills": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", + "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", + "dev": true, + "license": "MIT", + "dependencies": { + "rollup-plugin-inject": "^3.0.0" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmmirror.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "estree-walker": "^0.6.1" } }, - "run-parallel": { + "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { "queue-microtask": "^1.2.2" } }, - "safe-buffer": { + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "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" }, - "safer-buffer": { + "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, - "optional": true + "optional": true, + "peer": true }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "node_modules/sass": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass/-/sass-1.97.3.tgz", + "integrity": "sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg==", "dev": true, - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "license": "MIT", + "optional": true, + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "node_modules/sass-embedded": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded/-/sass-embedded-1.97.3.tgz", + "integrity": "sha512-eKzFy13Nk+IRHhlAwP3sfuv+PzOrvzUkwJK2hdoCKYcWGSdmwFpeGpWmyewdw8EgBnsKaSBtgf/0b2K635ecSA==", "dev": true, - "requires": { - "node-forge": "^1" + "license": "MIT", + "dependencies": { + "@bufbuild/protobuf": "^2.5.0", + "colorjs.io": "^0.5.0", + "immutable": "^5.0.2", + "rxjs": "^7.4.0", + "supports-color": "^8.1.1", + "sync-child-process": "^1.0.2", + "varint": "^6.0.0" + }, + "bin": { + "sass": "dist/bin/sass.js" + }, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "sass-embedded-all-unknown": "1.97.3", + "sass-embedded-android-arm": "1.97.3", + "sass-embedded-android-arm64": "1.97.3", + "sass-embedded-android-riscv64": "1.97.3", + "sass-embedded-android-x64": "1.97.3", + "sass-embedded-darwin-arm64": "1.97.3", + "sass-embedded-darwin-x64": "1.97.3", + "sass-embedded-linux-arm": "1.97.3", + "sass-embedded-linux-arm64": "1.97.3", + "sass-embedded-linux-musl-arm": "1.97.3", + "sass-embedded-linux-musl-arm64": "1.97.3", + "sass-embedded-linux-musl-riscv64": "1.97.3", + "sass-embedded-linux-musl-x64": "1.97.3", + "sass-embedded-linux-riscv64": "1.97.3", + "sass-embedded-linux-x64": "1.97.3", + "sass-embedded-unknown-all": "1.97.3", + "sass-embedded-win32-arm64": "1.97.3", + "sass-embedded-win32-x64": "1.97.3" + } + }, + "node_modules/sass-embedded-all-unknown": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.97.3.tgz", + "integrity": "sha512-t6N46NlPuXiY3rlmG6/+1nwebOBOaLFOOVqNQOC2cJhghOD4hh2kHNQQTorCsbY9S1Kir2la1/XLBwOJfui0xg==", + "cpu": [ + "!arm", + "!arm64", + "!riscv64", + "!x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "sass": "1.97.3" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "node_modules/sass-embedded-android-arm": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-android-arm/-/sass-embedded-android-arm-1.97.3.tgz", + "integrity": "sha512-cRTtf/KV/q0nzGZoUzVkeIVVFv3L/tS1w4WnlHapphsjTXF/duTxI8JOU1c/9GhRPiMdfeXH7vYNcMmtjwX7jg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-arm64": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.97.3.tgz", + "integrity": "sha512-aiZ6iqiHsUsaDx0EFbbmmA0QgxicSxVVN3lnJJ0f1RStY0DthUkquGT5RJ4TPdaZ6ebeJWkboV4bra+CP766eA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-riscv64": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.97.3.tgz", + "integrity": "sha512-zVEDgl9JJodofGHobaM/q6pNETG69uuBIGQHRo789jloESxxZe82lI3AWJQuPmYCOG5ElfRthqgv89h3gTeLYA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-x64": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-android-x64/-/sass-embedded-android-x64-1.97.3.tgz", + "integrity": "sha512-3ke0le7ZKepyXn/dKKspYkpBC0zUk/BMciyP5ajQUDy4qJwobd8zXdAq6kOkdiMB+d9UFJOmEkvgFJHl3lqwcw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-arm64": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.97.3.tgz", + "integrity": "sha512-fuqMTqO4gbOmA/kC5b9y9xxNYw6zDEyfOtMgabS7Mz93wimSk2M1quQaTJnL98Mkcsl2j+7shNHxIS/qpcIDDA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-x64": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.97.3.tgz", + "integrity": "sha512-b/2RBs/2bZpP8lMkyZ0Px0vkVkT8uBd0YXpOwK7iOwYkAT8SsO4+WdVwErsqC65vI5e1e5p1bb20tuwsoQBMVA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.97.3.tgz", + "integrity": "sha512-2lPQ7HQQg4CKsH18FTsj2hbw5GJa6sBQgDsls+cV7buXlHjqF8iTKhAQViT6nrpLK/e8nFCoaRgSqEC8xMnXuA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm64": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.97.3.tgz", + "integrity": "sha512-IP1+2otCT3DuV46ooxPaOKV1oL5rLjteRzf8ldZtfIEcwhSgSsHgA71CbjYgLEwMY9h4jeal8Jfv3QnedPvSjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.97.3.tgz", + "integrity": "sha512-cBTMU68X2opBpoYsSZnI321gnoaiMBEtc+60CKCclN6PCL3W3uXm8g4TLoil1hDD6mqU9YYNlVG6sJ+ZNef6Lg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm64": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.97.3.tgz", + "integrity": "sha512-Lij0SdZCsr+mNRSyDZ7XtJpXEITrYsaGbOTz5e6uFLJ9bmzUbV7M8BXz2/cA7bhfpRPT7/lwRKPdV4+aR9Ozcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-riscv64": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.97.3.tgz", + "integrity": "sha512-sBeLFIzMGshR4WmHAD4oIM7WJVkSoCIEwutzptFtGlSlwfNiijULp+J5hA2KteGvI6Gji35apR5aWj66wEn/iA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-x64": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.97.3.tgz", + "integrity": "sha512-/oWJ+OVrDg7ADDQxRLC/4g1+Nsz1g4mkYS2t6XmyMJKFTFK50FVI2t5sOdFH+zmMp+nXHKM036W94y9m4jjEcw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-riscv64": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.97.3.tgz", + "integrity": "sha512-l3IfySApLVYdNx0Kjm7Zehte1CDPZVcldma3dZt+TfzvlAEerM6YDgsk5XEj3L8eHBCgHgF4A0MJspHEo2WNfA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-x64": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.97.3.tgz", + "integrity": "sha512-Kwqwc/jSSlcpRjULAOVbndqEy2GBzo6OBmmuBVINWUaJLJ8Kczz3vIsDUWLfWz/kTEw9FHBSiL0WCtYLVAXSLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmmirror.com/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, + "node_modules/sass-embedded-unknown-all": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.97.3.tgz", + "integrity": "sha512-/GHajyYJmvb0IABUQHbVHf1nuHPtIDo/ClMZ81IDr59wT5CNcMe7/dMNujXwWugtQVGI5UGmqXWZQCeoGnct8Q==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "!android", + "!darwin", + "!linux", + "!win32" + ], "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } + "sass": "1.97.3" } }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "node_modules/sass-embedded-win32-arm64": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.97.3.tgz", + "integrity": "sha512-RDGtRS1GVvQfMGAmVXNxYiUOvPzn9oO1zYB/XUM9fudDRnieYTcUytpNTQZLs6Y1KfJxgt5Y+giRceC92fT8Uw==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "randombytes": "^2.1.0" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-x64": { + "version": "1.97.3", + "resolved": "https://registry.npmmirror.com/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.97.3.tgz", + "integrity": "sha512-SFRa2lED9UEwV6vIGeBXeBOLKF+rowF3WmNfb/BzhxmdAsKofCXrJ8ePW7OcDVrvNEbTOGwhsReIsF5sH8fVaw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" } }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmmirror.com/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, + "optional": true, + "peer": true + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true - } + "loose-envify": "^1.1.0" } }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "node_modules/scroll-into-view-if-needed": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", + "license": "MIT", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmmirror.com/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", "dev": true, - "requires": { - "kind-of": "^6.0.2" + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" + "node_modules/signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "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" }, - "shell-quote": { - "version": "1.7.4", - "resolved": "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.7.4.tgz", - "integrity": "sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==", - "dev": true + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "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": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "node_modules/simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "license": "MIT", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" } }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "node_modules/simplex-noise": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/simplex-noise/-/simplex-noise-4.0.3.tgz", + "integrity": "sha512-qSE2I4AngLQG7BXqoZj51jokT4WUXe8mOBrvfOXpci8+6Yu44+/dD5zqDpOx3Ux792eamTd2lLcI8jqFntk/lg==", + "license": "MIT" }, - "sirv": { - "version": "1.0.19", - "resolved": "https://registry.npmmirror.com/sirv/-/sirv-1.0.19.tgz", - "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", - "dev": true, - "requires": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", - "totalist": "^1.0.0" - } + "node_modules/size-sensor": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/size-sensor/-/size-sensor-1.0.3.tgz", + "integrity": "sha512-+k9mJ2/rQMiRmQUcjn+qznch260leIXY8r4FyYKKyRBO/s5UoeMAHGkCJyE1R/4wrIhTJONfyloY55SkE7ve3A==", + "license": "ISC" }, - "slash": { + "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmmirror.com/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" + "engines": { + "node": ">=8" + } + }, + "node_modules/smol-toml": { + "version": "1.5.2", + "resolved": "https://registry.npmmirror.com/smol-toml/-/smol-toml-1.5.2.tgz", + "integrity": "sha512-QlaZEqcAH3/RtNyet1IPIYPsEWAaYyXXv1Krsi+1L/QHppjX4Ifm8MQsBISz9vE8cHicIq3clogsheili5vhaQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" } }, - "source-map": { + "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmmirror.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/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" } }, - "source-map-support": { + "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, - "requires": { + "optional": true, + "peer": true, + "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmmirror.com/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true, + "license": "MIT" }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "node_modules/stacktracey": { + "version": "2.1.8", + "resolved": "https://registry.npmmirror.com/stacktracey/-/stacktracey-2.1.8.tgz", + "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "license": "Unlicense", + "dependencies": { + "as-table": "^1.0.36", + "get-source": "^2.0.12" } }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true + "node_modules/state-local": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/state-local/-/state-local-1.0.7.tgz", + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==", + "license": "MIT" }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "node_modules/stoppable": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/stoppable/-/stoppable-1.1.0.tgz", + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "license": "MIT", + "engines": { + "node": ">=4", + "npm": ">=6" } }, - "spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmmirror.com/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==", + "license": "MIT" + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "ssr-window": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-1.0.1.tgz", - "integrity": "sha512-dgFqB+f00LJTEgb6UXhx0h+SrG50LJvti2yMKMqAgzfUmUXZrLSv2fjULF7AWGwK25EXu8+smLR3jYsJQChPsg==" + "node_modules/styled-components": { + "version": "6.3.8", + "resolved": "https://registry.npmmirror.com/styled-components/-/styled-components-6.3.8.tgz", + "integrity": "sha512-Kq/W41AKQloOqKM39zfaMdJ4BcYDw/N5CIq4/GTI0YjU6pKcZ1KKhk6b4du0a+6RA9pIfOP/eu94Ge7cu+PDCA==", + "license": "MIT", + "dependencies": { + "@emotion/is-prop-valid": "1.4.0", + "@emotion/unitless": "0.10.0", + "@types/stylis": "4.2.7", + "css-to-react-native": "3.2.0", + "csstype": "3.2.3", + "postcss": "8.4.49", + "shallowequal": "1.1.0", + "stylis": "4.3.6", + "tslib": "2.8.1" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } }, - "ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmmirror.com/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dev": true, - "requires": { - "minipass": "^3.1.1" + "node_modules/styled-components/node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmmirror.com/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/styled-components/node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "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.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" } }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmmirror.com/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT" }, - "stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmmirror.com/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "dev": true + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmmirror.com/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, - "requires": { - "safe-buffer": "~5.2.0" + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/sync-child-process": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/sync-child-process/-/sync-child-process-1.0.2.tgz", + "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", "dev": true, - "requires": { - "ansi-regex": "^5.0.1" + "license": "MIT", + "dependencies": { + "sync-message-port": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" } }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "dev": true + "node_modules/sync-message-port": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/sync-message-port/-/sync-message-port-1.2.0.tgz", + "integrity": "sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } }, - "stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "node_modules/tailwindcss/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "requires": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/tailwindcss/node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "requires": { - "has-flag": "^3.0.0" + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true + "node_modules/tailwindcss/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } }, - "svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", - "dev": true + "node_modules/tar": { + "version": "7.5.11", + "resolved": "https://registry.npmmirror.com/tar/-/tar-7.5.11.tgz", + "integrity": "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } }, - "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmmirror.com/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - } + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" } }, - "swiper": { - "version": "4.5.1", - "resolved": "https://registry.npmmirror.com/swiper/-/swiper-4.5.1.tgz", - "integrity": "sha512-se6I7PWWu950NAMXXT+ENtF/6SVb8mPyO+bTfNxbQBILSeLqsYp3Ndap+YOA0EczOIUlea274PKejT6gKZDseA==", - "requires": { - "dom7": "^2.1.3", - "ssr-window": "^1.0.1" + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" } }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true + "node_modules/tar/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } }, - "terser": { + "node_modules/terser": { "version": "5.16.1", "resolved": "https://registry.npmmirror.com/terser/-/terser-5.16.1.tgz", "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", "dev": true, - "requires": { + "optional": true, + "peer": true, + "dependencies": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" } }, - "terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.14", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" - }, - "dependencies": { - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" }, - "thenify": { + "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmmirror.com/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "any-promise": "^1.0.0" } }, - "thenify-all": { + "node_modules/thenify-all": { "version": "1.6.0", "resolved": "https://registry.npmmirror.com/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" } }, - "thread-loader": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/thread-loader/-/thread-loader-3.0.4.tgz", - "integrity": "sha512-ByaL2TPb+m6yArpqQUZvP+5S1mZtXsEP7nWKKlAUTm7fCml8kB5s1uI3+eHRP2bk5mVYfRSBI7FFf+tWEyLZwA==", - "dev": true, - "requires": { - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.1.0", - "loader-utils": "^2.0.0", - "neo-async": "^2.6.2", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "throttle-debounce": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-1.1.0.tgz", - "integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg==" - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true - }, - "totalist": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/totalist/-/totalist-1.1.0.tgz", - "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", - "dev": true - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true + "node_modules/three": { + "version": "0.182.0", + "resolved": "https://registry.npmmirror.com/three/-/three-0.182.0.tgz", + "integrity": "sha512-GbHabT+Irv+ihI1/f5kIIsZ+Ef9Sl5A1Y7imvS5RQjWgtTPfPnZ43JmlYI7NtCRDK9zir20lQpfg8/9Yd02OvQ==", + "license": "MIT" }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "node_modules/three-stdlib": { + "version": "2.36.1", + "resolved": "https://registry.npmmirror.com/three-stdlib/-/three-stdlib-2.36.1.tgz", + "integrity": "sha512-XyGQrFmNQ5O/IoKm556ftwKsBg11TIb301MB5dWNicziQBEs2g3gtOYIf7pFiLa0zI2gUwhtCjv9fmjnxKZ1Cg==", + "license": "MIT", + "dependencies": { + "@types/draco3d": "^1.4.0", + "@types/offscreencanvas": "^2019.6.4", + "@types/webxr": "^0.5.2", + "draco3d": "^1.4.1", + "fflate": "^0.6.9", + "potpack": "^1.0.1" + }, + "peerDependencies": { + "three": ">=0.128.0" } }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true + "node_modules/three-stdlib/node_modules/fflate": { + "version": "0.6.10", + "resolved": "https://registry.npmmirror.com/fflate/-/fflate-0.6.10.tgz", + "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==", + "license": "MIT" }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" + "node_modules/time-span": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/time-span/-/time-span-4.0.0.tgz", + "integrity": "sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==", + "license": "MIT", + "dependencies": { + "convert-hrtime": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" }, - "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, - "requires": { - "punycode": "^2.1.0" + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmmirror.com/urix/-/urix-0.1.0.tgz", - "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", + "license": "MIT" }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "node_modules/ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true - }, - "vue": { - "version": "2.7.14", - "resolved": "https://registry.npmmirror.com/vue/-/vue-2.7.14.tgz", - "integrity": "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==", - "requires": { - "@vue/compiler-sfc": "2.7.14", - "csstype": "^3.1.0" + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" } }, - "vue-hot-reload-api": { - "version": "2.3.4", - "resolved": "https://registry.npmmirror.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", - "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", - "dev": true + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmmirror.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" }, - "vue-loader": { - "version": "17.0.1", - "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-17.0.1.tgz", - "integrity": "sha512-/OOyugJnImKCkAKrAvdsWMuwoCqGxWT5USLsjohzWbMgOwpA5wQmzQiLMzZd7DjhIfunzAGIApTOgIylz/kwcg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "hash-sum": "^2.0.0", - "loader-utils": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "node_modules/ts-morph": { + "version": "12.0.0", + "resolved": "https://registry.npmmirror.com/ts-morph/-/ts-morph-12.0.0.tgz", + "integrity": "sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA==", + "license": "MIT", + "dependencies": { + "@ts-morph/common": "~0.11.0", + "code-block-writer": "^10.1.1" } }, - "vue-router": { - "version": "3.6.5", - "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-3.6.5.tgz", - "integrity": "sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ==" + "node_modules/ts-toolbelt": { + "version": "6.15.5", + "resolved": "https://registry.npmmirror.com/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz", + "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==", + "license": "Apache-2.0" }, - "vue-style-loader": { - "version": "4.1.3", - "resolved": "https://registry.npmmirror.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz", - "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", - "dev": true, - "requires": { - "hash-sum": "^1.0.2", - "loader-utils": "^1.0.2" + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmmirror.com/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", "dependencies": { - "hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", - "dev": true - }, - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" } }, - "vue-template-compiler": { - "version": "2.7.14", - "resolved": "https://registry.npmmirror.com/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", - "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "requires": { - "de-indent": "^1.0.2", - "he": "^1.2.0" + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" } }, - "vue-template-es2015-compiler": { - "version": "1.9.1", - "resolved": "https://registry.npmmirror.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", - "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", - "dev": true + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "dev": true, + "license": "MIT" }, - "vuex": { - "version": "3.6.2", - "resolved": "https://registry.npmmirror.com/vuex/-/vuex-3.6.2.tgz", - "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==" + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "license": "MIT" }, - "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "node_modules/undici": { + "version": "5.29.0", + "resolved": "https://registry.npmmirror.com/undici/-/undici-5.29.0.tgz", + "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", "dev": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" } }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmmirror.com/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "node_modules/unenv": { + "version": "2.0.0-rc.14", + "resolved": "https://registry.npmmirror.com/unenv/-/unenv-2.0.0-rc.14.tgz", + "integrity": "sha512-od496pShMen7nOy5VmVJCnq8rptd45vh6Nx/r2iPbrba6pa6p+tS2ywuIHRZ/OBvSbQZB0kWvpO9XBNVFXHD3Q==", "dev": true, - "requires": { - "defaults": "^1.0.3" + "license": "MIT", + "dependencies": { + "defu": "^6.1.4", + "exsolve": "^1.0.1", + "ohash": "^2.0.10", + "pathe": "^2.0.3", + "ufo": "^1.5.4" } }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "webpack": { - "version": "5.75.0", - "resolved": "https://registry.npmmirror.com/webpack/-/webpack-5.75.0.tgz", - "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "dependencies": { - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" } }, - "webpack-bundle-analyzer": { - "version": "4.7.0", - "resolved": "https://registry.npmmirror.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.7.0.tgz", - "integrity": "sha512-j9b8ynpJS4K+zfO5GGwsAcQX4ZHpWV+yRiHDiL+bE0XHJ8NiPYLTNVQdlFYWxtpg9lfAQNlwJg16J9AJtFSXRg==", - "dev": true, - "requires": { - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "chalk": "^4.1.0", - "commander": "^7.2.0", - "gzip-size": "^6.0.0", - "lodash": "^4.17.20", - "opener": "^1.5.2", - "sirv": "^1.0.7", - "ws": "^7.3.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } + { + "type": "github", + "url": "https://github.com/sponsors/ai" } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "webpack-chain": { - "version": "6.5.1", - "resolved": "https://registry.npmmirror.com/webpack-chain/-/webpack-chain-6.5.1.tgz", - "integrity": "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==", - "dev": true, - "requires": { - "deepmerge": "^1.5.2", - "javascript-stringify": "^2.0.1" - } - }, - "webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmmirror.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", - "dev": true, - "requires": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmmirror.com/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } + "less": { + "optional": true }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "lightningcss": { + "optional": true }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - } - } - }, - "webpack-dev-server": { - "version": "4.11.1", - "resolved": "https://registry.npmmirror.com/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", - "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", - "dev": true, - "requires": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } + "sass": { + "optional": true }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } + "sass-embedded": { + "optional": true }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "stylus": { + "optional": true }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } + "sugarss": { + "optional": true }, - "ws": { - "version": "8.11.0", - "resolved": "https://registry.npmmirror.com/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "dev": true + "terser": { + "optional": true } } }, - "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmmirror.com/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" + "node_modules/vite-plugin-oh-my-live2d": { + "version": "0.19.3", + "resolved": "https://registry.npmmirror.com/vite-plugin-oh-my-live2d/-/vite-plugin-oh-my-live2d-0.19.3.tgz", + "integrity": "sha512-pa3Ln5lXreI7ugLMZOI5h1XVtcHj6SSGgpiDAqXREj3TxubSxxK1UoltbsgWbCtpEkVld0cq1VT3LqBAX+uEUw==", + "license": "MIT", + "dependencies": { + "javascript-stringify": "^2.1.0", + "oh-my-live2d": "0.19.3" } }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true - }, - "webpack-virtual-modules": { - "version": "0.4.6", - "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz", - "integrity": "sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==", - "dev": true - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmmirror.com/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmmirror.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } }, - "whatwg-fetch": { - "version": "3.6.2", - "resolved": "https://registry.npmmirror.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", - "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==", - "dev": true + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" }, - "whatwg-url": { + "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmmirror.com/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, - "requires": { - "isexe": "^2.0.0" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true + "node_modules/workerd": { + "version": "1.20250718.0", + "resolved": "https://registry.npmmirror.com/workerd/-/workerd-1.20250718.0.tgz", + "integrity": "sha512-kqkIJP/eOfDlUyBzU7joBg+tl8aB25gEAGqDap+nFWb+WHhnooxjGHgxPBy3ipw2hnShPFNOQt5lFRxbwALirg==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "bin": { + "workerd": "bin/workerd" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "@cloudflare/workerd-darwin-64": "1.20250718.0", + "@cloudflare/workerd-darwin-arm64": "1.20250718.0", + "@cloudflare/workerd-linux-64": "1.20250718.0", + "@cloudflare/workerd-linux-arm64": "1.20250718.0", + "@cloudflare/workerd-windows-64": "1.20250718.0" + } }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/wrangler": { + "version": "3.114.17", + "resolved": "https://registry.npmmirror.com/wrangler/-/wrangler-3.114.17.tgz", + "integrity": "sha512-tAvf7ly+tB+zwwrmjsCyJ2pJnnc7SZhbnNwXbH+OIdVas3zTSmjcZOjmLKcGGptssAA3RyTKhcF9BvKZzMUycA==", + "dev": true, + "license": "MIT OR Apache-2.0", + "dependencies": { + "@cloudflare/kv-asset-handler": "0.3.4", + "@cloudflare/unenv-preset": "2.0.2", + "@esbuild-plugins/node-globals-polyfill": "0.2.3", + "@esbuild-plugins/node-modules-polyfill": "0.2.2", + "blake3-wasm": "2.1.5", + "esbuild": "0.17.19", + "miniflare": "3.20250718.3", + "path-to-regexp": "6.3.0", + "unenv": "2.0.0-rc.14", + "workerd": "1.20250718.0" + }, + "bin": { + "wrangler": "bin/wrangler.js", + "wrangler2": "bin/wrangler.js" + }, + "engines": { + "node": ">=16.17.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2", + "sharp": "^0.33.5" + }, + "peerDependencies": { + "@cloudflare/workers-types": "^4.20250408.0" + }, + "peerDependenciesMeta": { + "@cloudflare/workers-types": { + "optional": true } } }, - "wrappy": { + "node_modules/wrangler/node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, - "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmmirror.com/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmmirror.com/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 + } + } }, - "yallist": { + "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true + "node_modules/youch": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/youch/-/youch-3.3.4.tgz", + "integrity": "sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cookie": "^0.7.1", + "mustache": "^4.2.0", + "stacktracey": "^2.1.8" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmmirror.com/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "license": "MIT", + "optional": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zrender": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/zrender/-/zrender-6.0.0.tgz", + "integrity": "sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==", + "license": "BSD-3-Clause", + "dependencies": { + "tslib": "2.3.0" + } + }, + "node_modules/zrender/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "license": "0BSD" } } } diff --git a/package.json b/package.json index 34c529f..9b30f63 100644 --- a/package.json +++ b/package.json @@ -1,31 +1,92 @@ { - "name": "vip-video-parsing", - "version": "0.1.0", + "name": "chattyplay-agent", "private": true, + "author": { + "name": "P1Kaj1uu", + "email": "891523233@qq.com", + "url": "https://github.com/P1Kaj1uu" + }, + "version": "5.2.0", + "type": "module", "scripts": { - "serve": "vue-cli-service serve", - "build": "vue-cli-service build" + "dev": "vite", + "dev:server": "tsx watch src/services/server.ts", + "build": "tsc && vite build", + "start": "tsx src/services/server.ts", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview", + "worker:dev": "wrangler dev src/services/worker.ts", + "worker:deploy": "wrangler deploy", + "worker:tail": "wrangler tail" }, "dependencies": { - "core-js": "^3.8.3", - "element-ui": "^2.15.12", - "lib-flexible": "^0.3.2", + "@emailjs/browser": "^4.4.1", + "@hcaptcha/react-hcaptcha": "^2.0.2", + "@hono/node-server": "^1.19.9", + "@hono/node-ws": "^1.3.0", + "@monaco-editor/react": "^4.7.0", + "@react-oauth/google": "^0.13.4", + "@types/better-sqlite3": "^7.6.13", + "@types/three": "^0.182.0", + "@types/ws": "^8.18.1", + "@upstash/redis": "^1.37.0", + "@vercel/hono": "^0.2.51", + "antd": "^5.12.0", + "axios": "^1.6.0", + "better-sqlite3": "^12.6.2", + "crypto-js": "^4.2.0", + "echarts": "^6.0.0", + "echarts-for-react": "^3.0.6", + "fflate": "^0.8.2", + "fundebug-javascript": "^2.8.8", + "fundebug-revideo": "^0.8.0", + "gsap": "^3.14.2", + "highlight.js": "^11.9.0", + "hono": "^4.11.7", + "http-proxy-middleware": "^3.0.5", + "i18next": "^25.8.0", + "i18next-browser-languagedetector": "^8.2.0", + "katex": "^0.16.47", + "marked": "^11.1.0", + "mermaid": "^11.17.2", + "monaco-editor": "^0.55.1", "nprogress": "^0.2.0", - "postcss-px2rem": "^0.3.0", - "px2rem-loader": "^0.1.9", - "swiper": "^4.5.1", - "vue": "^2.6.14", - "vue-router": "^3.5.1", - "vuex": "^3.6.2" + "oh-my-live2d": "^0.19.3", + "openai": "^6.25.0", + "pdfjs-dist": "^5.6.205", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-i18next": "^16.5.4", + "react-icons": "^5.5.0", + "react-pdf": "^10.4.1", + "react-router-dom": "^6.22.0", + "simplex-noise": "^4.0.3", + "styled-components": "^6.1.0", + "three": "^0.182.0", + "three-stdlib": "^2.36.1", + "vite-plugin-oh-my-live2d": "^0.19.3", + "ws": "^8.19.0" }, "devDependencies": { - "@vue/cli-plugin-babel": "~5.0.0", - "@vue/cli-plugin-router": "~5.0.0", - "@vue/cli-plugin-vuex": "~5.0.0", - "@vue/cli-service": "~5.0.0", - "babel-plugin-component": "^1.1.1", - "less": "^4.0.0", - "less-loader": "^8.0.0", - "vue-template-compiler": "^2.6.14" + "@types/crypto-js": "^4.2.2", + "@types/node": "^25.2.1", + "@types/nprogress": "^0.2.3", + "@types/react": "^18.2.43", + "@types/react-dom": "^18.2.17", + "@types/styled-components": "^5.1.34", + "@typescript-eslint/eslint-plugin": "^6.14.0", + "@typescript-eslint/parser": "^6.14.0", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.24", + "eslint": "^8.55.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.5", + "postcss": "^8.5.6", + "sass-embedded": "^1.97.3", + "tailwindcss": "^3.4.19", + "tsx": "^4.21.0", + "typescript": "^5.2.2", + "vite": "^5.0.8", + "wrangler": "^3.78.0" } } diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..5009aef --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,44 @@ +# Apache 配置文件 - 用于生产环境部署 +# 支持单页应用(SPA)路由和 API 代理 + +# 启用代理模块 + + ProxyRequests Off + ProxyPreserveHost On + + # API 代理到宝塔服务器 Hono 服务 + ProxyPass /api http://123.60.91.107:3001/api + ProxyPassReverse /api http://123.60.91.107:3001/api + + +# URL 重写规则 + + RewriteEngine On + + # API 请求代理到宝塔服务器(使用 RewriteRule 作为备用方案) + RewriteRule ^api/(.*)$ http://123.60.91.107:3001/api/$1 [P,L] + + # SPA 路由支持 - 所有非文件、非API请求返回 index.html + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_URI} !^/api/ + RewriteRule ^(.*)$ /index.html [L,QSA] + + +# 缓存控制 + + # 静态资源缓存 + + Header set Cache-Control "max-age=31536000, public" + + + # HTML 文件不缓存 + + Header set Cache-Control "no-cache, no-store, must-revalidate" + + + +# Gzip 压缩 + + AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json + diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index 029eeb4..0000000 Binary files a/public/favicon.ico and /dev/null differ diff --git a/public/icon.ico b/public/icon.ico new file mode 100644 index 0000000..bc7e7b2 Binary files /dev/null and b/public/icon.ico differ diff --git a/public/index.html b/public/index.html index 396bd2e..c8bd359 100644 --- a/public/index.html +++ b/public/index.html @@ -7,6 +7,7 @@ + @@ -14,6 +15,14 @@ + + + + + + + + 不见水星记 diff --git a/public/model/heartBeat.obj b/public/model/heartBeat.obj new file mode 100644 index 0000000..91848cc --- /dev/null +++ b/public/model/heartBeat.obj @@ -0,0 +1,22894 @@ +# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware +# File Created: 05.12.2011 16:42:58 + +mtllib 12190_Heart_v1_L3.mtl + +# +# object Heart +# + +v -5.7868 -2.8897 6.9550 +v -5.8939 -2.7443 6.7745 +v -5.4647 -2.7112 6.3057 +v -5.3747 -2.8576 6.5017 +v -5.9984 -2.5943 6.6087 +v -5.5531 -2.5606 6.1250 +v -5.0930 -2.5268 5.6524 +v -5.0205 -2.6784 5.8491 +v -4.9477 -2.8262 6.0619 +v -6.1979 -2.2803 6.3182 +v -5.7241 -2.2463 5.8071 +v -5.6397 -2.4057 5.9591 +v -6.0999 -2.4397 6.4569 +v -5.2354 -2.2115 5.3046 +v -5.1648 -2.3711 5.4711 +v -4.2430 -2.1425 4.3498 +v -4.1989 -2.3035 4.5466 +v -4.6821 -2.3368 4.9984 +v -4.7391 -2.1766 4.8169 +v -4.1556 -2.4613 4.7603 +v -4.6249 -2.4935 5.1957 +v -4.0729 -2.7673 5.2391 +v -4.5117 -2.7960 5.6397 +v -4.5680 -2.6465 5.4094 +v -4.1136 -2.6159 4.9910 +v -6.2921 -2.1159 6.1919 +v -5.8058 -2.0824 5.6684 +v -6.3821 -1.9465 6.0770 +v -5.8845 -1.9139 5.5421 +v -5.3717 -1.8799 5.0140 +v -5.3044 -2.0478 5.1525 +v -6.5476 -1.5917 5.8786 +v -6.0310 -1.5624 5.3243 +v -5.9597 -1.7406 5.4277 +v -6.4674 -1.7718 5.9729 +v -5.4990 -1.5315 4.7755 +v -5.4367 -1.7078 4.8885 +v -4.4226 -1.4681 3.7236 +v -4.3778 -1.6412 3.8566 +v -4.9066 -1.6744 4.3625 +v -4.9601 -1.4998 4.2395 +v -4.3327 -1.8113 4.0050 +v -4.8517 -1.8454 4.4994 +v -4.7958 -2.0128 4.6507 +v -4.2877 -1.9784 4.1693 +v -2.4568 -1.3596 2.0047 +v -2.4405 -1.5278 2.1748 +v -2.8815 -1.5515 2.5299 +v -2.9037 -1.3824 2.3683 +v -2.4270 -1.6955 2.3656 +v -2.8618 -1.7196 2.7113 +v -3.3297 -1.7475 3.1043 +v -3.3569 -1.5788 2.9333 +v -3.3859 -1.4086 2.7807 +v -2.4090 -2.0284 2.8087 +v -2.8299 -2.0520 3.1328 +v -2.8445 -1.8865 2.9123 +v -2.4165 -1.8625 2.5770 +v -3.2809 -2.0794 3.5017 +v -3.3043 -1.9144 3.2937 +v -3.7879 -1.9453 3.7149 +v -3.7544 -2.1098 3.9094 +v -3.8227 -1.7784 3.5378 +v -3.8950 -1.4375 3.2349 +v -3.8584 -1.6090 3.3778 +v -2.4046 -2.1929 3.0604 +v -2.8180 -2.2157 3.3727 +v -2.4035 -2.3558 3.3317 +v -2.8091 -2.3775 3.6317 +v -3.2409 -2.4027 3.9731 +v -3.2597 -2.2422 3.7282 +v -2.4112 -2.6752 3.9323 +v -2.8005 -2.6941 4.2066 +v -2.8032 -2.5370 3.9097 +v -2.4056 -2.5167 3.6224 +v -3.2112 -2.7160 4.5185 +v -3.2247 -2.5607 4.2366 +v -3.6636 -2.5871 4.5985 +v -3.6374 -2.7405 4.8640 +v -3.6920 -2.4308 4.3510 +v -3.7224 -2.2717 4.1214 +v -8.5188 -3.0812 14.6532 +v -8.3736 -3.1414 14.8222 +v -8.4663 -3.0581 15.0557 +v -8.6327 -3.0066 14.7425 +v -8.1557 -3.2222 15.0437 +v -8.2430 -3.1298 15.3407 +v -8.3571 -3.0145 15.5908 +v -8.5961 -2.9480 15.2403 +v -8.7831 -2.8967 14.8571 +v -7.5863 -3.3994 15.5003 +v -7.6582 -3.2946 15.8731 +v -7.9713 -3.2103 15.6161 +v -7.8909 -3.3097 15.2749 +v -7.7467 -3.1692 16.2042 +v -8.0721 -3.0898 15.9129 +v -7.9530 -2.8620 16.7607 +v -8.3082 -2.7911 16.4011 +v -8.1867 -2.9496 16.1723 +v -7.8466 -3.0245 16.4985 +v -8.6228 -2.7239 16.0010 +v -8.4865 -2.8786 15.8087 +v -9.1079 -2.6131 15.0921 +v -8.9442 -2.7645 14.9756 +v -8.7407 -2.8155 15.4092 +v -8.8912 -2.6634 15.5636 +v -7.2490 -3.4866 15.7043 +v -7.3107 -3.3773 16.1030 +v -6.8848 -3.5694 15.8803 +v -6.9349 -3.4565 16.2998 +v -6.9968 -3.3235 16.6819 +v -7.3861 -3.2479 16.4624 +v -6.0984 -3.7143 16.1225 +v -6.1228 -3.5951 16.5697 +v -6.5370 -3.5298 16.4574 +v -6.4994 -3.6460 16.0219 +v -6.1561 -3.4564 16.9824 +v -6.5847 -3.3938 16.8571 +v -6.2408 -3.1234 17.7093 +v -6.7005 -3.0663 17.5558 +v -6.6401 -3.2390 17.2227 +v -6.1962 -3.2988 17.3619 +v -7.1431 -3.0021 17.3432 +v -7.0672 -3.1717 17.0289 +v -7.4714 -3.0994 16.7858 +v -7.5626 -2.9331 17.0764 +v -6.4231 -2.2604 18.8041 +v -6.9415 -2.2165 18.5966 +v -6.8865 -2.4509 18.3769 +v -6.3812 -2.4986 18.5721 +v -7.4412 -2.1670 18.3160 +v -7.3734 -2.3971 18.1112 +v -7.2992 -2.6136 17.8822 +v -6.8263 -2.6713 18.1313 +v -6.3355 -2.7224 18.3131 +v -8.3588 -2.0592 17.5630 +v -8.2669 -2.2800 17.3943 +v -7.8356 -2.3394 17.7816 +v -7.9158 -2.1139 17.9691 +v -8.1665 -2.4883 17.2061 +v -7.7479 -2.5519 17.5719 +v -7.6558 -2.7502 17.3376 +v -8.0607 -2.6828 16.9957 +v -7.2214 -2.8157 17.6269 +v -6.2880 -2.9310 18.0260 +v -6.7635 -2.8768 17.8581 +v -8.7637 -2.0051 17.1046 +v -8.6610 -2.2212 16.9558 +v -9.1241 -1.9534 16.6008 +v -9.0117 -2.1652 16.4724 +v -8.8886 -2.3653 16.3309 +v -8.5487 -2.4253 16.7905 +v -9.6853 -1.8659 15.4850 +v -9.5573 -2.0703 15.3967 +v -9.3125 -2.1141 15.9506 +v -9.4334 -1.9064 16.0587 +v -9.4168 -2.2642 15.3021 +v -9.1800 -2.3108 15.8329 +v -9.0386 -2.4946 15.7044 +v -9.2662 -2.4457 15.2008 +v -8.7579 -2.5522 16.1744 +v -8.4300 -2.6158 16.6064 +v -2.4203 -2.8312 4.2609 +v -2.8011 -2.8484 4.5222 +v -2.4332 -2.9841 4.6084 +v -2.8056 -2.9996 4.8565 +v -3.1942 -3.0174 5.1377 +v -3.2007 -2.8684 4.8188 +v -2.4720 -3.2791 5.3598 +v -2.8294 -3.2905 5.5818 +v -2.8148 -3.1471 5.2097 +v -2.4503 -3.1336 4.9747 +v -3.1970 -3.3031 5.8312 +v -3.1926 -3.1625 5.4752 +v -3.9430 -3.3316 6.4017 +v -3.9675 -3.1983 6.0869 +v -3.5785 -3.1795 5.7685 +v -3.5698 -3.3168 6.1055 +v -3.9983 -3.0593 5.7877 +v -3.5935 -3.0373 5.4491 +v -3.6136 -2.8908 5.1476 +v -4.0340 -2.9153 5.5049 +v -2.4986 -3.4203 5.7637 +v -2.8500 -3.4293 5.9728 +v -2.5305 -3.5567 6.1865 +v -2.8772 -3.5629 6.3828 +v -3.2281 -3.5688 6.5996 +v -3.2084 -3.4387 6.2059 +v -2.6116 -3.8135 7.0886 +v -2.9545 -3.8131 7.2601 +v -2.9119 -3.6910 6.8119 +v -2.5681 -3.6879 6.6281 +v -3.2971 -3.8107 7.4452 +v -3.2573 -3.6929 7.0126 +v -3.9599 -3.7975 7.8332 +v -3.9312 -3.6916 7.4451 +v -3.5989 -3.6933 7.2252 +v -3.6341 -3.8057 7.6380 +v -3.9212 -3.5785 7.0786 +v -3.5779 -3.5741 6.8329 +v -3.5689 -3.4484 6.4599 +v -3.9263 -3.4584 6.7316 +v -4.9681 -3.7413 8.4781 +v -5.0384 -3.6887 8.3553 +v -4.8073 -3.6805 8.1100 +v -4.7961 -3.7552 8.3644 +v -5.1329 -3.6110 8.1836 +v -4.8624 -3.5949 7.8789 +v -4.5680 -3.5866 7.5988 +v -4.5434 -3.6832 7.8898 +v -4.5514 -3.7713 8.2051 +v -5.3456 -3.4109 7.7821 +v -5.0170 -3.3863 7.4072 +v -4.9344 -3.4964 7.6440 +v -5.2367 -3.5177 7.9896 +v -4.6708 -3.3655 7.0524 +v -4.6128 -3.4807 7.3209 +v -4.2755 -3.4686 7.0177 +v -4.3114 -3.3476 6.7173 +v -4.2527 -3.5819 7.3330 +v -4.2691 -3.7857 8.0251 +v -4.2487 -3.6876 7.6674 +v -5.4561 -3.2930 7.5698 +v -5.1036 -3.2658 7.1706 +v -5.5670 -3.1658 7.3578 +v -5.1929 -3.1364 6.9382 +v -4.8033 -3.1089 6.5349 +v -4.7348 -3.2411 6.7894 +v -5.2837 -2.9998 6.7139 +v -5.6775 -3.0308 7.1512 +v -4.8747 -2.9701 6.2915 +v -4.4563 -2.9419 5.8873 +v -4.4033 -3.0831 6.1505 +v -4.3545 -3.2187 6.4277 +v -2.9783 -4.4564 11.3096 +v -2.9889 -4.4662 11.8794 +v -3.3738 -4.4357 11.9872 +v -3.3597 -4.4271 11.4173 +v -2.9872 -4.4566 12.4497 +v -3.3743 -4.4257 12.5597 +v -3.7637 -4.3903 12.6640 +v -3.7600 -4.4003 12.0909 +v -3.7418 -4.3925 11.5225 +v -2.9518 -4.3796 13.5730 +v -3.3415 -4.3501 13.6922 +v -3.3630 -4.3972 13.1298 +v -2.9744 -4.4277 13.0159 +v -3.7354 -4.3171 13.8024 +v -3.7548 -4.3626 13.2363 +v -4.5274 -4.2374 13.9791 +v -4.5394 -4.2785 13.4104 +v -4.1477 -4.3233 13.3312 +v -4.1315 -4.2798 13.8994 +v -4.5405 -4.3032 12.8378 +v -4.1531 -4.3497 12.7582 +v -4.4994 -4.3050 11.7056 +v -4.1224 -4.3520 11.6203 +v -4.1455 -4.3592 12.1859 +v -4.5281 -4.3118 12.2676 +v -2.9207 -4.3126 14.1163 +v -3.3112 -4.2845 14.2418 +v -2.8824 -4.2268 14.6410 +v -3.2739 -4.2006 14.7734 +v -3.6726 -4.1720 14.8938 +v -3.7074 -4.2536 14.3567 +v -2.7895 -3.9997 15.6150 +v -3.1844 -3.9778 15.7620 +v -3.2311 -4.0983 15.2819 +v -2.8383 -4.1225 15.1421 +v -3.5907 -3.9544 15.8946 +v -3.6331 -4.0724 15.4083 +v -4.4256 -3.8984 16.0976 +v -4.4537 -4.0103 15.6034 +v -4.0415 -4.0434 15.5169 +v -4.0055 -3.9284 16.0080 +v -4.4819 -4.1038 15.0817 +v -4.0761 -4.1401 14.9980 +v -4.1068 -4.2189 14.4569 +v -4.5073 -4.1793 14.5382 +v -6.0849 -3.8128 15.6395 +v -5.6852 -3.8743 15.6858 +v -5.6874 -3.7724 16.1757 +v -6.0780 -3.8922 15.1274 +v -5.6880 -3.9572 15.1678 +v -5.2903 -4.0134 15.1708 +v -5.2783 -3.9269 15.6923 +v -5.2696 -3.8217 16.1861 +v -6.0662 -3.9988 14.0432 +v -5.6926 -4.0705 14.0737 +v -5.6918 -4.0222 14.6282 +v -6.0732 -3.9538 14.5931 +v -5.3102 -4.1336 14.0704 +v -5.3021 -4.0820 14.6280 +v -4.9065 -4.1340 14.5967 +v -4.9211 -4.1889 14.0375 +v -4.8874 -4.0619 15.1407 +v -4.8480 -3.8632 16.1585 +v -4.8669 -3.9719 15.6634 +v -6.0525 -4.0287 13.4846 +v -5.6865 -4.1032 13.5108 +v -6.0277 -4.0447 12.9239 +v -5.6695 -4.1215 12.9461 +v -5.3008 -4.1897 12.9362 +v -5.3109 -4.1692 13.5043 +v -5.9272 -4.0407 11.8236 +v -5.5866 -4.1194 11.8375 +v -5.6375 -4.1265 12.3861 +v -5.9874 -4.0482 12.3680 +v -5.2336 -4.1893 11.8192 +v -5.2762 -4.1961 12.3723 +v -4.9057 -4.2577 12.3313 +v -4.8705 -4.2510 11.7735 +v -4.9238 -4.2501 12.8986 +v -4.9279 -4.2274 13.4695 +v -8.1561 -3.1072 10.9419 +v -8.3060 -3.1199 11.4884 +v -8.5367 -2.9716 11.3901 +v -8.3775 -2.9588 10.8369 +v -8.4206 -3.1277 12.0356 +v -8.6581 -2.9804 11.9445 +v -8.8817 -2.8264 11.8725 +v -8.7543 -2.8170 11.3087 +v -8.5869 -2.8043 10.7474 +v -8.5514 -3.1281 13.0897 +v -8.7916 -2.9872 13.0170 +v -8.7428 -2.9854 12.4901 +v -8.5018 -3.1305 12.5729 +v -9.0170 -2.8389 12.9725 +v -8.9692 -2.8335 12.4301 +v -9.4252 -2.5185 12.9439 +v -9.3793 -2.5079 12.3634 +v -9.1814 -2.6744 12.3891 +v -9.2280 -2.6828 12.9502 +v -9.2871 -2.4982 11.7764 +v -9.0914 -2.6658 11.8173 +v -8.9687 -2.4763 10.6088 +v -8.7840 -2.6435 10.6719 +v -8.9587 -2.6559 11.2424 +v -9.1498 -2.4882 11.1894 +v -8.5715 -3.1205 13.5754 +v -8.8055 -2.9858 13.5153 +v -8.5677 -3.1088 14.0145 +v -8.7858 -2.9847 13.9741 +v -8.9909 -2.8513 13.9807 +v -9.0249 -2.8434 13.4910 +v -8.7337 -2.9869 14.3826 +v -8.5459 -3.0944 14.3913 +v -8.9125 -2.8668 14.4366 +v -9.2671 -2.5762 14.5900 +v -9.0917 -2.7294 14.5093 +v -9.3715 -2.5499 14.0616 +v -9.1861 -2.7066 14.0138 +v -9.2306 -2.6923 13.4929 +v -9.4234 -2.5316 13.5114 +v -9.8732 -1.8341 14.8869 +v -9.7398 -2.0359 14.8171 +v -9.9994 -1.8096 14.2695 +v -9.8621 -2.0094 14.2171 +v -9.7108 -2.2002 14.1643 +v -9.5931 -2.2279 14.7442 +v -10.0749 -1.7772 12.9975 +v -9.9341 -1.9745 12.9765 +v -9.9262 -1.9894 13.6018 +v -10.0659 -1.7911 13.6379 +v -9.7786 -2.1640 12.9591 +v -9.7720 -2.1795 13.5675 +v -9.6041 -2.3604 13.5368 +v -9.6089 -2.3454 12.9475 +v -9.5468 -2.3808 14.1121 +v -9.4349 -2.4085 14.6684 +v -10.0287 -1.7666 12.3534 +v -9.8881 -1.9630 12.3463 +v -9.9294 -1.7579 11.7108 +v -9.7901 -1.9536 11.7166 +v -9.6366 -2.1422 11.7281 +v -9.7329 -2.1521 12.3442 +v -9.5800 -1.7411 10.4510 +v -9.4466 -1.9351 10.4793 +v -9.6423 -1.9448 11.0925 +v -9.7791 -1.7499 11.0749 +v -9.3001 -2.1222 10.5140 +v -9.4917 -2.1328 11.1163 +v -9.3275 -2.3139 11.1480 +v -9.1408 -2.3026 10.5567 +v -9.4689 -2.3237 11.7474 +v -9.5632 -2.3337 12.3491 +v -5.6986 -3.6503 16.6309 +v -5.2678 -3.6966 16.6459 +v -5.2719 -3.5525 17.0725 +v -5.7172 -3.5088 17.0524 +v -4.4002 -3.7676 16.5581 +v -4.8339 -3.7353 16.6199 +v -4.3775 -3.6183 16.9859 +v -4.8240 -3.5886 17.0485 +v -4.3400 -3.2669 17.7473 +v -4.8147 -3.2414 17.8107 +v -4.8178 -3.4237 17.4452 +v -4.3575 -3.4513 17.3820 +v -5.2930 -3.2098 17.8300 +v -5.2807 -3.3900 17.4669 +v -5.7416 -3.3488 17.4412 +v -5.7700 -3.1708 17.7984 +v -3.9703 -3.7948 16.4655 +v -3.5475 -3.8182 16.3474 +v -3.5042 -3.6641 16.7676 +v -3.9363 -3.6431 16.8904 +v -2.7373 -3.8586 16.0547 +v -3.1354 -3.8390 16.2087 +v -2.6833 -3.6998 16.4625 +v -3.0853 -3.6826 16.6231 +v -2.5749 -3.3311 17.1871 +v -2.9863 -3.3183 17.3597 +v -3.0352 -3.5088 17.0063 +v -2.6287 -3.5238 16.8395 +v -3.4208 -3.3042 17.5151 +v -3.4617 -3.4926 17.1565 +v -3.9040 -3.4738 17.2838 +v -3.8737 -3.2874 17.6465 +v -2.3953 -2.4038 18.3064 +v -2.8253 -2.3984 18.4975 +v -2.8580 -2.6511 18.2520 +v -2.4321 -2.6580 18.0648 +v -3.2895 -2.3911 18.6692 +v -3.3158 -2.6424 18.4205 +v -3.3471 -2.8786 18.1460 +v -2.8965 -2.8890 17.9813 +v -2.4752 -2.8977 17.7985 +v -4.2942 -2.3673 18.9192 +v -4.3021 -2.6155 18.6678 +v -3.7993 -2.6308 18.5618 +v -3.7813 -2.3810 18.8126 +v -4.3124 -2.8484 18.3893 +v -3.8210 -2.8654 18.2845 +v -3.8459 -3.0845 17.9798 +v -4.3249 -3.0658 18.0828 +v -3.3823 -3.0994 17.8445 +v -2.5233 -3.1222 17.5063 +v -2.9397 -3.1116 17.6843 +v -4.8215 -2.3493 18.9803 +v -4.8180 -2.5955 18.7301 +v -5.3565 -2.3259 18.9873 +v -5.3407 -2.5700 18.7404 +v -5.3242 -2.7991 18.4658 +v -4.8154 -2.8267 18.4523 +v -5.8639 -2.5380 18.6905 +v -5.8926 -2.2966 18.9314 +v -5.8328 -2.7647 18.4221 +v -5.8010 -2.9759 18.1250 +v -5.3079 -3.0126 18.1627 +v -4.8141 -3.0422 18.1462 +v -6.4746 -3.7413 15.5490 +v -6.8496 -3.6613 15.4211 +v -6.8237 -3.7339 14.9293 +v -6.4578 -3.8174 15.0455 +v -7.5359 -3.4824 15.0810 +v -7.2049 -3.5745 15.2628 +v -7.4992 -3.5458 14.6224 +v -7.1721 -3.6429 14.7858 +v -7.4348 -3.6230 13.6167 +v -7.1144 -3.7291 13.7542 +v -7.1440 -3.6938 14.2806 +v -7.4681 -3.5919 14.1318 +v -6.7785 -3.8275 13.8761 +v -6.8018 -3.7887 14.4119 +v -6.4441 -3.8756 14.5185 +v -6.4286 -3.9176 13.9749 +v -7.8377 -3.3865 14.8825 +v -8.1068 -3.2895 14.6852 +v -8.0792 -3.3368 14.2738 +v -7.8014 -3.4436 14.4461 +v -8.3399 -3.1937 14.5068 +v -8.3334 -3.2257 14.1221 +v -8.2961 -3.2623 13.1966 +v -8.3220 -3.2482 13.6810 +v -8.0252 -3.3895 13.3272 +v -8.0558 -3.3692 13.8182 +v -7.7716 -3.4837 13.9731 +v -7.7382 -3.5098 13.4708 +v -7.9227 -3.2495 11.0638 +v -8.0623 -3.2618 11.6054 +v -7.6770 -3.3853 11.1959 +v -7.8055 -3.3971 11.7342 +v -7.9039 -3.4024 12.2754 +v -8.1691 -3.2685 12.1484 +v -7.1475 -3.6358 11.4637 +v -7.2526 -3.6462 11.9995 +v -7.5357 -3.5254 11.8679 +v -7.4187 -3.5142 11.3315 +v -7.3321 -3.6486 12.5424 +v -7.6249 -3.5293 12.4092 +v -7.6908 -3.5245 12.9465 +v -7.3911 -3.6414 13.0842 +v -7.9758 -3.4002 12.8097 +v -8.2461 -3.2688 12.6823 +v -6.8631 -3.7496 11.5857 +v -6.9563 -3.7593 12.1223 +v -6.5651 -3.8554 11.6909 +v -6.6467 -3.8643 12.2292 +v -6.7061 -3.8637 12.7776 +v -7.0258 -3.7602 12.6676 +v -6.3238 -3.9607 12.3134 +v -6.2532 -3.9525 11.7725 +v -6.3733 -3.9586 12.8654 +v -6.4066 -3.9448 13.4216 +v -6.7483 -3.8520 13.3290 +v -7.0767 -3.7507 13.2141 +v -6.9033 -0.0108 5.4959 +v -6.8964 -0.2157 5.5026 +v -7.4180 -0.2196 6.0864 +v -7.4253 -0.0108 6.0802 +v -6.8766 -0.4198 5.5221 +v -7.3970 -0.4276 6.1045 +v -7.8894 -0.4345 6.6880 +v -7.9115 -0.2231 6.6716 +v -7.9192 -0.0108 6.6660 +v -6.8029 -0.8233 5.5975 +v -7.3181 -0.8385 6.1739 +v -7.3634 -0.6342 6.1338 +v -6.8451 -0.6226 5.5539 +v -7.8055 -0.8520 6.7510 +v -7.8537 -0.6444 6.7146 +v -8.6849 -0.8745 7.9184 +v -8.7384 -0.6615 7.8901 +v -8.3131 -0.6535 7.2991 +v -8.2621 -0.8640 7.3316 +v -8.7777 -0.4460 7.8696 +v -8.3507 -0.4407 7.2754 +v -8.8104 -0.0108 7.8529 +v -8.3820 -0.0108 7.2559 +v -8.3739 -0.2261 7.2609 +v -8.8020 -0.2288 7.8571 +v -6.7510 -1.0213 5.6523 +v -7.2621 -1.0398 6.2243 +v -6.6904 -1.2158 5.7178 +v -7.1965 -1.2374 6.2843 +v -7.6752 -1.2569 6.8512 +v -7.7457 -1.0564 6.7967 +v -7.0402 -1.6186 6.4313 +v -7.1222 -1.4306 6.3535 +v -6.6223 -1.4062 5.7934 +v -7.5060 -1.6430 6.9847 +v -7.5950 -1.4527 6.9141 +v -8.3460 -1.6847 8.1029 +v -8.4477 -1.4901 8.0466 +v -8.0378 -1.4725 7.4776 +v -7.9422 -1.6650 7.5411 +v -8.5387 -1.2896 7.9968 +v -8.1236 -1.2743 7.4212 +v -8.1987 -1.0711 7.3724 +v -8.6180 -1.0841 7.9540 +v -9.7003 -1.5401 10.4276 +v -9.4510 -1.5305 9.8115 +v -9.3343 -1.7302 9.8441 +v -9.8066 -1.3330 10.4087 +v -9.5544 -1.3247 9.7841 +v -9.2570 -1.3147 9.1756 +v -9.1572 -1.5190 9.2110 +v -9.0449 -1.7172 9.2521 +v -9.9751 -0.9039 10.3828 +v -9.7188 -0.8983 9.7436 +v -9.6439 -1.1137 9.7615 +v -9.8984 -1.1206 10.3940 +v -9.4162 -0.8916 9.1216 +v -9.3436 -1.1053 9.1458 +v -9.0007 -1.0955 8.5442 +v -9.0706 -0.8837 8.5141 +v -8.9175 -1.3031 8.5808 +v -8.7145 -1.7021 8.6725 +v -8.8218 -1.5055 8.6235 +v -10.0359 -0.6837 10.3749 +v -9.7782 -0.6795 9.7300 +v -10.0801 -0.4609 10.3699 +v -9.8217 -0.4580 9.7207 +v -9.5163 -0.4546 9.0895 +v -9.4741 -0.6744 9.1028 +v -10.1165 -0.0108 10.3664 +v -9.8574 -0.0108 9.7135 +v -9.8483 -0.2349 9.7153 +v -10.1072 -0.2363 10.3671 +v -9.5512 -0.0108 9.0789 +v -9.5423 -0.2332 9.0815 +v -9.1925 -0.2312 8.4631 +v -9.2012 -0.0108 8.4596 +v -9.1673 -0.4506 8.4734 +v -9.1264 -0.6684 8.4904 +v -2.4091 -4.0213 15.4582 +v -2.3568 -3.8782 15.8904 +v -2.0413 -4.0422 15.2988 +v -1.9917 -3.8971 15.7235 +v -1.9394 -3.7338 16.1176 +v -2.3022 -3.7171 16.2914 +v -1.3367 -4.0788 15.0011 +v -1.2986 -3.9307 15.4115 +v -1.6396 -3.9148 15.5613 +v -1.6845 -4.0615 15.1441 +v -1.2581 -3.7636 15.7933 +v -1.5922 -3.7495 15.9490 +v -1.1751 -3.3762 16.4736 +v -1.4952 -3.3665 16.6390 +v -1.5436 -3.5665 16.3079 +v -1.2166 -3.5785 16.1471 +v -1.8329 -3.3555 16.8186 +v -1.8859 -3.5530 16.4823 +v -2.2466 -3.5387 16.6622 +v -2.1916 -3.3436 17.0040 +v -0.9962 -4.0933 14.8772 +v -0.9663 -3.9441 15.2817 +v -0.6611 -4.1045 14.7794 +v -0.6405 -3.9545 15.1792 +v -0.6186 -3.7847 15.5519 +v -0.9344 -3.7755 15.6583 +v 0.0000 -4.1143 14.6911 +v 0.0000 -3.9636 15.0867 +v -0.3192 -3.9612 15.1117 +v -0.3296 -4.1117 14.7150 +v 0.0000 -3.7929 15.4558 +v -0.3080 -3.7907 15.4818 +v -0.0000 -3.3961 16.1158 +v -0.2850 -3.3947 16.1433 +v -0.2965 -3.6014 15.8255 +v -0.0000 -3.6033 15.7988 +v -0.5735 -3.3906 16.2175 +v -0.5961 -3.5964 15.8979 +v -0.9017 -3.5886 16.0077 +v -0.8690 -3.3844 16.3303 +v 0.0000 -2.4169 17.1301 +v -0.2457 -2.4169 17.1601 +v -0.2538 -2.6815 16.9434 +v 0.0000 -2.6818 16.9141 +v -0.4965 -2.4167 17.2412 +v -0.5124 -2.6805 17.0227 +v -0.5310 -2.9315 16.7796 +v -0.2633 -2.9334 16.7019 +v 0.0000 -2.9341 16.6732 +v -1.0339 -2.4151 17.5216 +v -1.0631 -2.6763 17.2969 +v -0.7806 -2.6788 17.1434 +v -0.7575 -2.4162 17.3647 +v -1.0972 -2.9242 17.0478 +v -0.8075 -2.9284 16.8977 +v -0.8373 -3.1640 16.6268 +v -1.1349 -3.1578 16.7736 +v -0.5516 -3.1686 16.5113 +v -0.0000 -3.1726 16.4072 +v -0.2738 -3.1716 16.4353 +v -1.3308 -2.4135 17.7031 +v -1.3648 -2.6731 17.4744 +v -1.6532 -2.4112 17.9003 +v -1.6903 -2.6689 17.6673 +v -1.7335 -2.9127 17.4100 +v -1.4044 -2.9189 17.2214 +v -2.0445 -2.6640 17.8670 +v -2.0064 -2.4080 18.1043 +v -2.0890 -2.9056 17.6052 +v -2.1386 -3.1323 17.3179 +v -1.7816 -3.1418 17.1275 +v -1.4483 -3.1503 16.9432 +v -2.0495 -2.6598 3.6996 +v -2.0640 -2.8169 4.0386 +v -1.7119 -2.6474 3.5061 +v -1.7293 -2.8053 3.8530 +v -1.7499 -2.9602 4.2185 +v -2.0822 -2.9710 4.3963 +v -1.0953 -2.6307 3.2265 +v -1.1119 -2.7891 3.5833 +v -1.4129 -2.7961 3.7019 +v -1.3950 -2.6378 3.3492 +v -1.1309 -2.9447 3.9582 +v -1.4337 -2.9515 4.0731 +v -1.1753 -3.2462 4.7631 +v -1.4833 -3.2525 4.8708 +v -1.4572 -3.1037 4.4627 +v -1.1521 -3.0971 4.3515 +v -1.8009 -3.2601 5.0054 +v -1.7738 -3.1119 4.6026 +v -2.1041 -3.1219 4.7728 +v -2.1298 -3.2690 5.1680 +v -0.8094 -2.6257 3.1355 +v -0.8232 -2.7842 3.4948 +v -0.5339 -2.6225 3.0737 +v -0.5437 -2.7809 3.4345 +v -0.5547 -2.9363 3.8130 +v -0.8388 -2.9397 3.8722 +v 0.0000 -2.6205 3.0277 +v 0.0000 -2.7787 3.3892 +v -0.2703 -2.7792 3.4000 +v -0.2652 -2.6209 3.0386 +v -0.0000 -2.9338 3.7683 +v -0.2760 -2.9344 3.7790 +v 0.0000 -3.2347 4.5802 +v -0.2891 -3.2355 4.5909 +v -0.2823 -3.0866 4.1759 +v 0.0000 -3.0859 4.1652 +v -0.5801 -3.2376 4.6243 +v -0.5669 -3.0886 4.2095 +v -0.8561 -3.0921 4.2676 +v -0.8748 -3.2412 4.6813 +v 0.0000 -3.7952 6.4269 +v -0.3197 -3.7960 6.4376 +v -0.3116 -3.6614 5.9475 +v 0.0000 -3.6605 5.9367 +v -0.6400 -3.7980 6.4696 +v -0.6242 -3.6635 5.9798 +v -0.6088 -3.5252 5.5092 +v -0.3038 -3.5230 5.4765 +v 0.0000 -3.5221 5.4657 +v -1.2852 -3.8040 6.5957 +v -1.2555 -3.6708 6.1094 +v -0.9385 -3.6668 6.0338 +v -0.9616 -3.8008 6.5223 +v -1.2272 -3.5332 5.6420 +v -0.9162 -3.5287 5.5643 +v -0.8949 -3.3868 5.1135 +v -1.2004 -3.3916 5.1933 +v -0.5941 -3.3832 5.0574 +v 0.0000 -3.3802 5.0136 +v -0.2963 -3.3810 5.0244 +v -1.6113 -3.8073 6.6893 +v -1.5760 -3.6752 6.2066 +v -1.9407 -3.8102 6.8028 +v -1.9011 -3.6797 6.3255 +v -1.8646 -3.5443 5.8668 +v -1.5429 -3.5385 5.7427 +v -2.2315 -3.6841 6.4660 +v -2.2739 -3.8124 6.9360 +v -2.1934 -3.5505 6.0146 +v -2.1595 -3.4120 5.5820 +v -1.8312 -3.4043 5.4268 +v -1.5119 -3.3975 5.2974 +v -2.5998 -4.4810 11.2043 +v -2.6076 -4.4923 11.7721 +v -2.2237 -4.5012 11.1042 +v -2.2294 -4.5143 11.6685 +v -2.2253 -4.5067 12.2294 +v -2.6044 -4.4836 12.3383 +v -1.4777 -4.5299 10.9304 +v -1.4804 -4.5465 11.4856 +v -1.8538 -4.5322 11.5720 +v -1.8498 -4.5174 11.0120 +v -1.4764 -4.5419 12.0341 +v -1.8495 -4.5261 12.1267 +v -1.4499 -4.4697 13.0977 +v -1.8185 -4.4519 13.2063 +v -1.8375 -4.4993 12.6727 +v -1.4660 -4.5162 12.5725 +v -2.1911 -4.4308 13.3250 +v -2.2123 -4.4788 12.7829 +v -2.5910 -4.4549 12.8988 +v -2.5686 -4.4066 13.4490 +v -1.1070 -4.5390 10.8620 +v -1.1088 -4.5571 11.4127 +v -0.7374 -4.5450 10.8097 +v -0.7384 -4.5645 11.3565 +v -0.7360 -4.5625 11.8941 +v -1.1054 -4.5540 11.9553 +v 0.0000 -4.5494 10.7641 +v 0.0000 -4.5701 11.3070 +v -0.3690 -4.5687 11.3202 +v -0.3685 -4.5484 10.7762 +v 0.0000 -4.5693 11.8398 +v -0.3677 -4.5676 11.8543 +v 0.0000 -4.5033 12.8655 +v -0.3605 -4.5011 12.8832 +v -0.3649 -4.5450 12.3761 +v 0.0000 -4.5470 12.3601 +v -0.7217 -4.4945 12.9311 +v -0.7304 -4.5392 12.4198 +v -1.0972 -4.5295 12.4867 +v -1.0846 -4.4840 13.0043 +v -0.3391 -4.2410 14.2913 +v 0.0000 -4.2436 14.2689 +v -0.6797 -4.2336 14.3521 +v -0.6962 -4.3417 13.8998 +v -0.3475 -4.3490 13.8432 +v 0.0000 -4.3516 13.8223 +v -1.3714 -4.2069 14.5613 +v -1.0233 -4.2220 14.4443 +v -1.4021 -4.3149 14.0953 +v -1.0473 -4.3301 13.9859 +v -1.0679 -4.4175 13.5050 +v -1.4285 -4.4025 13.6063 +v -0.7103 -4.4287 13.4253 +v 0.0000 -4.4382 13.3537 +v -0.3546 -4.4357 13.3730 +v -1.7254 -4.1888 14.6963 +v -2.0869 -4.1683 14.8426 +v -2.1276 -4.2753 14.3589 +v -1.7618 -4.2964 14.2217 +v -2.4574 -4.1460 14.9935 +v -2.5008 -4.2519 14.5007 +v -2.5382 -4.3388 13.9844 +v -2.1626 -4.3628 13.8517 +v -1.7931 -4.3842 13.7238 +v -2.5821 -0.0108 1.3799 +v -2.1576 -0.0108 1.0442 +v -2.1545 -0.1767 1.0540 +v -2.5785 -0.1796 1.3893 +v -1.7738 -0.0108 0.7623 +v -1.7711 -0.1744 0.7726 +v -1.7640 -0.3380 0.8038 +v -2.1462 -0.3426 1.0838 +v -2.5690 -0.3484 1.4177 +v -1.1050 -0.0108 0.3491 +v -1.1032 -0.1713 0.3603 +v -1.4226 -0.1726 0.5423 +v -1.4249 -0.0108 0.5315 +v -1.0985 -0.3320 0.3942 +v -1.4168 -0.3345 0.5749 +v -1.0837 -0.6544 0.5301 +v -1.3979 -0.6592 0.7060 +v -1.4082 -0.4967 0.6294 +v -1.0918 -0.4930 0.4508 +v -1.7411 -0.6659 0.9297 +v -1.7537 -0.5018 0.8560 +v -2.5372 -0.6858 1.5329 +v -2.5548 -0.5171 1.4655 +v -2.1339 -0.5086 1.1337 +v -2.1189 -0.6747 1.2042 +v -0.8084 -0.0108 0.2121 +v -0.8071 -0.1704 0.2238 +v -0.5293 -0.0108 0.1178 +v -0.5283 -0.1699 0.1298 +v -0.5260 -0.3292 0.1658 +v -0.8036 -0.3303 0.2588 +v 0.0000 -0.0108 0.0463 +v 0.0000 -0.1696 0.0586 +v -0.2613 -0.1696 0.0757 +v -0.2617 -0.0108 0.0635 +v 0.0000 -0.3285 0.0954 +v -0.2601 -0.3287 0.1123 +v 0.0000 -0.6478 0.2417 +v -0.2565 -0.6481 0.2578 +v -0.2584 -0.4881 0.1730 +v 0.0000 -0.4879 0.1565 +v -0.5187 -0.6491 0.3091 +v -0.5227 -0.4889 0.2256 +v -0.7985 -0.4904 0.3172 +v -0.7925 -0.6511 0.3988 +v 0.0000 -1.2973 0.8195 +v -0.2496 -1.2977 0.8333 +v -0.2507 -1.1335 0.6543 +v 0.0000 -1.1331 0.6399 +v -0.5046 -1.2993 0.8784 +v -0.5071 -1.1350 0.7010 +v -0.5105 -0.9719 0.5469 +v -0.2524 -0.9706 0.4986 +v 0.0000 -0.9702 0.4836 +v -1.0530 -1.3080 1.0766 +v -1.0589 -1.1431 0.9055 +v -0.7746 -1.1380 0.7836 +v -0.7706 -1.3026 0.9583 +v -1.0665 -0.9793 0.7574 +v -0.7800 -0.9747 0.6321 +v -0.7861 -0.8125 0.5038 +v -1.0750 -0.8165 0.6323 +v -0.5145 -0.8100 0.4163 +v 0.0000 -0.8086 0.3508 +v -0.2544 -0.8088 0.3663 +v -1.3574 -1.3159 1.2369 +v -1.3656 -1.1505 1.0701 +v -1.6892 -1.3269 1.4426 +v -1.7002 -1.1608 1.2811 +v -1.7133 -0.9953 1.1419 +v -1.3757 -0.9860 0.9262 +v -2.4759 -1.1913 1.8558 +v -2.0685 -1.1742 1.5418 +v -2.0538 -1.3413 1.6973 +v -2.4964 -1.0229 1.7277 +v -2.0850 -1.0075 1.4080 +v -2.1022 -0.8410 1.2956 +v -2.5173 -0.8544 1.6202 +v -1.7273 -0.8304 1.0249 +v -1.3868 -0.8223 0.8049 +v 0.0000 -3.9261 6.9366 +v -0.3279 -3.9268 6.9472 +v 0.0000 -4.0509 7.4624 +v -0.3360 -4.0515 7.4729 +v -0.6722 -4.0526 7.5036 +v -0.6562 -3.9284 6.9785 +v 0.0000 -4.2736 8.5486 +v -0.3508 -4.2738 8.5590 +v -0.3437 -4.1679 8.0113 +v 0.0000 -4.1675 8.0009 +v -0.7019 -4.2737 8.5889 +v -0.6876 -4.1684 8.0415 +v -1.4054 -4.2706 8.7017 +v -1.3772 -4.1681 8.1566 +v -1.0321 -4.1687 8.0903 +v -1.0533 -4.2728 8.6369 +v -1.3471 -4.0548 7.6221 +v -1.0092 -4.0539 7.5536 +v -0.9854 -3.9305 7.0299 +v -1.3161 -3.9327 7.1008 +v 0.0000 -4.3671 9.1022 +v -0.3571 -4.3670 9.1128 +v 0.0000 -4.4457 9.6583 +v -0.3624 -4.4453 9.6691 +v -0.7249 -4.4437 9.6996 +v -0.7145 -4.3661 9.1427 +v -0.3662 -4.5065 10.2247 +v 0.0000 -4.5072 10.2134 +v -0.7328 -4.5040 10.2563 +v -1.4678 -4.4919 10.3715 +v -1.0999 -4.4993 10.3061 +v -1.4518 -4.4346 9.8119 +v -1.0880 -4.4402 9.7478 +v -1.0722 -4.3640 9.1904 +v -1.4306 -4.3601 9.2544 +v -2.9540 -4.4270 10.7453 +v -2.5797 -4.4494 10.6397 +v -2.9186 -4.3796 10.1882 +v -2.5496 -4.3992 10.0800 +v -2.1824 -4.4146 9.9799 +v -2.2075 -4.4673 10.5406 +v -2.8242 -4.2378 9.1019 +v -2.4675 -4.2507 8.9834 +v -2.5115 -4.3324 9.5272 +v -2.8745 -4.3160 9.6398 +v -2.1123 -4.2601 8.8763 +v -2.1501 -4.3448 9.4244 +v -1.7898 -4.3539 9.3329 +v -1.7584 -4.2666 8.7819 +v -1.8165 -4.4262 9.8899 +v -1.8369 -4.4814 10.4505 +v -2.7703 -4.1468 8.5762 +v -2.4197 -4.1560 8.4504 +v -2.7152 -4.0446 8.0643 +v -2.3701 -4.0502 7.9302 +v -2.0272 -4.0534 7.8112 +v -2.0708 -4.1623 8.3378 +v -2.3208 -3.9350 7.4247 +v -2.6615 -3.9329 7.5678 +v -1.9833 -3.9354 7.2988 +v -1.6485 -3.9345 7.1907 +v -1.6863 -4.0548 7.7083 +v -1.7234 -4.1662 8.2395 +v -3.0059 -3.9286 7.7275 +v -3.0630 -4.0361 8.2127 +v -3.4090 -4.0241 8.3690 +v -3.3489 -3.9215 7.8977 +v -3.1826 -4.2209 9.2306 +v -3.1229 -4.1341 8.7142 +v -3.5395 -4.1993 9.3630 +v -3.4738 -4.1171 8.8578 +v -4.2370 -4.1385 9.6135 +v -4.1556 -4.0673 9.1363 +v -3.8192 -4.0951 9.0007 +v -3.8920 -4.1721 9.4928 +v -4.0782 -3.9862 8.6799 +v -3.7489 -4.0077 8.5269 +v -3.6856 -3.9108 8.0723 +v -4.0109 -3.8960 8.2452 +v -3.2390 -4.2952 9.7606 +v -3.2894 -4.3553 10.3026 +v -3.6597 -4.3257 10.4175 +v -3.6026 -4.2692 9.8833 +v -3.3306 -4.3998 10.8553 +v -3.7072 -4.3672 10.9643 +v -4.4517 -4.2833 11.1578 +v -4.0817 -4.3286 11.0669 +v -4.3893 -4.2475 10.6257 +v -4.0271 -4.2900 10.5271 +v -3.9626 -4.2374 10.0020 +v -4.3163 -4.1989 10.1104 +v -5.8426 -4.0233 11.2974 +v -5.5128 -4.1013 11.3068 +v -5.7378 -3.9971 10.7922 +v -5.4204 -4.0732 10.7967 +v -5.0883 -4.1399 10.7664 +v -5.1695 -4.1702 11.2831 +v -5.4835 -3.9223 9.8566 +v -5.1974 -3.9909 9.8491 +v -5.3138 -4.0361 10.3099 +v -5.6168 -3.9631 10.3110 +v -4.8925 -4.0491 9.8003 +v -4.9944 -4.0992 10.2714 +v -4.6611 -4.1531 10.2026 +v -4.5714 -4.0979 9.7189 +v -4.7438 -4.1977 10.7074 +v -4.8151 -4.2307 11.2317 +v -5.3422 -3.8757 9.4317 +v -5.0756 -3.9387 9.4169 +v -5.2010 -3.8268 9.0472 +v -4.9583 -3.8814 9.0211 +v -4.6875 -3.9245 8.9396 +v -4.7869 -3.9906 9.3554 +v -4.8558 -3.8212 8.6692 +v -5.0682 -3.7787 8.7140 +v -4.6042 -3.8516 8.5556 +v -4.3198 -3.8764 8.4102 +v -4.3926 -3.9590 8.8217 +v -4.4792 -4.0330 9.2583 +v -5.2346 -3.7174 8.6532 +v -5.4113 -3.7575 8.9992 +v -5.5987 -3.6747 8.8958 +v -5.3767 -3.6391 8.5232 +v -5.7480 -3.8421 9.8141 +v -5.5837 -3.8003 9.3887 +v -5.9936 -3.7510 9.7309 +v -5.8042 -3.7130 9.2993 +v -6.4390 -3.5388 9.4788 +v -6.1994 -3.5060 9.0261 +v -6.0080 -3.6147 9.1746 +v -6.2230 -3.6497 9.6161 +v -5.9372 -3.4725 8.5921 +v -5.7726 -3.5794 8.7558 +v -5.5157 -3.5462 8.3605 +v -5.6525 -3.4403 8.1772 +v -5.9007 -3.8793 10.2678 +v -6.0382 -3.9107 10.7471 +v -6.3225 -3.8148 10.6683 +v -6.1673 -3.7853 10.1879 +v -6.1568 -3.9355 11.2495 +v -6.4560 -3.8385 11.1699 +v -7.0117 -3.6188 10.9429 +v -6.7408 -3.7328 11.0655 +v -6.8470 -3.5962 10.4380 +v -6.5917 -3.7098 10.5629 +v -6.4184 -3.6817 10.0793 +v -6.6555 -3.5692 9.9497 +v -7.9689 -3.0898 10.4065 +v -7.7474 -3.2320 10.5340 +v -7.7466 -3.0683 9.8822 +v -7.5383 -3.2102 10.0159 +v -7.3194 -3.3459 10.1576 +v -7.5144 -3.3679 10.6704 +v -7.2045 -3.0157 8.8656 +v -7.0261 -3.1566 9.0147 +v -7.2972 -3.1848 9.5095 +v -7.4911 -3.0434 9.3686 +v -6.8396 -3.2914 9.1712 +v -7.0939 -3.3201 9.6579 +v -6.8803 -3.4484 9.8069 +v -6.6442 -3.4191 9.3282 +v -7.0893 -3.4747 10.3006 +v -7.2693 -3.4970 10.8089 +v -6.8887 -2.9859 8.3729 +v -6.7267 -3.1264 8.5316 +v -6.5458 -2.9545 7.8904 +v -6.4009 -3.0948 8.0599 +v -6.2512 -3.2288 8.2377 +v -6.5581 -3.2606 8.6978 +v -6.0505 -3.0627 7.5998 +v -6.1778 -2.9222 7.4179 +v -5.9203 -3.1969 7.7910 +v -5.7874 -3.3233 7.9854 +v -6.0967 -3.3552 8.4172 +v -6.3826 -3.3876 8.8649 +v -6.0981 -1.3793 5.2312 +v -6.1599 -1.1919 5.1490 +v -5.6137 -1.1664 4.5854 +v -5.5585 -1.3508 4.6743 +v -6.2630 -0.8065 5.0190 +v -6.2152 -1.0007 5.0781 +v -5.7073 -0.7884 4.4457 +v -5.6637 -0.9788 4.5091 +v -4.5838 -0.7510 3.3449 +v -4.5487 -0.9333 3.4164 +v -5.1053 -0.9561 3.9527 +v -5.1446 -0.7697 3.8853 +v -4.5093 -1.1139 3.5034 +v -5.0606 -1.1402 4.0344 +v -5.0118 -1.3215 4.1301 +v -4.4668 -1.2923 3.6058 +v -6.3021 -0.6097 4.9721 +v -6.3314 -0.4111 4.9380 +v -5.7704 -0.4018 4.3596 +v -5.7432 -0.5959 4.3958 +v -6.3565 -0.0108 4.9101 +v -6.3499 -0.2113 4.9172 +v -5.7937 -0.0108 4.3302 +v -5.7876 -0.2066 4.3376 +v -4.6561 -0.0108 3.2169 +v -4.6508 -0.1967 3.2250 +v -5.2182 -0.2017 3.7711 +v -5.2239 -0.0108 3.7633 +v -4.6361 -0.3823 3.2491 +v -5.2023 -0.3921 3.7942 +v -5.1773 -0.5816 3.8323 +v -4.6134 -0.5672 3.2891 +v -3.0491 -0.1832 1.7813 +v -3.0531 -0.0108 1.7723 +v -3.0383 -0.3555 1.8085 +v -3.5452 -0.3638 2.2489 +v -3.5573 -0.1874 2.2228 +v -3.5618 -0.0108 2.2141 +v -3.0016 -0.6995 1.9186 +v -3.0221 -0.5276 1.8542 +v -3.5035 -0.7153 2.3542 +v -3.5269 -0.5398 2.2927 +v -4.0603 -0.5531 2.7734 +v -4.0339 -0.7326 2.8321 +v -4.0808 -0.3728 2.7315 +v -4.0990 -0.0108 2.6981 +v -4.0942 -0.1919 2.7064 +v -2.9783 -0.8710 2.0020 +v -2.9533 -1.0420 2.1046 +v -3.4469 -1.0640 2.5311 +v -3.4764 -0.8901 2.4336 +v -2.9280 -1.2125 2.2266 +v -3.4163 -1.2369 2.6467 +v -3.9321 -1.2638 3.1089 +v -3.9685 -1.0882 2.9998 +v -4.0028 -0.9111 2.9075 +v -6.4590 -2.0087 19.0103 +v -6.9887 -1.9692 18.7921 +v -6.4892 -1.7452 19.1905 +v -7.0284 -1.7105 18.9630 +v -7.5490 -1.6713 18.6584 +v -7.4996 -1.9246 18.4985 +v -6.5335 -1.1896 19.4706 +v -7.0870 -1.1656 19.2290 +v -7.0611 -1.4421 19.1087 +v -6.5139 -1.4716 19.3440 +v -7.6223 -1.1384 18.9080 +v -7.5898 -1.4087 18.7951 +v -8.6094 -1.0793 18.0605 +v -8.5636 -1.3361 17.9643 +v -8.0930 -1.3729 18.4109 +v -8.1322 -1.1093 18.5159 +v -8.5068 -1.5859 17.8488 +v -8.0441 -1.6292 18.2844 +v -7.9852 -1.8767 18.1370 +v -8.4386 -1.8274 17.7148 +v -6.5482 -0.9008 19.5699 +v -7.1066 -0.8825 19.3233 +v -6.5584 -0.6069 19.6413 +v -7.1201 -0.5947 19.3912 +v -7.6641 -0.5808 19.0609 +v -7.6470 -0.8619 18.9968 +v -6.5661 -0.0108 19.6990 +v -7.1304 -0.0108 19.4461 +v -7.1279 -0.3036 19.4323 +v -6.5642 -0.3097 19.6844 +v -7.6772 -0.0108 19.1128 +v -7.6740 -0.2966 19.0997 +v -8.6884 -0.0108 18.2375 +v -8.6836 -0.2814 18.2260 +v -8.1951 -0.2891 18.6949 +v -8.1991 -0.0108 18.7072 +v -8.6691 -0.5506 18.1921 +v -8.1829 -0.5659 18.6584 +v -8.1620 -0.8398 18.5986 +v -8.6445 -0.8170 18.1367 +v -10.1689 -0.0108 15.8825 +v -10.1613 -0.2540 15.8746 +v -9.8784 -0.2598 16.5174 +v -9.8854 -0.0108 16.5263 +v -10.1386 -0.4962 15.8523 +v -9.8574 -0.5076 16.4920 +v -9.5138 -0.5209 17.1007 +v -9.5328 -0.2664 17.1291 +v -9.5391 -0.0108 17.1389 +v -10.0476 -0.9729 15.7693 +v -9.7731 -0.9952 16.3964 +v -9.8223 -0.7531 16.4513 +v -10.1007 -0.7362 15.8168 +v -9.4371 -1.0212 16.9927 +v -9.4820 -0.7728 17.0549 +v -9.0869 -0.7944 17.6195 +v -9.0468 -1.0496 17.5501 +v -9.1152 -0.5354 17.6702 +v -9.1376 -0.0108 17.7120 +v -9.1320 -0.2737 17.7013 +v -9.9796 -1.2053 15.7111 +v -9.7097 -1.2327 16.3285 +v -9.8965 -1.4324 15.6435 +v -9.6319 -1.4645 16.2488 +v -9.3076 -1.5019 16.8233 +v -9.3790 -1.2646 16.9151 +v -9.5399 -1.6895 16.1585 +v -9.7984 -1.6529 15.5677 +v -9.2227 -1.7320 16.7181 +v -8.8533 -1.7785 17.2394 +v -8.9302 -1.5429 17.3592 +v -8.9946 -1.2995 17.4630 +v -9.9914 -1.6242 14.9533 +v -10.0943 -1.4070 15.0150 +v -10.2278 -1.3874 14.3687 +v -10.1213 -1.6020 14.3204 +v -10.2535 -0.9553 15.1194 +v -10.1817 -1.1837 15.0708 +v -10.3931 -0.9417 14.4522 +v -10.3184 -1.1670 14.4130 +v -10.4832 -0.9236 13.0869 +v -10.4052 -1.1448 13.0659 +v -10.3921 -1.1543 13.7429 +v -10.4689 -0.9313 13.7729 +v -10.3108 -1.3615 13.0433 +v -10.2992 -1.3726 13.7097 +v -10.1903 -1.5852 13.6743 +v -10.2006 -1.5726 13.0202 +v -10.3096 -0.7228 15.1595 +v -10.3498 -0.4872 15.1897 +v -10.4936 -0.4802 14.5098 +v -10.4516 -0.7124 14.4848 +v -10.3822 -0.0108 15.2158 +v -10.3741 -0.2495 15.2089 +v -10.5276 -0.0108 14.5315 +v -10.5191 -0.2460 14.5258 +v -10.6250 -0.0108 13.1325 +v -10.6159 -0.2413 13.1290 +v -10.5988 -0.2433 13.8306 +v -10.6077 -0.0108 13.8353 +v -10.5890 -0.4709 13.1195 +v -10.5725 -0.4749 13.8179 +v -10.5291 -0.7045 13.7982 +v -10.5446 -0.6986 13.1051 +v -10.3160 -0.2375 11.0399 +v -10.3253 -0.0108 11.0402 +v -10.2886 -0.4632 11.0398 +v -10.4445 -0.4654 11.7250 +v -10.4720 -0.2386 11.7282 +v -10.4813 -0.0108 11.7295 +v -10.1821 -0.9085 11.0421 +v -10.2438 -0.6872 11.0403 +v -10.3374 -0.9129 11.7161 +v -10.3995 -0.6905 11.7207 +v -10.5006 -0.6941 12.4108 +v -10.4386 -0.9177 12.3995 +v -10.5455 -0.4679 12.4200 +v -10.5821 -0.0108 12.4287 +v -10.5728 -0.2398 12.4263 +v -10.1042 -1.1264 11.0459 +v -10.0107 -1.3398 11.0522 +v -10.1643 -1.3461 11.7093 +v -10.2588 -1.1317 11.7121 +v -9.9021 -1.5479 11.0617 +v -10.0543 -1.5551 11.7086 +v -10.1545 -1.5630 12.3632 +v -10.2651 -1.3530 12.3748 +v -10.3600 -1.1376 12.3872 +v -2.3663 -2.1355 18.5245 +v -2.7994 -2.1314 18.7191 +v -2.3440 -1.8548 18.7179 +v -2.7797 -1.8518 18.9153 +v -3.2531 -1.8469 19.0913 +v -3.2688 -2.1253 18.8932 +v -2.3163 -1.2636 19.0251 +v -2.7553 -1.2620 19.2267 +v -2.7653 -1.5614 19.0850 +v -2.3276 -1.5636 18.8852 +v -3.2340 -1.2591 19.4049 +v -3.2417 -1.5575 19.2623 +v -4.2814 -1.2474 19.6546 +v -4.2825 -1.5429 19.5131 +v -3.7499 -1.5515 19.4080 +v -3.7451 -1.2543 19.5506 +v -4.2847 -1.8292 19.3428 +v -3.7571 -1.8396 19.2368 +v -3.7675 -2.1167 19.0380 +v -4.2885 -2.1047 19.1445 +v -2.3091 -0.9566 19.1362 +v -2.7490 -0.9555 19.3393 +v -2.3050 -0.6443 19.2173 +v -2.7456 -0.6436 19.4214 +v -3.2267 -0.6422 19.6004 +v -3.2292 -0.9534 19.5181 +v -2.3031 -0.0108 19.2840 +v -2.7440 -0.0108 19.4889 +v -2.7442 -0.3281 19.4717 +v -2.3033 -0.3284 19.2670 +v -3.2256 -0.0108 19.6680 +v -3.2257 -0.3274 19.6508 +v -4.2822 -0.0108 19.9132 +v -4.2819 -0.3245 19.8964 +v -3.7407 -0.3263 19.7954 +v -3.7408 -0.0108 19.8124 +v -4.2815 -0.6364 19.8471 +v -3.7411 -0.6399 19.7454 +v -3.7424 -0.9498 19.6634 +v -4.2812 -0.9446 19.7662 +v -5.9905 -0.3148 19.8479 +v -5.9919 -0.0108 19.8631 +v -5.9864 -0.6170 19.8028 +v -5.4114 -0.6252 19.8849 +v -5.4141 -0.3189 19.9317 +v -5.4150 -0.0108 19.9475 +v -5.9689 -1.2093 19.6249 +v -5.9792 -0.9158 19.7283 +v -5.4005 -1.2253 19.7008 +v -5.4069 -0.9279 19.8078 +v -4.8385 -0.9374 19.8174 +v -4.8356 -1.2378 19.7077 +v -4.8407 -0.6316 19.8967 +v -4.8427 -0.0108 19.9612 +v -4.8421 -0.3221 19.9449 +v -5.9552 -1.4959 19.4930 +v -5.9381 -1.7738 19.3331 +v -5.3823 -1.7970 19.4000 +v -5.3923 -1.5156 19.5647 +v -5.9172 -2.0413 19.1458 +v -5.3703 -2.0677 19.2073 +v -4.8251 -2.0886 19.2039 +v -4.8288 -1.8152 19.4002 +v -4.8323 -1.5311 19.5684 +v -6.9514 -1.8006 6.5172 +v -6.8564 -1.9768 6.6120 +v -7.3049 -2.0049 7.1488 +v -7.4091 -1.8270 7.0626 +v -6.6493 -2.3126 6.8320 +v -6.7556 -2.1474 6.7166 +v -7.0756 -2.3432 7.3496 +v -7.1936 -2.1769 7.2442 +v -7.8434 -2.3979 8.4018 +v -7.9827 -2.2290 8.3140 +v -7.6035 -2.2041 7.7761 +v -7.4745 -2.3717 7.8725 +v -8.1131 -2.0539 8.2357 +v -7.7247 -2.0306 7.6894 +v -7.8377 -1.8510 7.6114 +v -8.2343 -1.8726 8.1656 +v -6.5379 -2.4725 6.9589 +v -6.4220 -2.6273 7.0983 +v -6.8215 -2.6592 7.5944 +v -6.9515 -2.5039 7.4661 +v -6.3018 -2.7771 7.2510 +v -6.6862 -2.8093 7.7355 +v -7.3758 -2.8696 8.7307 +v -7.0449 -2.8403 8.2286 +v -7.5396 -2.7180 8.6091 +v -7.1949 -2.6896 8.0978 +v -7.3382 -2.5334 7.9794 +v -7.6956 -2.5609 8.4998 +v -8.1797 -2.9417 10.2948 +v -8.3794 -2.7877 10.1975 +v -8.1342 -2.7675 9.6583 +v -7.9454 -2.9208 9.7634 +v -8.7449 -2.4611 10.0410 +v -8.5679 -2.6275 10.1134 +v -8.4811 -2.4429 9.4848 +v -8.3129 -2.6082 9.5658 +v -8.0213 -2.5859 9.0283 +v -8.1798 -2.4217 8.9388 +v -7.8535 -2.7441 9.1290 +v -7.6767 -2.8966 9.2421 +v -8.9103 -2.2883 9.9792 +v -9.0638 -2.1090 9.9267 +v -8.7854 -2.0932 9.3524 +v -8.6387 -2.2712 9.4140 +v -9.2052 -1.9230 9.8821 +v -8.9209 -1.9086 9.2988 +v -8.5963 -1.8918 8.7274 +v -8.4676 -2.0748 8.7894 +v -8.3287 -2.2514 8.8595 +v 0.0000 -2.1408 17.3214 +v -0.2392 -2.1410 17.3522 +v 0.0000 -1.8548 17.4880 +v -0.2342 -1.8551 17.5196 +v -0.4741 -1.8558 17.6050 +v -0.4838 -2.1413 17.4355 +v 0.0000 -1.2589 17.7459 +v -0.2280 -1.2593 17.7791 +v -0.2306 -1.5608 17.6620 +v 0.0000 -1.5604 17.6296 +v -0.4618 -1.2601 17.8687 +v -0.4669 -1.5616 17.7496 +v -0.9705 -1.2624 18.1767 +v -0.9798 -1.5637 18.0510 +v -0.7147 -1.5626 17.8825 +v -0.7074 -1.2612 18.0046 +v -0.9929 -1.8573 17.8994 +v -0.7251 -1.8566 17.7348 +v -0.7392 -2.1416 17.5620 +v -1.0107 -2.1416 17.7227 +v 0.0000 -0.9518 17.8367 +v -0.2263 -0.9521 17.8706 +v -0.0000 -0.6405 17.9018 +v -0.2254 -0.6407 17.9363 +v -0.4567 -0.6413 18.0292 +v -0.4586 -0.9529 17.9620 +v 0.0000 -0.0108 17.9543 +v -0.2249 -0.0108 17.9893 +v -0.2250 -0.3265 17.9760 +v 0.0000 -0.3264 17.9411 +v -0.4558 -0.0108 18.0834 +v -0.4559 -0.3268 18.0698 +v -0.9596 -0.0108 18.4059 +v -0.9598 -0.3276 18.3911 +v -0.6989 -0.3271 18.2118 +v -0.6987 -0.0108 18.2259 +v -0.9613 -0.6428 18.3475 +v -0.7000 -0.6420 18.1698 +v -0.7027 -0.9538 18.1005 +v -0.9646 -0.9549 18.2758 +v -1.9105 -0.3285 19.0458 +v -1.9102 -0.0108 19.0625 +v -1.9123 -0.6444 18.9973 +v -1.5614 -0.6441 18.7719 +v -1.5596 -0.3283 18.8190 +v -1.5593 -0.0108 18.8350 +v -1.9242 -1.2642 18.8092 +v -1.9166 -0.9569 18.9179 +v -1.5731 -1.2641 18.5891 +v -1.5656 -0.9566 18.6949 +v -1.2503 -0.9559 18.4773 +v -1.2572 -1.2634 18.3749 +v -1.2464 -0.6435 18.5517 +v -1.2444 -0.0108 18.6126 +v -1.2447 -0.3280 18.5971 +v -1.9360 -1.5647 18.6722 +v -1.9531 -1.8567 18.5082 +v -1.6013 -1.8576 18.2956 +v -1.5847 -1.5650 18.4556 +v -1.9762 -2.1383 18.3185 +v -1.6239 -2.1402 18.1101 +v -1.3038 -2.1412 17.9085 +v -1.2831 -1.8577 18.0895 +v -1.2678 -1.5646 18.2453 +v 0.0000 -1.4631 1.0222 +v -0.2491 -1.4635 1.0355 +v -0.0000 -1.6299 1.2474 +v -0.2493 -1.6303 1.2602 +v -0.5037 -1.6319 1.3022 +v -0.5035 -1.4651 1.0790 +v -0.0000 -1.9643 1.7619 +v -0.2518 -1.9646 1.7739 +v -0.2502 -1.7975 1.5065 +v 0.0000 -1.7971 1.4942 +v -0.5083 -1.9662 1.8130 +v -0.5053 -1.7991 1.5471 +v -1.0542 -1.9750 1.9866 +v -1.0502 -1.8081 1.7266 +v -0.7704 -1.8025 1.6193 +v -0.7742 -1.9695 1.8828 +v -1.0487 -1.6410 1.4878 +v -0.7685 -1.6353 1.3769 +v -0.7685 -1.4685 1.1563 +v -1.0496 -1.4741 1.2710 +v 0.0000 -2.1307 2.0499 +v -0.2541 -2.1311 2.0615 +v -0.0000 -2.2959 2.3573 +v -0.2571 -2.2963 2.3686 +v -0.5184 -2.2979 2.4054 +v -0.5127 -2.1327 2.0994 +v -0.2608 -2.4598 2.6945 +v 0.0000 -2.4594 2.6835 +v -0.5254 -2.4614 2.7304 +v -1.0813 -2.4696 2.8878 +v -0.7977 -2.4645 2.7939 +v -1.0697 -2.3062 2.5679 +v -0.7879 -2.3010 2.4709 +v -0.7800 -2.1359 2.1669 +v -1.0607 -2.1412 2.2672 +v -2.0385 -2.5001 3.3794 +v -2.0309 -2.3382 3.0784 +v -1.6871 -2.3244 2.8686 +v -1.6979 -2.4870 3.1778 +v -2.0257 -2.0094 2.5354 +v -2.0266 -2.1746 2.7969 +v -1.6752 -1.9945 2.3095 +v -1.6796 -2.1601 2.5790 +v -1.3591 -2.1492 2.4035 +v -1.3530 -1.9832 2.1277 +v -1.3681 -2.3139 2.6994 +v -1.3801 -2.4769 3.0148 +v -2.0280 -1.8431 2.2943 +v -2.0335 -1.6761 2.0740 +v -1.6760 -1.6609 1.8329 +v -1.6741 -1.8279 2.0606 +v -2.0421 -1.5087 1.8749 +v -1.6811 -1.4937 1.6267 +v -1.3520 -1.4823 1.4266 +v -1.3495 -1.6493 1.6387 +v -1.3498 -1.8164 1.8726 +v 5.7868 -2.9039 6.9550 +v 5.3747 -2.8671 6.5017 +v 5.4647 -2.7209 6.3057 +v 5.8939 -2.7589 6.7745 +v 4.9477 -2.8321 6.0619 +v 5.0205 -2.6845 5.8491 +v 5.0930 -2.5329 5.6524 +v 5.5531 -2.5703 6.1250 +v 5.9984 -2.6089 6.6087 +v 4.0729 -2.7690 5.2391 +v 4.1136 -2.6177 4.9910 +v 4.5680 -2.6500 5.4094 +v 4.5117 -2.7994 5.6397 +v 4.1556 -2.4630 4.7603 +v 4.6249 -2.4970 5.1957 +v 4.2430 -2.1441 4.3498 +v 4.7391 -2.1799 4.8169 +v 4.6821 -2.3402 4.9984 +v 4.1989 -2.3051 4.5466 +v 5.2353 -2.2172 5.3046 +v 5.1648 -2.3771 5.4711 +v 6.1979 -2.2939 6.3182 +v 6.0999 -2.4539 6.4569 +v 5.6397 -2.4152 5.9591 +v 5.7241 -2.2554 5.8071 +v 3.6374 -2.7412 4.8640 +v 3.6636 -2.5878 4.5985 +v 3.2112 -2.7161 4.5185 +v 3.2247 -2.5608 4.2366 +v 3.2409 -2.4028 3.9731 +v 3.6920 -2.4315 4.3510 +v 2.4112 -2.6752 3.9323 +v 2.4056 -2.5167 3.6224 +v 2.8032 -2.5370 3.9097 +v 2.8005 -2.6941 4.2066 +v 2.4035 -2.3558 3.3317 +v 2.8091 -2.3775 3.6317 +v 2.4090 -2.0284 2.8087 +v 2.8299 -2.0520 3.1328 +v 2.8180 -2.2157 3.3727 +v 2.4046 -2.1929 3.0604 +v 3.2809 -2.0795 3.5017 +v 3.2597 -2.2424 3.7282 +v 3.7224 -2.2723 4.1214 +v 3.7544 -2.1104 3.9094 +v 2.4568 -1.3596 2.0047 +v 2.9037 -1.3824 2.3683 +v 2.8815 -1.5515 2.5299 +v 2.4405 -1.5278 2.1748 +v 3.3859 -1.4087 2.7807 +v 3.3569 -1.5790 2.9333 +v 3.3297 -1.7477 3.1043 +v 2.8618 -1.7196 2.7113 +v 2.4270 -1.6955 2.3656 +v 4.4226 -1.4693 3.7236 +v 4.3778 -1.6424 3.8566 +v 3.8584 -1.6095 3.3778 +v 3.8950 -1.4379 3.2349 +v 4.3327 -1.8127 4.0050 +v 3.8227 -1.7789 3.5378 +v 3.7879 -1.9459 3.7149 +v 4.2877 -1.9799 4.1693 +v 3.3043 -1.9146 3.2937 +v 2.4165 -1.8625 2.5770 +v 2.8445 -1.8865 2.9123 +v 4.9601 -1.5020 4.2395 +v 4.9066 -1.6769 4.3625 +v 5.4990 -1.5354 4.7755 +v 5.4367 -1.7123 4.8885 +v 5.3717 -1.8848 5.0140 +v 4.8517 -1.8482 4.4994 +v 6.5476 -1.6012 5.8786 +v 6.4674 -1.7824 5.9729 +v 5.9597 -1.7477 5.4277 +v 6.0310 -1.5687 5.3243 +v 6.3821 -1.9582 6.0770 +v 5.8845 -1.9217 5.5421 +v 5.8058 -2.0909 5.6684 +v 6.2921 -2.1287 6.1919 +v 5.3044 -2.0531 5.1525 +v 4.7958 -2.0159 4.6507 +v 8.5187 -3.1028 14.6532 +v 8.6327 -3.0268 14.7425 +v 8.4663 -3.0743 15.0557 +v 8.3736 -3.1607 14.8222 +v 8.7831 -2.9151 14.8571 +v 8.5961 -2.9620 15.2403 +v 8.3571 -3.0249 15.5908 +v 8.2430 -3.1428 15.3407 +v 8.1557 -3.2385 15.0437 +v 9.1079 -2.6279 15.0921 +v 8.8912 -2.6738 15.5636 +v 8.7407 -2.8275 15.4092 +v 8.9442 -2.7810 14.9756 +v 8.6228 -2.7308 16.0010 +v 8.4865 -2.8870 15.8087 +v 7.9530 -2.8646 16.7607 +v 7.8466 -3.0283 16.4985 +v 8.1867 -2.9553 16.1723 +v 8.3082 -2.7955 16.4011 +v 7.7467 -3.1746 16.2042 +v 8.0721 -3.0974 15.9129 +v 7.5863 -3.4099 15.5003 +v 7.8909 -3.3230 15.2749 +v 7.9713 -3.2204 15.6161 +v 7.6582 -3.3021 15.8731 +v 9.2662 -2.4590 15.2008 +v 9.0386 -2.5036 15.7044 +v 9.4168 -2.2761 15.3021 +v 9.1800 -2.3188 15.8329 +v 8.8886 -2.3704 16.3309 +v 8.7579 -2.5580 16.1744 +v 9.6853 -1.8754 15.4850 +v 9.4334 -1.9127 16.0587 +v 9.3125 -2.1212 15.9506 +v 9.5573 -2.0810 15.3967 +v 9.1241 -1.9574 16.6008 +v 9.0117 -2.1696 16.4724 +v 8.3588 -2.0604 17.5630 +v 8.2669 -2.2813 17.3943 +v 8.6610 -2.2237 16.9558 +v 8.7637 -2.0073 17.1046 +v 8.1665 -2.4898 17.2061 +v 8.5487 -2.4282 16.7905 +v 8.4300 -2.6193 16.6064 +v 8.0607 -2.6847 16.9957 +v 6.4231 -2.2604 18.8041 +v 6.3812 -2.4986 18.5721 +v 6.8865 -2.4509 18.3769 +v 6.9415 -2.2165 18.5966 +v 6.3355 -2.7224 18.3131 +v 6.8263 -2.6713 18.1313 +v 7.2992 -2.6139 17.8822 +v 7.3734 -2.3972 18.1112 +v 7.4412 -2.1671 18.3160 +v 6.2408 -3.1238 17.7093 +v 6.7005 -3.0668 17.5558 +v 6.7635 -2.8770 17.8581 +v 6.2880 -2.9311 18.0260 +v 7.1431 -3.0029 17.3432 +v 7.2214 -2.8161 17.6269 +v 7.6558 -2.7512 17.3376 +v 7.5626 -2.9346 17.0764 +v 7.7479 -2.5525 17.5719 +v 7.9158 -2.1143 17.9691 +v 7.8356 -2.3399 17.7816 +v 6.1962 -3.2996 17.3619 +v 6.6401 -3.2401 17.2227 +v 6.1561 -3.4577 16.9824 +v 6.5847 -3.3957 16.8571 +v 6.9968 -3.3262 16.6819 +v 7.0672 -3.1733 17.0289 +v 6.0984 -3.7174 16.1225 +v 6.4994 -3.6504 16.0219 +v 6.5370 -3.5327 16.4574 +v 6.1228 -3.5972 16.5697 +v 6.8848 -3.5755 15.8803 +v 6.9349 -3.4606 16.2998 +v 7.3107 -3.3830 16.1030 +v 7.2490 -3.4947 15.7043 +v 7.3861 -3.2516 16.4624 +v 7.4714 -3.1018 16.7858 +v 2.8011 -2.8484 4.5222 +v 2.4203 -2.8312 4.2609 +v 3.2007 -2.8685 4.8188 +v 3.1942 -3.0175 5.1377 +v 2.8056 -2.9996 4.8565 +v 2.4332 -2.9841 4.6084 +v 4.0340 -2.9169 5.5049 +v 3.6136 -2.8914 5.1476 +v 3.9983 -3.0607 5.7877 +v 3.5935 -3.0379 5.4491 +v 3.9430 -3.3328 6.4017 +v 3.5698 -3.3172 6.1055 +v 3.5785 -3.1801 5.7685 +v 3.9675 -3.1996 6.0869 +v 3.1970 -3.3032 5.8312 +v 3.1926 -3.1626 5.4752 +v 2.4720 -3.2791 5.3598 +v 2.4503 -3.1336 4.9747 +v 2.8148 -3.1471 5.2097 +v 2.8294 -3.2905 5.5818 +v 4.4563 -2.9451 5.8873 +v 4.8747 -2.9757 6.2915 +v 4.8033 -3.1140 6.5349 +v 4.4033 -3.0861 6.1505 +v 5.6775 -3.0442 7.1512 +v 5.2837 -3.0088 6.7139 +v 5.5670 -3.1781 7.3578 +v 5.1929 -3.1446 6.9382 +v 5.3456 -3.4203 7.7821 +v 5.0170 -3.3926 7.4072 +v 5.1036 -3.2730 7.1706 +v 5.4561 -3.3040 7.5698 +v 4.6708 -3.3694 7.0524 +v 4.7348 -3.2456 6.7894 +v 4.3545 -3.2213 6.4277 +v 4.3114 -3.3498 6.7173 +v 4.9681 -3.7460 8.4781 +v 4.7961 -3.7588 8.3644 +v 4.8073 -3.6843 8.1100 +v 5.0384 -3.6941 8.3553 +v 4.5514 -3.7736 8.2051 +v 4.5434 -3.6857 7.8898 +v 4.5680 -3.5895 7.5988 +v 4.8624 -3.5994 7.8789 +v 5.1329 -3.6176 8.1836 +v 3.9599 -3.7982 7.8332 +v 3.9312 -3.6924 7.4451 +v 4.2487 -3.6891 7.6674 +v 4.2691 -3.7871 8.0251 +v 3.9212 -3.5794 7.0786 +v 4.2527 -3.5836 7.3330 +v 4.2755 -3.4705 7.0177 +v 3.9263 -3.4594 6.7316 +v 4.6128 -3.4840 7.3209 +v 5.2367 -3.5256 7.9896 +v 4.9344 -3.5018 7.6440 +v 3.6341 -3.8059 7.6380 +v 3.5989 -3.6936 7.2252 +v 3.2971 -3.8107 7.4452 +v 3.2573 -3.6930 7.0126 +v 3.2281 -3.5689 6.5996 +v 3.5779 -3.5744 6.8329 +v 2.6116 -3.8135 7.0886 +v 2.5681 -3.6879 6.6281 +v 2.9119 -3.6910 6.8119 +v 2.9545 -3.8131 7.2601 +v 2.5305 -3.5567 6.1865 +v 2.8772 -3.5629 6.3828 +v 2.8500 -3.4293 5.9728 +v 2.4986 -3.4203 5.7637 +v 3.2084 -3.4388 6.2059 +v 3.5689 -3.4488 6.4599 +v 2.9783 -4.4564 11.3096 +v 3.3597 -4.4271 11.4173 +v 3.3738 -4.4357 11.9872 +v 2.9889 -4.4662 11.8794 +v 3.7418 -4.3927 11.5225 +v 3.7600 -4.4004 12.0909 +v 3.7637 -4.3905 12.6640 +v 3.3743 -4.4257 12.5597 +v 2.9872 -4.4566 12.4497 +v 4.4994 -4.3066 11.7056 +v 4.5281 -4.3133 12.2676 +v 4.1455 -4.3597 12.1859 +v 4.1224 -4.3526 11.6203 +v 4.5405 -4.3045 12.8378 +v 4.1531 -4.3502 12.7582 +v 4.5274 -4.2385 13.9791 +v 4.1315 -4.2803 13.8994 +v 4.1477 -4.3238 13.3312 +v 4.5394 -4.2798 13.4104 +v 3.7354 -4.3172 13.8024 +v 3.7548 -4.3628 13.2363 +v 2.9518 -4.3796 13.5730 +v 2.9744 -4.4277 13.0159 +v 3.3630 -4.3972 13.1298 +v 3.3415 -4.3501 13.6922 +v 4.8705 -4.2540 11.7735 +v 4.9057 -4.2607 12.3313 +v 5.2336 -4.1946 11.8192 +v 5.2762 -4.2013 12.3723 +v 5.3008 -4.1946 12.9362 +v 4.9238 -4.2528 12.8986 +v 5.9272 -4.0533 11.8236 +v 5.9874 -4.0606 12.3680 +v 5.6375 -4.1348 12.3861 +v 5.5866 -4.1279 11.8375 +v 6.0277 -4.0563 12.9239 +v 5.6695 -4.1293 12.9461 +v 6.0662 -4.0079 14.0432 +v 5.6926 -4.0766 14.0737 +v 5.6865 -4.1102 13.5108 +v 6.0525 -4.0391 13.4846 +v 5.3102 -4.1374 14.0704 +v 5.3109 -4.1736 13.5043 +v 4.9279 -4.2299 13.4695 +v 4.9211 -4.1911 14.0375 +v 5.6874 -3.7745 16.1757 +v 5.6852 -3.8773 15.6858 +v 6.0849 -3.8173 15.6395 +v 5.2696 -3.8229 16.1861 +v 5.2783 -3.9288 15.6923 +v 5.2903 -4.0159 15.1708 +v 5.6880 -3.9612 15.1678 +v 6.0780 -3.8982 15.1274 +v 4.4256 -3.8988 16.0976 +v 4.4537 -4.0108 15.6034 +v 4.8669 -3.9729 15.6634 +v 4.8480 -3.8640 16.1585 +v 4.4819 -4.1045 15.0817 +v 4.8874 -4.0633 15.1407 +v 4.9065 -4.1358 14.5967 +v 4.5073 -4.1802 14.5382 +v 5.3021 -4.0851 14.6280 +v 6.0732 -3.9613 14.5931 +v 5.6918 -4.0272 14.6282 +v 4.0055 -3.9285 16.0080 +v 4.0415 -4.0436 15.5169 +v 3.5907 -3.9545 15.8946 +v 3.6331 -4.0724 15.4083 +v 3.6726 -4.1721 14.8938 +v 4.0761 -4.1404 14.9980 +v 2.7895 -3.9997 15.6150 +v 2.8383 -4.1225 15.1421 +v 3.2311 -4.0983 15.2819 +v 3.1844 -3.9778 15.7620 +v 2.8824 -4.2268 14.6410 +v 3.2739 -4.2006 14.7734 +v 3.3112 -4.2845 14.2418 +v 2.9207 -4.3126 14.1163 +v 3.7074 -4.2537 14.3567 +v 4.1068 -4.2192 14.4569 +v 8.1561 -3.1655 10.9419 +v 8.3775 -3.0187 10.8369 +v 8.5367 -3.0301 11.3901 +v 8.3060 -3.1768 11.4884 +v 8.5869 -2.8641 10.7474 +v 8.7543 -2.8754 11.3087 +v 8.8817 -2.8813 11.8725 +v 8.6581 -3.0353 11.9445 +v 8.4206 -3.1812 12.0356 +v 8.9687 -2.5322 10.6088 +v 9.1498 -2.5428 11.1894 +v 8.9587 -2.7129 11.2424 +v 8.7840 -2.7019 10.6719 +v 9.2871 -2.5494 11.7764 +v 9.0914 -2.7193 11.8173 +v 9.4252 -2.5587 12.9439 +v 9.2280 -2.7250 12.9502 +v 9.1814 -2.7228 12.3891 +v 9.3793 -2.5541 12.3634 +v 9.0170 -2.8823 12.9725 +v 8.9693 -2.8831 12.4301 +v 8.5514 -3.1708 13.0897 +v 8.5018 -3.1790 12.5729 +v 8.7428 -3.0352 12.4901 +v 8.7916 -3.0308 13.0170 +v 9.1408 -2.3550 10.5567 +v 9.3275 -2.3651 11.1480 +v 9.3001 -2.1705 10.5140 +v 9.4917 -2.1799 11.1163 +v 9.6366 -2.1864 11.7281 +v 9.4689 -2.3717 11.7474 +v 9.5800 -1.7800 10.4510 +v 9.7791 -1.7878 11.0749 +v 9.6423 -1.9875 11.0925 +v 9.4466 -1.9788 10.4793 +v 9.9294 -1.7935 11.7108 +v 9.7901 -1.9936 11.7166 +v 10.0749 -1.8050 12.9975 +v 9.9341 -2.0057 12.9765 +v 9.8881 -1.9991 12.3463 +v 10.0287 -1.7987 12.3534 +v 9.7786 -2.1985 12.9591 +v 9.7329 -2.1919 12.3442 +v 9.5632 -2.3770 12.3491 +v 9.6089 -2.3830 12.9475 +v 9.7398 -2.0511 14.8171 +v 9.8732 -1.8477 14.8869 +v 9.5931 -2.2448 14.7442 +v 9.7108 -2.2229 14.1643 +v 9.8621 -2.0299 14.2171 +v 9.9994 -1.8278 14.2695 +v 9.2671 -2.5966 14.5900 +v 9.4349 -2.4272 14.6684 +v 9.3715 -2.5768 14.0616 +v 9.5468 -2.4056 14.1121 +v 9.6041 -2.3917 13.5368 +v 9.4234 -2.5652 13.5114 +v 9.7720 -2.2081 13.5675 +v 10.0659 -1.8142 13.6379 +v 9.9262 -2.0153 13.6018 +v 9.0917 -2.7517 14.5093 +v 8.9125 -2.8907 14.4366 +v 8.9909 -2.8815 13.9807 +v 9.1861 -2.7353 14.0138 +v 8.5459 -3.1197 14.3913 +v 8.7337 -3.0121 14.3826 +v 8.5677 -3.1394 14.0145 +v 8.7858 -3.0156 13.9741 +v 8.8055 -3.0231 13.5153 +v 8.5715 -3.1570 13.5754 +v 9.0249 -2.8803 13.4910 +v 9.2306 -2.7278 13.4929 +v 5.6986 -3.6517 16.6309 +v 5.7172 -3.5097 17.0524 +v 5.2719 -3.5530 17.0725 +v 5.2678 -3.6975 16.6459 +v 5.7700 -3.1711 17.7984 +v 5.7416 -3.3492 17.4412 +v 5.2930 -3.2099 17.8300 +v 5.2806 -3.3903 17.4669 +v 4.3400 -3.2669 17.7473 +v 4.3575 -3.4514 17.3820 +v 4.8178 -3.4239 17.4452 +v 4.8147 -3.2415 17.8107 +v 4.3775 -3.6185 16.9859 +v 4.8240 -3.5889 17.0485 +v 4.8339 -3.7358 16.6199 +v 4.4002 -3.7678 16.5581 +v 5.8010 -2.9760 18.1250 +v 5.8328 -2.7647 18.4221 +v 5.3242 -2.7991 18.4658 +v 5.3079 -3.0126 18.1627 +v 5.8926 -2.2966 18.9314 +v 5.8639 -2.5380 18.6905 +v 5.3565 -2.3259 18.9873 +v 5.3407 -2.5700 18.7404 +v 4.2942 -2.3673 18.9192 +v 4.3021 -2.6155 18.6678 +v 4.8180 -2.5955 18.7301 +v 4.8215 -2.3493 18.9803 +v 4.3124 -2.8485 18.3893 +v 4.8154 -2.8267 18.4523 +v 4.8141 -3.0422 18.1462 +v 4.3249 -3.0658 18.0828 +v 2.3953 -2.4038 18.3064 +v 2.4321 -2.6580 18.0648 +v 2.8580 -2.6511 18.2520 +v 2.8253 -2.3984 18.4975 +v 2.4752 -2.8977 17.7985 +v 2.8965 -2.8890 17.9813 +v 3.3471 -2.8786 18.1459 +v 3.3158 -2.6424 18.4205 +v 3.2895 -2.3911 18.6692 +v 2.5749 -3.3311 17.1871 +v 2.9863 -3.3183 17.3597 +v 2.9397 -3.1116 17.6843 +v 2.5233 -3.1222 17.5063 +v 3.4208 -3.3042 17.5151 +v 3.3823 -3.0994 17.8445 +v 3.8459 -3.0845 17.9798 +v 3.8737 -3.2875 17.6465 +v 3.8210 -2.8654 18.2845 +v 3.7813 -2.3810 18.8126 +v 3.7993 -2.6308 18.5618 +v 2.6287 -3.5238 16.8395 +v 3.0352 -3.5088 17.0063 +v 2.6833 -3.6998 16.4625 +v 3.0853 -3.6826 16.6231 +v 3.5042 -3.6641 16.7676 +v 3.4617 -3.4926 17.1565 +v 3.1354 -3.8390 16.2087 +v 2.7373 -3.8586 16.0547 +v 3.5475 -3.8182 16.3474 +v 3.9703 -3.7949 16.4655 +v 3.9363 -3.6431 16.8904 +v 3.9040 -3.4738 17.2838 +v 6.4746 -3.7476 15.5490 +v 6.4578 -3.8258 15.0455 +v 6.8237 -3.7453 14.9293 +v 6.8496 -3.6699 15.4211 +v 6.4286 -3.9305 13.9749 +v 6.4441 -3.8864 14.5185 +v 6.7785 -3.8449 13.8761 +v 6.8018 -3.8032 14.4119 +v 7.4348 -3.6503 13.6167 +v 7.4681 -3.6148 14.1318 +v 7.1440 -3.7124 14.2806 +v 7.1144 -3.7514 13.7542 +v 7.4992 -3.5642 14.6224 +v 7.1721 -3.6578 14.7858 +v 7.2049 -3.5857 15.2628 +v 7.5359 -3.4966 15.0810 +v 6.4066 -3.9597 13.4216 +v 6.3733 -3.9752 12.8654 +v 6.7061 -3.8860 12.7776 +v 6.7483 -3.8721 13.3290 +v 6.2532 -3.9706 11.7725 +v 6.3238 -3.9784 12.3134 +v 6.5651 -3.8797 11.6909 +v 6.6467 -3.8881 12.2292 +v 7.1475 -3.6737 11.4637 +v 7.2526 -3.6833 11.9995 +v 6.9563 -3.7897 12.1223 +v 6.8631 -3.7807 11.5857 +v 7.3321 -3.6834 12.5424 +v 7.0258 -3.7887 12.6676 +v 7.0767 -3.7764 13.2141 +v 7.3911 -3.6728 13.0842 +v 8.0623 -3.3155 11.6054 +v 7.9227 -3.3044 11.0638 +v 8.1691 -3.3189 12.1484 +v 7.9039 -3.4485 12.2754 +v 7.8055 -3.4462 11.7342 +v 7.6770 -3.4355 11.1959 +v 8.2961 -3.3025 13.1966 +v 8.2461 -3.3146 12.6823 +v 8.0252 -3.4261 13.3272 +v 7.9758 -3.4420 12.8097 +v 7.6908 -3.5613 12.9465 +v 7.7382 -3.5420 13.4708 +v 7.6248 -3.5700 12.4092 +v 7.4187 -3.5586 11.3315 +v 7.5357 -3.5687 11.8679 +v 8.3220 -3.2826 13.6810 +v 8.3334 -3.2544 14.1221 +v 8.0792 -3.3625 14.2738 +v 8.0558 -3.4004 13.8182 +v 8.3399 -3.2172 14.5068 +v 8.1068 -3.3102 14.6852 +v 7.8377 -3.4040 14.8825 +v 7.8014 -3.4658 14.4461 +v 7.7716 -3.5110 13.9731 +v 6.9033 -0.0124 5.4959 +v 7.4253 -0.0130 6.0802 +v 7.4180 -0.2228 6.0864 +v 6.8964 -0.2179 5.5026 +v 7.9192 -0.0138 6.6660 +v 7.9115 -0.2273 6.6716 +v 7.8894 -0.4403 6.6880 +v 7.3970 -0.4319 6.1045 +v 6.8766 -0.4229 5.5221 +v 8.8104 -0.0154 7.8529 +v 8.8020 -0.2354 7.8571 +v 8.3739 -0.2316 7.2609 +v 8.3820 -0.0146 7.2559 +v 8.7777 -0.4549 7.8696 +v 8.3507 -0.4480 7.2754 +v 8.6849 -0.8890 7.9184 +v 8.2621 -0.8760 7.3316 +v 8.3131 -0.6631 7.2991 +v 8.7384 -0.6730 7.8901 +v 7.8055 -0.8615 6.7510 +v 7.8537 -0.6520 6.7146 +v 6.8029 -0.8283 5.5975 +v 6.8451 -0.6265 5.5539 +v 7.3634 -0.6398 6.1338 +v 7.3181 -0.8455 6.1739 +v 9.2012 -0.0161 8.4596 +v 9.1925 -0.2387 8.4631 +v 9.5512 -0.0167 9.0789 +v 9.5423 -0.2415 9.0815 +v 9.5163 -0.4660 9.0895 +v 9.1673 -0.4609 8.4734 +v 10.1165 -0.0172 10.3664 +v 10.1072 -0.2454 10.3671 +v 9.8483 -0.2438 9.7153 +v 9.8574 -0.0171 9.7135 +v 10.0801 -0.4733 10.3699 +v 9.8217 -0.4701 9.7207 +v 9.9751 -0.9241 10.3828 +v 9.7188 -0.9180 9.7436 +v 9.7782 -0.6952 9.7300 +v 10.0359 -0.6998 10.3749 +v 9.4162 -0.9101 9.1216 +v 9.4741 -0.6892 9.1028 +v 9.1264 -0.6817 8.4904 +v 9.0706 -0.9004 8.5141 +v 9.3343 -1.7682 9.8441 +v 9.4510 -1.5637 9.8115 +v 9.7003 -1.5741 10.4276 +v 9.0449 -1.7528 9.2521 +v 9.1572 -1.5501 9.2110 +v 9.2570 -1.3415 9.1756 +v 9.5544 -1.3532 9.7841 +v 9.8066 -1.3622 10.4087 +v 8.3460 -1.7124 8.1029 +v 8.4477 -1.5144 8.0466 +v 8.8218 -1.5336 8.6235 +v 8.7145 -1.7341 8.6725 +v 8.5387 -1.3105 7.9968 +v 8.9175 -1.3272 8.5808 +v 9.0007 -1.1158 8.5442 +v 8.6180 -1.1018 7.9540 +v 9.3436 -1.1279 9.1458 +v 9.8984 -1.1453 10.3940 +v 9.6439 -1.1377 9.7615 +v 7.9422 -1.6880 7.5411 +v 8.0378 -1.4926 7.4776 +v 7.5060 -1.6611 6.9847 +v 7.5950 -1.4686 6.9141 +v 7.6752 -1.2706 6.8512 +v 8.1236 -1.2916 7.4212 +v 6.6223 -1.4145 5.7934 +v 7.1222 -1.4425 6.3535 +v 7.0402 -1.6321 6.4313 +v 6.6904 -1.2229 5.7178 +v 7.1965 -1.2476 6.2843 +v 7.2621 -1.0484 6.2243 +v 6.7510 -1.0273 5.6523 +v 7.7457 -1.0679 6.7967 +v 8.1987 -1.0858 7.3724 +v 2.3568 -3.8782 15.8904 +v 2.4091 -4.0213 15.4582 +v 2.3022 -3.7171 16.2914 +v 1.9394 -3.7338 16.1176 +v 1.9917 -3.8971 15.7235 +v 2.0413 -4.0422 15.2988 +v 2.1916 -3.3436 17.0040 +v 2.2466 -3.5387 16.6622 +v 1.8329 -3.3555 16.8186 +v 1.8859 -3.5530 16.4823 +v 1.1751 -3.3762 16.4736 +v 1.2166 -3.5785 16.1471 +v 1.5436 -3.5665 16.3079 +v 1.4952 -3.3665 16.6390 +v 1.2581 -3.7636 15.7933 +v 1.5922 -3.7495 15.9490 +v 1.3367 -4.0788 15.0011 +v 1.6845 -4.0615 15.1441 +v 1.6396 -3.9148 15.5613 +v 1.2986 -3.9307 15.4115 +v 2.1386 -3.1323 17.3179 +v 2.0890 -2.9056 17.6052 +v 1.7335 -2.9127 17.4100 +v 1.7816 -3.1418 17.1275 +v 2.0064 -2.4080 18.1043 +v 2.0445 -2.6640 17.8670 +v 1.6532 -2.4112 17.9003 +v 1.6903 -2.6689 17.6673 +v 1.0339 -2.4151 17.5216 +v 1.0631 -2.6763 17.2969 +v 1.3648 -2.6731 17.4744 +v 1.3308 -2.4135 17.7031 +v 1.0972 -2.9242 17.0478 +v 1.4044 -2.9189 17.2214 +v 1.4483 -3.1503 16.9432 +v 1.1349 -3.1578 16.7736 +v 0.2538 -2.6815 16.9434 +v 0.2457 -2.4169 17.1601 +v 0.2633 -2.9334 16.7019 +v 0.5310 -2.9315 16.7796 +v 0.5124 -2.6805 17.0227 +v 0.4965 -2.4167 17.2412 +v 0.2850 -3.3947 16.1433 +v 0.2738 -3.1716 16.4353 +v 0.5735 -3.3906 16.2175 +v 0.5516 -3.1686 16.5113 +v 0.8373 -3.1640 16.6268 +v 0.8690 -3.3844 16.3303 +v 0.8075 -2.9284 16.8977 +v 0.7575 -2.4162 17.3647 +v 0.7806 -2.6788 17.1434 +v 0.2965 -3.6014 15.8255 +v 0.3080 -3.7907 15.4818 +v 0.6186 -3.7847 15.5519 +v 0.5961 -3.5964 15.8979 +v 0.3296 -4.1117 14.7150 +v 0.3192 -3.9612 15.1117 +v 0.6611 -4.1045 14.7794 +v 0.6405 -3.9545 15.1792 +v 0.9663 -3.9441 15.2817 +v 0.9962 -4.0933 14.8772 +v 0.9344 -3.7755 15.6583 +v 0.9017 -3.5886 16.0077 +v 2.0640 -2.8169 4.0386 +v 2.0495 -2.6598 3.6996 +v 2.0822 -2.9710 4.3963 +v 1.7499 -2.9602 4.2185 +v 1.7293 -2.8053 3.8530 +v 1.7119 -2.6474 3.5061 +v 2.1298 -3.2690 5.1680 +v 2.1041 -3.1219 4.7728 +v 1.8009 -3.2601 5.0054 +v 1.7738 -3.1119 4.6026 +v 1.1753 -3.2462 4.7631 +v 1.1521 -3.0971 4.3515 +v 1.4572 -3.1037 4.4627 +v 1.4833 -3.2525 4.8708 +v 1.1309 -2.9447 3.9582 +v 1.4337 -2.9515 4.0731 +v 1.0953 -2.6307 3.2265 +v 1.3950 -2.6378 3.3492 +v 1.4129 -2.7961 3.7019 +v 1.1119 -2.7891 3.5833 +v 2.1595 -3.4120 5.5820 +v 2.1934 -3.5505 6.0146 +v 1.8646 -3.5443 5.8668 +v 1.8312 -3.4043 5.4268 +v 2.2739 -3.8124 6.9360 +v 2.2315 -3.6841 6.4660 +v 1.9407 -3.8102 6.8028 +v 1.9011 -3.6797 6.3255 +v 1.2852 -3.8040 6.5957 +v 1.2555 -3.6708 6.1094 +v 1.5760 -3.6752 6.2066 +v 1.6113 -3.8073 6.6893 +v 1.2272 -3.5332 5.6420 +v 1.5429 -3.5385 5.7427 +v 1.5119 -3.3975 5.2974 +v 1.2004 -3.3916 5.1933 +v 0.3116 -3.6614 5.9475 +v 0.3197 -3.7960 6.4376 +v 0.3038 -3.5230 5.4765 +v 0.6088 -3.5252 5.5092 +v 0.6242 -3.6635 5.9798 +v 0.6400 -3.7980 6.4696 +v 0.2891 -3.2355 4.5909 +v 0.2963 -3.3810 5.0244 +v 0.5801 -3.2376 4.6243 +v 0.5941 -3.3832 5.0574 +v 0.8949 -3.3868 5.1135 +v 0.8748 -3.2412 4.6813 +v 0.9162 -3.5287 5.5643 +v 0.9616 -3.8008 6.5223 +v 0.9385 -3.6668 6.0338 +v 0.2823 -3.0866 4.1759 +v 0.2760 -2.9344 3.7790 +v 0.5547 -2.9363 3.8130 +v 0.5669 -3.0886 4.2095 +v 0.2652 -2.6209 3.0386 +v 0.2703 -2.7792 3.4000 +v 0.5339 -2.6225 3.0737 +v 0.5437 -2.7809 3.4345 +v 0.8232 -2.7842 3.4948 +v 0.8094 -2.6257 3.1355 +v 0.8388 -2.9397 3.8722 +v 0.8561 -3.0921 4.2676 +v 2.6076 -4.4923 11.7721 +v 2.5998 -4.4810 11.2043 +v 2.6044 -4.4836 12.3383 +v 2.2253 -4.5067 12.2294 +v 2.2294 -4.5143 11.6685 +v 2.2237 -4.5012 11.1042 +v 2.5686 -4.4066 13.4490 +v 2.5910 -4.4549 12.8988 +v 2.1911 -4.4308 13.3250 +v 2.2123 -4.4788 12.7829 +v 1.4499 -4.4697 13.0977 +v 1.4660 -4.5162 12.5725 +v 1.8375 -4.4993 12.6727 +v 1.8185 -4.4519 13.2063 +v 1.4764 -4.5419 12.0341 +v 1.8495 -4.5261 12.1267 +v 1.4777 -4.5299 10.9304 +v 1.8498 -4.5174 11.0120 +v 1.8538 -4.5322 11.5720 +v 1.4804 -4.5465 11.4856 +v 2.5382 -4.3388 13.9844 +v 2.5008 -4.2519 14.5007 +v 2.1276 -4.2753 14.3589 +v 2.1626 -4.3628 13.8517 +v 2.4574 -4.1460 14.9935 +v 2.0869 -4.1683 14.8426 +v 1.3714 -4.2069 14.5613 +v 1.7254 -4.1888 14.6963 +v 1.4021 -4.3149 14.0953 +v 1.7618 -4.2964 14.2217 +v 1.7931 -4.3842 13.7238 +v 1.4285 -4.4025 13.6063 +v 0.3391 -4.2410 14.2913 +v 0.3475 -4.3490 13.8432 +v 0.6962 -4.3417 13.8998 +v 0.6797 -4.2336 14.3521 +v 0.3605 -4.5011 12.8832 +v 0.3546 -4.4357 13.3730 +v 0.7217 -4.4945 12.9311 +v 0.7103 -4.4287 13.4253 +v 1.0679 -4.4175 13.5050 +v 1.0846 -4.4840 13.0043 +v 1.0473 -4.3301 13.9859 +v 1.0233 -4.2220 14.4443 +v 0.3649 -4.5450 12.3761 +v 0.3677 -4.5676 11.8543 +v 0.7360 -4.5625 11.8941 +v 0.7304 -4.5392 12.4198 +v 0.3685 -4.5484 10.7762 +v 0.3690 -4.5687 11.3202 +v 0.7374 -4.5450 10.8097 +v 0.7384 -4.5645 11.3565 +v 1.1088 -4.5571 11.4127 +v 1.1070 -4.5390 10.8620 +v 1.1054 -4.5540 11.9553 +v 1.0972 -4.5295 12.4867 +v 2.5821 -0.0108 1.3799 +v 2.5785 -0.1796 1.3893 +v 2.1545 -0.1767 1.0540 +v 2.1576 -0.0108 1.0442 +v 2.5690 -0.3484 1.4177 +v 2.1462 -0.3426 1.0838 +v 1.7640 -0.3380 0.8038 +v 1.7711 -0.1744 0.7726 +v 1.7738 -0.0108 0.7623 +v 2.5372 -0.6858 1.5329 +v 2.1189 -0.6747 1.2042 +v 2.1339 -0.5086 1.1337 +v 2.5548 -0.5171 1.4655 +v 1.7411 -0.6659 0.9297 +v 1.7537 -0.5018 0.8560 +v 1.0837 -0.6544 0.5301 +v 1.0918 -0.4930 0.4508 +v 1.4082 -0.4967 0.6294 +v 1.3979 -0.6592 0.7060 +v 1.0985 -0.3320 0.3942 +v 1.4168 -0.3345 0.5749 +v 1.1050 -0.0108 0.3491 +v 1.4249 -0.0108 0.5315 +v 1.4226 -0.1726 0.5423 +v 1.1032 -0.1713 0.3603 +v 2.5173 -0.8544 1.6202 +v 2.1022 -0.8410 1.2956 +v 2.4964 -1.0229 1.7277 +v 2.0850 -1.0075 1.4080 +v 1.7133 -0.9953 1.1419 +v 1.7273 -0.8304 1.0249 +v 2.0538 -1.3413 1.6973 +v 2.0685 -1.1742 1.5418 +v 2.4759 -1.1913 1.8558 +v 1.6892 -1.3269 1.4426 +v 1.7002 -1.1608 1.2811 +v 1.0530 -1.3080 1.0766 +v 1.0589 -1.1431 0.9055 +v 1.3656 -1.1505 1.0701 +v 1.3574 -1.3159 1.2369 +v 1.0665 -0.9793 0.7574 +v 1.3757 -0.9860 0.9262 +v 1.3868 -0.8223 0.8049 +v 1.0750 -0.8165 0.6323 +v 0.2507 -1.1335 0.6543 +v 0.2496 -1.2977 0.8333 +v 0.2524 -0.9706 0.4986 +v 0.5105 -0.9719 0.5469 +v 0.5071 -1.1350 0.7010 +v 0.5046 -1.2993 0.8784 +v 0.2565 -0.6481 0.2578 +v 0.2544 -0.8088 0.3663 +v 0.5187 -0.6491 0.3091 +v 0.5145 -0.8100 0.4163 +v 0.7861 -0.8125 0.5038 +v 0.7925 -0.6511 0.3988 +v 0.7800 -0.9747 0.6321 +v 0.7706 -1.3026 0.9583 +v 0.7746 -1.1380 0.7836 +v 0.2584 -0.4881 0.1730 +v 0.2601 -0.3287 0.1123 +v 0.5260 -0.3292 0.1658 +v 0.5227 -0.4889 0.2256 +v 0.2617 -0.0108 0.0635 +v 0.2613 -0.1696 0.0757 +v 0.5293 -0.0108 0.1178 +v 0.5283 -0.1699 0.1298 +v 0.8071 -0.1704 0.2238 +v 0.8084 -0.0108 0.2121 +v 0.8036 -0.3303 0.2588 +v 0.7985 -0.4904 0.3172 +v 0.3279 -3.9268 6.9472 +v 0.6562 -3.9284 6.9785 +v 0.6722 -4.0526 7.5036 +v 0.3360 -4.0515 7.4729 +v 1.3161 -3.9327 7.1008 +v 0.9854 -3.9305 7.0299 +v 1.3471 -4.0548 7.6221 +v 1.0092 -4.0539 7.5536 +v 1.4054 -4.2706 8.7017 +v 1.0533 -4.2728 8.6369 +v 1.0321 -4.1687 8.0903 +v 1.3772 -4.1681 8.1566 +v 0.7019 -4.2737 8.5889 +v 0.6876 -4.1684 8.0415 +v 0.3437 -4.1679 8.0113 +v 0.3508 -4.2738 8.5590 +v 1.6485 -3.9345 7.1907 +v 1.9833 -3.9354 7.2988 +v 2.0272 -4.0534 7.8112 +v 1.6863 -4.0548 7.7083 +v 2.6615 -3.9329 7.5678 +v 2.3208 -3.9350 7.4247 +v 2.7152 -4.0446 8.0643 +v 2.3701 -4.0502 7.9302 +v 2.8242 -4.2378 9.1019 +v 2.4675 -4.2507 8.9834 +v 2.4197 -4.1560 8.4504 +v 2.7703 -4.1468 8.5762 +v 2.1123 -4.2601 8.8763 +v 2.0708 -4.1623 8.3378 +v 1.7234 -4.1662 8.2395 +v 1.7584 -4.2666 8.7819 +v 2.5797 -4.4494 10.6397 +v 2.9540 -4.4270 10.7453 +v 2.2075 -4.4673 10.5406 +v 2.1824 -4.4146 9.9799 +v 2.5496 -4.3992 10.0800 +v 2.9186 -4.3796 10.1882 +v 1.4678 -4.4919 10.3715 +v 1.8369 -4.4814 10.4505 +v 1.4518 -4.4346 9.8119 +v 1.8165 -4.4262 9.8899 +v 1.7898 -4.3539 9.3329 +v 1.4306 -4.3601 9.2544 +v 2.1501 -4.3448 9.4244 +v 2.8745 -4.3160 9.6398 +v 2.5115 -4.3324 9.5272 +v 1.0999 -4.4993 10.3061 +v 0.7328 -4.5040 10.2563 +v 0.7249 -4.4437 9.6996 +v 1.0880 -4.4402 9.7478 +v 0.3662 -4.5065 10.2247 +v 0.3624 -4.4453 9.6691 +v 0.3571 -4.3670 9.1128 +v 0.7145 -4.3661 9.1427 +v 1.0722 -4.3640 9.1904 +v 3.0059 -3.9286 7.7275 +v 3.3489 -3.9216 7.8977 +v 3.4090 -4.0242 8.3690 +v 3.0630 -4.0361 8.2127 +v 4.0109 -3.8968 8.2452 +v 3.6856 -3.9111 8.0723 +v 4.0782 -3.9871 8.6799 +v 3.7489 -4.0080 8.5269 +v 4.2370 -4.1396 9.6135 +v 3.8920 -4.1725 9.4928 +v 3.8192 -4.0955 9.0007 +v 4.1556 -4.0683 9.1363 +v 3.5395 -4.1994 9.3630 +v 3.4738 -4.1172 8.8578 +v 3.1229 -4.1341 8.7142 +v 3.1826 -4.2209 9.2306 +v 4.3198 -3.8778 8.4102 +v 4.6042 -3.8541 8.5556 +v 4.6875 -3.9274 8.9396 +v 4.3926 -3.9606 8.8217 +v 5.0682 -3.7841 8.7140 +v 4.8558 -3.8251 8.6692 +v 5.2010 -3.8333 9.0472 +v 4.9583 -3.8859 9.0211 +v 5.4835 -3.9315 9.8566 +v 5.1974 -3.9971 9.8491 +v 5.0756 -3.9440 9.4169 +v 5.3422 -3.8836 9.4317 +v 4.8925 -4.0530 9.8003 +v 4.7869 -3.9940 9.3555 +v 4.4792 -4.0349 9.2583 +v 4.5714 -4.1001 9.7189 +v 5.5128 -4.1096 11.3068 +v 5.8426 -4.0356 11.2974 +v 5.1695 -4.1754 11.2831 +v 5.0883 -4.1447 10.7664 +v 5.4204 -4.0810 10.7967 +v 5.7378 -4.0087 10.7922 +v 4.4517 -4.2847 11.1578 +v 4.8151 -4.2336 11.2317 +v 4.3893 -4.2489 10.6257 +v 4.7438 -4.2005 10.7074 +v 4.6611 -4.1557 10.2026 +v 4.3163 -4.2002 10.1104 +v 4.9944 -4.1036 10.2714 +v 5.6168 -3.9736 10.3110 +v 5.3138 -4.0431 10.3099 +v 4.0817 -4.3291 11.0669 +v 3.7072 -4.3674 10.9643 +v 3.6597 -4.3258 10.4175 +v 4.0271 -4.2905 10.5271 +v 3.3306 -4.3998 10.8553 +v 3.2894 -4.3553 10.3026 +v 3.2390 -4.2952 9.7606 +v 3.6026 -4.2694 9.8833 +v 3.9626 -4.2379 10.0020 +v 5.2346 -3.7245 8.6532 +v 5.3767 -3.6481 8.5232 +v 5.5987 -3.6864 8.8958 +v 5.4113 -3.7665 8.9992 +v 5.6525 -3.4536 8.1772 +v 5.5157 -3.5573 8.3605 +v 5.9372 -3.4904 8.5921 +v 5.7726 -3.5941 8.7558 +v 6.4390 -3.5659 9.4788 +v 6.2230 -3.6720 9.6161 +v 6.0080 -3.6333 9.1746 +v 6.1994 -3.5285 9.0261 +v 5.9936 -3.7685 9.7309 +v 5.8042 -3.7277 9.2993 +v 5.5837 -3.8113 9.3887 +v 5.7480 -3.8552 9.8141 +v 5.7874 -3.3388 7.9854 +v 5.9203 -3.2144 7.7910 +v 6.2512 -3.2523 8.2377 +v 6.0967 -3.3760 8.4172 +v 6.1778 -2.9426 7.4179 +v 6.0505 -3.0818 7.5998 +v 6.5458 -2.9818 7.8904 +v 6.4009 -3.1205 8.0599 +v 7.2045 -3.0574 8.8656 +v 7.0261 -3.1959 9.0147 +v 6.7267 -3.1590 8.5316 +v 6.8887 -3.0205 8.3729 +v 6.8396 -3.3273 9.1712 +v 6.5581 -3.2904 8.6978 +v 6.3826 -3.4139 8.8649 +v 6.6442 -3.4508 9.3282 +v 7.7474 -3.2857 10.5340 +v 7.9689 -3.1468 10.4065 +v 7.5144 -3.4169 10.6704 +v 7.3194 -3.3919 10.1576 +v 7.5383 -3.2606 10.0159 +v 7.7466 -3.1217 9.8822 +v 7.0117 -3.6558 10.9429 +v 7.2693 -3.5403 10.8089 +v 6.8470 -3.6309 10.4380 +v 7.0893 -3.5154 10.3006 +v 6.8803 -3.4851 9.8069 +v 6.6555 -3.6005 9.9497 +v 7.0939 -3.3615 9.6579 +v 7.4911 -3.0916 9.3686 +v 7.2972 -3.2302 9.5095 +v 6.7408 -3.7631 11.0655 +v 6.4560 -3.8623 11.1699 +v 6.3225 -3.8371 10.6683 +v 6.5917 -3.7383 10.5629 +v 6.1568 -3.9532 11.2495 +v 6.0382 -3.9273 10.7471 +v 5.9007 -3.8943 10.2678 +v 6.1673 -3.8054 10.1879 +v 6.4184 -3.7074 10.0793 +v 6.0981 -1.3849 5.2312 +v 5.5585 -1.3543 4.6743 +v 5.6137 -1.1694 4.5854 +v 6.1599 -1.1966 5.1490 +v 4.4668 -1.2932 3.6058 +v 5.0118 -1.3235 4.1301 +v 4.5093 -1.1147 3.5034 +v 5.0606 -1.1419 4.0344 +v 4.5838 -0.7515 3.3449 +v 5.1446 -0.7709 3.8853 +v 5.1053 -0.9575 3.9527 +v 4.5487 -0.9340 3.4164 +v 5.7073 -0.7905 4.4458 +v 5.6637 -0.9813 4.5091 +v 6.2152 -1.0047 5.0781 +v 6.2630 -0.8097 5.0190 +v 3.9321 -1.2642 3.1089 +v 3.4163 -1.2370 2.6467 +v 3.4469 -1.0641 2.5311 +v 3.9685 -1.0886 2.9998 +v 2.9280 -1.2125 2.2266 +v 2.9533 -1.0420 2.1046 +v 3.0016 -0.6995 1.9186 +v 2.9783 -0.8710 2.0020 +v 3.5035 -0.7154 2.3542 +v 3.4764 -0.8902 2.4336 +v 4.0028 -0.9114 2.9075 +v 4.0339 -0.7329 2.8321 +v 3.0531 -0.0108 1.7723 +v 3.0491 -0.1832 1.7813 +v 3.5618 -0.0108 2.2141 +v 3.5573 -0.1874 2.2228 +v 3.5452 -0.3638 2.2489 +v 3.0383 -0.3555 1.8085 +v 4.6561 -0.0110 3.2169 +v 4.6508 -0.1970 3.2250 +v 4.0942 -0.1920 2.7064 +v 4.0990 -0.0109 2.6981 +v 4.6361 -0.3827 3.2491 +v 4.0808 -0.3729 2.7315 +v 4.0603 -0.5533 2.7734 +v 4.6134 -0.5676 3.2891 +v 3.5269 -0.5398 2.2927 +v 3.0221 -0.5276 1.8542 +v 5.2239 -0.0112 3.7633 +v 5.2182 -0.2022 3.7711 +v 5.7937 -0.0115 4.3302 +v 5.7876 -0.2075 4.3376 +v 5.7704 -0.4030 4.3596 +v 5.2023 -0.3928 3.7942 +v 6.3499 -0.2128 4.9172 +v 6.3565 -0.0119 4.9101 +v 6.3314 -0.4131 4.9380 +v 6.3021 -0.6123 4.9721 +v 5.7432 -0.5975 4.3958 +v 5.1773 -0.5825 3.8323 +v 6.9887 -1.9692 18.7921 +v 6.4590 -2.0087 19.0103 +v 7.4996 -1.9247 18.4985 +v 7.5490 -1.6714 18.6584 +v 7.0284 -1.7105 18.9630 +v 6.4892 -1.7452 19.1904 +v 8.4386 -1.8284 17.7148 +v 7.9852 -1.8771 18.1370 +v 8.5068 -1.5867 17.8488 +v 8.0441 -1.6295 18.2844 +v 8.6094 -1.0799 18.0605 +v 8.1322 -1.1095 18.5159 +v 8.0930 -1.3732 18.4109 +v 8.5636 -1.3368 17.9643 +v 7.6223 -1.1385 18.9080 +v 7.5898 -1.4088 18.7951 +v 6.5335 -1.1896 19.4706 +v 6.5139 -1.4716 19.3440 +v 7.0611 -1.4421 19.1087 +v 7.0870 -1.1656 19.2290 +v 8.8533 -1.7805 17.2394 +v 9.2227 -1.7354 16.7181 +v 9.3076 -1.5049 16.8233 +v 8.9302 -1.5446 17.3592 +v 9.7984 -1.6612 15.5677 +v 9.5399 -1.6950 16.1585 +v 9.8965 -1.4395 15.6435 +v 9.6319 -1.4693 16.2488 +v 10.0476 -0.9778 15.7693 +v 9.7731 -0.9985 16.3964 +v 9.7097 -1.2368 16.3285 +v 9.9796 -1.2113 15.7111 +v 9.4371 -1.0232 16.9927 +v 9.3790 -1.2671 16.9151 +v 8.9946 -1.3009 17.4630 +v 9.0468 -1.0507 17.5501 +v 10.1689 -0.0124 15.8825 +v 9.8854 -0.0119 16.5263 +v 9.8784 -0.2613 16.5174 +v 10.1613 -0.2563 15.8746 +v 9.5391 -0.0115 17.1389 +v 9.5328 -0.2674 17.1291 +v 9.5138 -0.5221 17.1007 +v 9.8574 -0.5096 16.4920 +v 10.1386 -0.4992 15.8523 +v 8.6884 -0.0110 18.2375 +v 8.6836 -0.2817 18.2260 +v 9.1320 -0.2743 17.7013 +v 9.1376 -0.0112 17.7120 +v 8.6691 -0.5510 18.1921 +v 9.1152 -0.5361 17.6702 +v 9.0869 -0.7954 17.6195 +v 8.6445 -0.8175 18.1367 +v 9.4820 -0.7745 17.0549 +v 10.1007 -0.7401 15.8168 +v 9.8223 -0.7558 16.4513 +v 8.1991 -0.0109 18.7072 +v 8.1951 -0.2892 18.6949 +v 7.6772 -0.0108 19.1128 +v 7.6740 -0.2966 19.0997 +v 7.6641 -0.5808 19.0609 +v 8.1829 -0.5661 18.6584 +v 6.5661 -0.0108 19.6990 +v 6.5642 -0.3097 19.6844 +v 7.1279 -0.3036 19.4323 +v 7.1304 -0.0108 19.4461 +v 6.5584 -0.6069 19.6413 +v 7.1201 -0.5947 19.3912 +v 7.1066 -0.8825 19.3233 +v 6.5482 -0.9008 19.5699 +v 7.6470 -0.8620 18.9968 +v 8.1620 -0.8400 18.5986 +v 9.9914 -1.6360 14.9533 +v 10.1213 -1.6179 14.3204 +v 10.2278 -1.4011 14.3687 +v 10.0943 -1.4172 15.0150 +v 10.2006 -1.5969 13.0202 +v 10.1903 -1.6054 13.6743 +v 10.3108 -1.3824 13.0433 +v 10.2992 -1.3900 13.7097 +v 10.4832 -0.9380 13.0869 +v 10.4689 -0.9433 13.7729 +v 10.3921 -1.1689 13.7430 +v 10.4052 -1.1624 13.0659 +v 10.3931 -0.9511 14.4522 +v 10.3184 -1.1785 14.4130 +v 10.1817 -1.1923 15.0708 +v 10.2535 -0.9623 15.1194 +v 10.1545 -1.5910 12.3632 +v 10.0543 -1.5863 11.7086 +v 10.1643 -1.3729 11.7093 +v 10.2651 -1.3771 12.3748 +v 9.9021 -1.5812 11.0617 +v 10.0107 -1.3684 11.0522 +v 10.1821 -0.9283 11.0421 +v 10.1042 -1.1504 11.0459 +v 10.3374 -0.9314 11.7161 +v 10.2588 -1.1543 11.7121 +v 10.3600 -1.1579 12.3872 +v 10.4386 -0.9344 12.3995 +v 10.3253 -0.0171 11.0402 +v 10.3160 -0.2464 11.0399 +v 10.4813 -0.0167 11.7295 +v 10.4720 -0.2469 11.7282 +v 10.4445 -0.4768 11.7250 +v 10.2886 -0.4753 11.0398 +v 10.6250 -0.0154 13.1325 +v 10.6159 -0.2478 13.1290 +v 10.5728 -0.2473 12.4263 +v 10.5821 -0.0161 12.4287 +v 10.5890 -0.4798 13.1195 +v 10.5455 -0.4781 12.4200 +v 10.5006 -0.7074 12.4108 +v 10.5446 -0.7101 13.1051 +v 10.3995 -0.7053 11.7207 +v 10.2438 -0.7029 11.0403 +v 10.6077 -0.0146 13.8353 +v 10.5988 -0.2487 13.8306 +v 10.5276 -0.0138 14.5315 +v 10.5191 -0.2503 14.5258 +v 10.4936 -0.4860 14.5098 +v 10.5725 -0.4822 13.8179 +v 10.3741 -0.2527 15.2089 +v 10.3822 -0.0130 15.2158 +v 10.3498 -0.4915 15.1897 +v 10.3096 -0.7284 15.1595 +v 10.4516 -0.7199 14.4848 +v 10.5291 -0.7141 13.7982 +v 2.7994 -2.1314 18.7191 +v 2.3663 -2.1355 18.5245 +v 3.2688 -2.1253 18.8932 +v 3.2531 -1.8469 19.0913 +v 2.7797 -1.8518 18.9153 +v 2.3440 -1.8548 18.7179 +v 4.2885 -2.1047 19.1445 +v 3.7675 -2.1167 19.0380 +v 4.2847 -1.8292 19.3428 +v 3.7571 -1.8396 19.2368 +v 4.2814 -1.2474 19.6546 +v 3.7451 -1.2543 19.5506 +v 3.7499 -1.5515 19.4080 +v 4.2825 -1.5429 19.5131 +v 3.2340 -1.2591 19.4049 +v 3.2417 -1.5575 19.2623 +v 2.3163 -1.2636 19.0251 +v 2.3276 -1.5636 18.8852 +v 2.7653 -1.5614 19.0850 +v 2.7553 -1.2620 19.2267 +v 4.8251 -2.0886 19.2039 +v 5.3703 -2.0677 19.2073 +v 5.3823 -1.7970 19.4000 +v 4.8288 -1.8152 19.4002 +v 5.9172 -2.0413 19.1458 +v 5.9381 -1.7738 19.3331 +v 5.9689 -1.2093 19.6249 +v 5.9552 -1.4959 19.4930 +v 5.4005 -1.2253 19.7008 +v 5.3923 -1.5156 19.5647 +v 4.8323 -1.5311 19.5684 +v 4.8356 -1.2378 19.7077 +v 5.9919 -0.0108 19.8631 +v 5.9905 -0.3148 19.8479 +v 5.4150 -0.0108 19.9475 +v 5.4141 -0.3189 19.9317 +v 5.4114 -0.6252 19.8849 +v 5.9864 -0.6170 19.8028 +v 4.2822 -0.0108 19.9132 +v 4.2819 -0.3245 19.8964 +v 4.8421 -0.3221 19.9449 +v 4.8427 -0.0108 19.9612 +v 4.2815 -0.6364 19.8471 +v 4.8407 -0.6316 19.8967 +v 4.8385 -0.9374 19.8174 +v 4.2812 -0.9446 19.7662 +v 5.4069 -0.9279 19.8078 +v 5.9792 -0.9158 19.7283 +v 3.7408 -0.0108 19.8124 +v 3.7407 -0.3263 19.7954 +v 3.2256 -0.0108 19.6680 +v 3.2257 -0.3274 19.6508 +v 3.2267 -0.6422 19.6004 +v 3.7411 -0.6399 19.7454 +v 2.3031 -0.0108 19.2840 +v 2.3033 -0.3284 19.2670 +v 2.7442 -0.3281 19.4717 +v 2.7440 -0.0108 19.4889 +v 2.3050 -0.6443 19.2173 +v 2.7456 -0.6436 19.4214 +v 2.7490 -0.9555 19.3393 +v 2.3091 -0.9566 19.1362 +v 3.2292 -0.9534 19.5181 +v 3.7424 -0.9498 19.6634 +v 6.9514 -1.8158 6.5172 +v 7.4091 -1.8474 7.0626 +v 7.3049 -2.0275 7.1488 +v 6.8564 -1.9937 6.6120 +v 8.2343 -1.9038 8.1656 +v 7.8377 -1.8769 7.6114 +v 8.1131 -2.0885 8.2357 +v 7.7247 -2.0592 7.6894 +v 7.8434 -2.4379 8.4018 +v 7.4745 -2.4048 7.8725 +v 7.6035 -2.2352 7.7761 +v 7.9827 -2.2665 8.3140 +v 7.0756 -2.3693 7.3496 +v 7.1936 -2.2014 7.2442 +v 6.7556 -2.1657 6.7166 +v 6.6493 -2.3321 6.8320 +v 8.5963 -1.9278 8.7274 +v 8.9209 -1.9486 9.2988 +v 8.7854 -2.1374 9.3524 +v 8.4676 -2.1147 8.7894 +v 9.2052 -1.9657 9.8821 +v 9.0638 -2.1562 9.9267 +v 8.7449 -2.5157 10.0410 +v 8.9103 -2.3395 9.9792 +v 8.4811 -2.4940 9.4848 +v 8.6387 -2.3192 9.4140 +v 8.3287 -2.2947 8.8595 +v 8.1798 -2.4678 8.9388 +v 8.1797 -3.0002 10.2948 +v 7.9454 -2.9756 9.7634 +v 8.1342 -2.8223 9.6583 +v 8.3794 -2.8461 10.1975 +v 7.3758 -2.9124 8.7307 +v 7.6767 -2.9460 9.2421 +v 7.5396 -2.7608 8.6091 +v 7.8535 -2.7935 9.1290 +v 8.0213 -2.6341 9.0283 +v 7.6956 -2.6026 8.4998 +v 8.3129 -2.6617 9.5658 +v 8.5679 -2.6846 10.1134 +v 7.0449 -2.8758 8.2286 +v 6.6862 -2.8374 7.7355 +v 6.8215 -2.6872 7.5944 +v 7.1949 -2.7250 8.0978 +v 6.3018 -2.7980 7.2510 +v 6.4220 -2.6482 7.0983 +v 6.5379 -2.4929 6.9589 +v 6.9515 -2.5312 7.4661 +v 7.3382 -2.5680 7.9794 +v 0.2392 -2.1410 17.3522 +v 0.4838 -2.1413 17.4355 +v 0.4741 -1.8558 17.6050 +v 0.2342 -1.8551 17.5196 +v 1.0107 -2.1416 17.7227 +v 0.7392 -2.1416 17.5620 +v 0.9929 -1.8573 17.8994 +v 0.7251 -1.8566 17.7348 +v 0.9705 -1.2624 18.1767 +v 0.7074 -1.2612 18.0046 +v 0.7147 -1.5626 17.8825 +v 0.9798 -1.5637 18.0510 +v 0.4618 -1.2601 17.8687 +v 0.4669 -1.5616 17.7496 +v 0.2306 -1.5608 17.6620 +v 0.2280 -1.2593 17.7791 +v 1.3038 -2.1412 17.9085 +v 1.6239 -2.1402 18.1101 +v 1.6013 -1.8576 18.2956 +v 1.2831 -1.8577 18.0895 +v 1.9762 -2.1383 18.3185 +v 1.9531 -1.8567 18.5082 +v 1.9242 -1.2642 18.8092 +v 1.9360 -1.5647 18.6722 +v 1.5731 -1.2641 18.5891 +v 1.5847 -1.5650 18.4556 +v 1.2678 -1.5646 18.2453 +v 1.2572 -1.2634 18.3749 +v 1.9102 -0.0108 19.0625 +v 1.9105 -0.3285 19.0458 +v 1.5593 -0.0108 18.8350 +v 1.5596 -0.3283 18.8190 +v 1.5614 -0.6441 18.7719 +v 1.9123 -0.6444 18.9973 +v 0.9596 -0.0108 18.4059 +v 0.9598 -0.3276 18.3911 +v 1.2447 -0.3280 18.5971 +v 1.2444 -0.0108 18.6126 +v 0.9613 -0.6428 18.3475 +v 1.2464 -0.6435 18.5517 +v 1.2503 -0.9559 18.4773 +v 0.9646 -0.9549 18.2758 +v 1.5656 -0.9566 18.6949 +v 1.9166 -0.9569 18.9179 +v 0.6987 -0.0108 18.2259 +v 0.6989 -0.3271 18.2118 +v 0.4558 -0.0108 18.0834 +v 0.4559 -0.3268 18.0698 +v 0.4567 -0.6413 18.0292 +v 0.7000 -0.6420 18.1698 +v 0.2250 -0.3265 17.9760 +v 0.2249 -0.0108 17.9893 +v 0.2254 -0.6407 17.9363 +v 0.2263 -0.9521 17.8706 +v 0.4586 -0.9529 17.9620 +v 0.7027 -0.9538 18.1005 +v 0.2491 -1.4635 1.0355 +v 0.5035 -1.4651 1.0790 +v 0.5037 -1.6319 1.3022 +v 0.2493 -1.6303 1.2602 +v 1.0496 -1.4741 1.2710 +v 0.7685 -1.4685 1.1563 +v 1.0487 -1.6410 1.4878 +v 0.7685 -1.6353 1.3769 +v 1.0542 -1.9750 1.9866 +v 0.7742 -1.9695 1.8828 +v 0.7704 -1.8025 1.6193 +v 1.0502 -1.8081 1.7266 +v 0.5083 -1.9662 1.8130 +v 0.5053 -1.7991 1.5471 +v 0.2502 -1.7975 1.5065 +v 0.2518 -1.9646 1.7739 +v 1.3520 -1.4823 1.4266 +v 1.6811 -1.4937 1.6267 +v 1.6760 -1.6609 1.8329 +v 1.3495 -1.6493 1.6387 +v 2.0421 -1.5087 1.8749 +v 2.0335 -1.6761 2.0740 +v 2.0257 -2.0094 2.5354 +v 2.0280 -1.8431 2.2943 +v 1.6752 -1.9945 2.3095 +v 1.6741 -1.8279 2.0606 +v 1.3498 -1.8164 1.8726 +v 1.3530 -1.9832 2.1277 +v 2.0385 -2.5001 3.3794 +v 1.6979 -2.4870 3.1778 +v 1.6871 -2.3244 2.8686 +v 2.0309 -2.3382 3.0784 +v 1.0813 -2.4696 2.8878 +v 1.3801 -2.4769 3.0148 +v 1.0697 -2.3062 2.5679 +v 1.3681 -2.3139 2.6994 +v 1.3591 -2.1492 2.4035 +v 1.0607 -2.1412 2.2672 +v 1.6796 -2.1601 2.5790 +v 2.0266 -2.1745 2.7969 +v 0.7977 -2.4645 2.7939 +v 0.5254 -2.4614 2.7304 +v 0.5184 -2.2979 2.4054 +v 0.7879 -2.3010 2.4709 +v 0.2608 -2.4598 2.6945 +v 0.2571 -2.2963 2.3686 +v 0.2541 -2.1311 2.0615 +v 0.5127 -2.1327 2.0994 +v 0.7800 -2.1359 2.1669 +v -5.7868 2.8690 6.9550 +v -5.3747 2.8366 6.5017 +v -5.4647 2.6900 6.3057 +v -5.8939 2.7232 6.7745 +v -4.9477 2.8050 6.0619 +v -5.0205 2.6571 5.8491 +v -5.0930 2.5053 5.6524 +v -5.5531 2.5392 6.1250 +v -5.9984 2.5731 6.6087 +v -4.0729 2.7458 5.2391 +v -4.1136 2.5944 4.9910 +v -4.5680 2.6250 5.4094 +v -4.5117 2.7746 5.6397 +v -4.1556 2.4397 4.7603 +v -4.6249 2.4719 5.1957 +v -4.2430 2.1208 4.3498 +v -4.7391 2.1550 4.8169 +v -4.6821 2.3153 4.9984 +v -4.1989 2.2818 4.5466 +v -5.2353 2.1899 5.3046 +v -5.1648 2.3496 5.4711 +v -6.1979 2.2587 6.3182 +v -6.0999 2.4183 6.4569 +v -5.6397 2.3842 5.9591 +v -5.7241 2.2247 5.8071 +v -3.6374 2.7189 4.8640 +v -3.6636 2.5655 4.5985 +v -3.2112 2.6943 4.5185 +v -3.2247 2.5390 4.2366 +v -3.2409 2.3811 3.9731 +v -3.6920 2.4092 4.3510 +v -2.4112 2.6536 3.9323 +v -2.4056 2.4950 3.6224 +v -2.8032 2.5154 3.9097 +v -2.8005 2.6724 4.2066 +v -2.4035 2.3342 3.3317 +v -2.8091 2.3558 3.6317 +v -2.4090 2.0068 2.8087 +v -2.8299 2.0304 3.1328 +v -2.8180 2.1941 3.3727 +v -2.4046 2.1713 3.0604 +v -3.2809 2.0577 3.5017 +v -3.2597 2.2206 3.7282 +v -3.7224 2.2500 4.1214 +v -3.7544 2.0882 3.9094 +v -2.4568 1.3380 2.0047 +v -2.9037 1.3607 2.3683 +v -2.8815 1.5298 2.5299 +v -2.4405 1.5062 2.1748 +v -3.3859 1.3870 2.7807 +v -3.3569 1.5572 2.9333 +v -3.3297 1.7259 3.1043 +v -2.8618 1.6980 2.7113 +v -2.4270 1.6739 2.3656 +v -4.4226 1.4465 3.7236 +v -4.3778 1.6195 3.8566 +v -3.8584 1.5874 3.3778 +v -3.8950 1.4158 3.2349 +v -4.3327 1.7896 4.0050 +v -3.8227 1.7567 3.5378 +v -3.7879 1.9237 3.7149 +v -4.2877 1.9568 4.1693 +v -3.3043 1.8928 3.2937 +v -2.4165 1.8409 2.5770 +v -2.8445 1.8649 2.9123 +v -4.9601 1.4781 4.2395 +v -4.9066 1.6528 4.3625 +v -5.4990 1.5099 4.7755 +v -5.4367 1.6862 4.8885 +v -5.3717 1.8583 5.0140 +v -4.8517 1.8238 4.4994 +v -6.5476 1.5701 5.8786 +v -6.4674 1.7501 5.9729 +v -5.9597 1.7189 5.4277 +v -6.0310 1.5408 5.3243 +v -6.3821 1.9248 6.0770 +v -5.8845 1.8922 5.5421 +v -5.8058 2.0608 5.6684 +v -6.2921 2.0943 6.1919 +v -5.3044 2.0261 5.1525 +v -4.7958 1.9912 4.6507 +v -8.5187 3.0610 14.6532 +v -8.6327 2.9861 14.7425 +v -8.4663 3.0376 15.0557 +v -8.3736 3.1214 14.8222 +v -8.7831 2.8758 14.8571 +v -8.5961 2.9272 15.2403 +v -8.3571 2.9938 15.5908 +v -8.2430 3.1095 15.3407 +v -8.1557 3.2025 15.0437 +v -9.1079 2.5917 15.0921 +v -8.8912 2.6420 15.5636 +v -8.7407 2.7943 15.4092 +v -8.9442 2.7433 14.9756 +v -8.6228 2.7025 16.0010 +v -8.4865 2.8575 15.8087 +v -7.9530 2.8407 16.7607 +v -7.8466 3.0036 16.4985 +v -8.1867 2.9286 16.1723 +v -8.3082 2.7698 16.4011 +v -7.7467 3.1488 16.2042 +v -8.0721 3.0692 15.9129 +v -7.5863 3.3806 15.5003 +v -7.8909 3.2905 15.2749 +v -7.9713 3.1903 15.6161 +v -7.6582 3.2749 15.8731 +v -9.2662 2.4242 15.2008 +v -9.0386 2.4730 15.7044 +v -9.4168 2.2426 15.3021 +v -9.1800 2.2892 15.8329 +v -8.8886 2.3437 16.3309 +v -8.7579 2.5306 16.1744 +v -9.6853 1.8443 15.4850 +v -9.4334 1.8848 16.0587 +v -9.3125 2.0925 15.9506 +v -9.5573 2.0487 15.3967 +v -9.1241 1.9318 16.6008 +v -9.0117 2.1435 16.4724 +v -8.3588 2.0376 17.5630 +v -8.2669 2.2584 17.3943 +v -8.6610 2.1996 16.9558 +v -8.7637 1.9834 17.1046 +v -8.1665 2.4667 17.2061 +v -8.5487 2.4037 16.7905 +v -8.4300 2.5943 16.6064 +v -8.0607 2.6613 16.9957 +v -6.4231 2.2388 18.8041 +v -6.3812 2.4770 18.5721 +v -6.8865 2.4292 18.3769 +v -6.9415 2.1949 18.5966 +v -6.3355 2.7008 18.3131 +v -6.8263 2.6497 18.1313 +v -7.2992 2.5921 17.8822 +v -7.3734 2.3754 18.1112 +v -7.4412 2.1454 18.3160 +v -6.2408 3.1023 17.7093 +v -6.7005 3.0452 17.5558 +v -6.7635 2.8553 17.8581 +v -6.2880 2.9096 18.0260 +v -7.1431 2.9809 17.3432 +v -7.2214 2.7942 17.6269 +v -7.6558 2.7287 17.3376 +v -7.5626 2.9119 17.0764 +v -7.7479 2.5303 17.5719 +v -7.9158 2.0923 17.9691 +v -7.8356 2.3177 17.7816 +v -6.1962 3.2783 17.3619 +v -6.6401 3.2184 17.2227 +v -6.1561 3.4367 16.9824 +v -6.5847 3.3740 16.8571 +v -6.9968 3.3035 16.6819 +v -7.0672 3.1510 17.0289 +v -6.0984 3.6974 16.1225 +v -6.4994 3.6287 16.0219 +v -6.5370 3.5111 16.4574 +v -6.1228 3.5767 16.5697 +v -6.8848 3.5517 15.8803 +v -6.9349 3.4374 16.2998 +v -7.3107 3.3580 16.1030 +v -7.2490 3.4684 15.7043 +v -7.3861 3.2277 16.4624 +v -7.4714 3.0786 16.7858 +v -2.8011 2.8268 4.5222 +v -2.4203 2.8096 4.2609 +v -3.2007 2.8468 4.8188 +v -3.1942 2.9959 5.1377 +v -2.8056 2.9781 4.8565 +v -2.4332 2.9626 4.6084 +v -4.0340 2.8939 5.5049 +v -3.6136 2.8692 5.1476 +v -3.9983 3.0379 5.7877 +v -3.5935 3.0158 5.4491 +v -3.9430 3.3110 6.4017 +v -3.5698 3.2960 6.1055 +v -3.5785 3.1583 5.7685 +v -3.9675 3.1772 6.0869 +v -3.1970 3.2821 5.8312 +v -3.1926 3.1411 5.4752 +v -2.4720 3.2582 5.3598 +v -2.4503 3.1122 4.9747 +v -2.8148 3.1258 5.2097 +v -2.8294 3.2696 5.5818 +v -4.4563 2.9206 5.8873 +v -4.8747 2.9490 6.2915 +v -4.8033 3.0880 6.5349 +v -4.4033 3.0620 6.1505 +v -5.6775 3.0105 7.1512 +v -5.2837 2.9791 6.7139 +v -5.5670 3.1460 7.3578 +v -5.1929 3.1160 6.9382 +v -5.3456 3.3925 7.7821 +v -5.0170 3.3670 7.4072 +v -5.1036 3.2459 7.1706 +v -5.4561 3.2739 7.5698 +v -4.6708 3.3456 7.0524 +v -4.7348 3.2206 6.7894 +v -4.3545 3.1979 6.4277 +v -4.3114 3.3272 6.7173 +v -4.9681 3.7269 8.4781 +v -4.7961 3.7405 8.3644 +v -4.8073 3.6643 8.1100 +v -5.0384 3.6734 8.3553 +v -4.5514 3.7562 8.2051 +v -4.5434 3.6665 7.8898 +v -4.5680 3.5685 7.5988 +v -4.8624 3.5776 7.8789 +v -5.1329 3.5947 8.1836 +v -3.9599 3.7818 7.8332 +v -3.9312 3.6741 7.4451 +v -4.2487 3.6704 7.6674 +v -4.2691 3.7703 8.0251 +v -3.9212 3.5596 7.0786 +v -4.2527 3.5633 7.3330 +v -4.2755 3.4490 7.0177 +v -3.9263 3.4385 6.7316 +v -4.6128 3.4616 7.3209 +v -5.2367 3.5003 7.9896 +v -4.9344 3.4781 7.6440 +v -3.6341 3.7898 7.6380 +v -3.5989 3.6756 7.2252 +v -3.2971 3.7947 7.4452 +v -3.2573 3.6751 7.0126 +v -3.2281 3.5496 6.5996 +v -3.5779 3.5549 6.8329 +v -2.6116 3.7975 7.0886 +v -2.5681 3.6701 6.6281 +v -2.9119 3.6732 6.8119 +v -2.9545 3.7971 7.2601 +v -2.5305 3.5375 6.1865 +v -2.8772 3.5437 6.3828 +v -2.8500 3.4090 5.9728 +v -2.4986 3.4001 5.7637 +v -3.2084 3.4184 6.2059 +v -3.5689 3.4283 6.4599 +v -2.9783 4.4581 11.3096 +v -3.3597 4.4287 11.4173 +v -3.3738 4.4368 11.9872 +v -2.9889 4.4673 11.8794 +v -3.7418 4.3941 11.5225 +v -3.7600 4.4013 12.0909 +v -3.7637 4.3899 12.6640 +v -3.3743 4.4254 12.5597 +v -2.9872 4.4563 12.4497 +v -4.4994 4.3062 11.7056 +v -4.5281 4.3125 12.2676 +v -4.1455 4.3601 12.1859 +v -4.1224 4.3535 11.6203 +v -4.5405 4.3024 12.8378 +v -4.1531 4.3492 12.7582 +v -4.5274 4.2321 13.9791 +v -4.1315 4.2747 13.8994 +v -4.1477 4.3208 13.3312 +v -4.5394 4.2757 13.4104 +v -3.7354 4.3121 13.8024 +v -3.7548 4.3602 13.2363 +v -2.9518 4.3746 13.5730 +v -2.9744 4.4252 13.0159 +v -3.3630 4.3947 13.1298 +v -3.3415 4.3451 13.6922 +v -4.8705 4.2517 11.7735 +v -4.9057 4.2579 12.3313 +v -5.2336 4.1894 11.8192 +v -5.2762 4.1957 12.3723 +v -5.3008 4.1880 12.9362 +v -4.9238 4.2489 12.8986 +v -5.9272 4.0385 11.8236 +v -5.9874 4.0456 12.3680 +v -5.6375 4.1251 12.3861 +v -5.5866 4.1185 11.8375 +v -6.0277 4.0409 12.9239 +v -5.6695 4.1188 12.9461 +v -6.0662 3.9911 14.0432 +v -5.6926 4.0637 14.0737 +v -5.6865 4.0987 13.5108 +v -6.0525 4.0231 13.4846 +v -5.3102 4.1275 14.0704 +v -5.3109 4.1655 13.5043 +v -4.9279 4.2242 13.4695 +v -4.9211 4.1833 14.0375 +v -5.6874 3.7558 16.1757 +v -5.6852 3.8599 15.6858 +v -6.0849 3.7980 15.6395 +v -5.2696 3.8053 16.1861 +v -5.2783 3.9129 15.6923 +v -5.2903 4.0019 15.1708 +v -5.6880 3.9453 15.1678 +v -6.0780 3.8797 15.1274 +v -4.4256 3.8823 16.0976 +v -4.4537 3.9966 15.6034 +v -4.8669 3.9581 15.6634 +v -4.8480 3.8471 16.1585 +v -4.4819 4.0928 15.0817 +v -4.8874 4.0507 15.1407 +v -4.9065 4.1256 14.5967 +v -4.5073 4.1712 14.5382 +v -5.3021 4.0732 14.6280 +v -6.0732 3.9437 14.5931 +v -5.6918 4.0129 14.6282 +v -4.0055 3.9124 16.0080 +v -4.0415 4.0298 15.5169 +v -3.5907 3.9385 15.8946 +v -3.6331 4.0588 15.4083 +v -3.6726 4.1613 14.8938 +v -4.0761 4.1293 14.9980 +v -2.7895 3.9837 15.6150 +v -2.8383 4.1089 15.1421 +v -3.2311 4.0848 15.2819 +v -3.1844 3.9618 15.7620 +v -2.8824 4.2161 14.6410 +v -3.2739 4.1898 14.7734 +v -3.3112 4.2767 14.2418 +v -2.9207 4.3048 14.1163 +v -3.7074 4.2457 14.3567 +v -4.1068 4.2109 14.4569 +v -8.1561 3.0894 10.9419 +v -8.3775 2.9398 10.8369 +v -8.5367 2.9525 11.3901 +v -8.3060 3.1019 11.4884 +v -8.5869 2.7843 10.7474 +v -8.7543 2.7969 11.3087 +v -8.8817 2.8063 11.8725 +v -8.6581 2.9611 11.9445 +v -8.4206 3.1095 12.0356 +v -8.9687 2.4551 10.6088 +v -9.1498 2.4670 11.1894 +v -8.9587 2.6351 11.2424 +v -8.7840 2.6228 10.6719 +v -9.2871 2.4770 11.7764 +v -9.0914 2.6450 11.8173 +v -9.4252 2.4972 12.9439 +v -9.2280 2.6619 12.9502 +v -9.1814 2.6535 12.3891 +v -9.3793 2.4866 12.3634 +v -9.0170 2.8184 12.9725 +v -8.9693 2.8132 12.4301 +v -8.5514 3.1093 13.0897 +v -8.5018 3.1120 12.5729 +v -8.7428 2.9659 12.4901 +v -8.7916 2.9674 13.0170 +v -9.1408 2.2811 10.5567 +v -9.3275 2.2924 11.1480 +v -9.3001 2.1006 10.5140 +v -9.4917 2.1112 11.1163 +v -9.6366 2.1206 11.7281 +v -9.4689 2.3023 11.7474 +v -9.5800 1.7195 10.4510 +v -9.7791 1.7283 11.0749 +v -9.6423 1.9232 11.0925 +v -9.4466 1.9135 10.4793 +v -9.9294 1.7363 11.7108 +v -9.7901 1.9320 11.7166 +v -10.0749 1.7556 12.9975 +v -9.9341 1.9528 12.9765 +v -9.8881 1.9414 12.3463 +v -10.0287 1.7450 12.3534 +v -9.7786 2.1424 12.9591 +v -9.7329 2.1305 12.3442 +v -9.5632 2.3123 12.3491 +v -9.6089 2.3240 12.9475 +v -9.7398 2.0143 14.8171 +v -9.8732 1.8125 14.8869 +v -9.5931 2.2063 14.7442 +v -9.7108 2.1786 14.1643 +v -9.8621 1.9878 14.2171 +v -9.9994 1.7880 14.2695 +v -9.2671 2.5548 14.5900 +v -9.4349 2.3870 14.6684 +v -9.3715 2.5286 14.0616 +v -9.5468 2.3592 14.1121 +v -9.6041 2.3389 13.5368 +v -9.4234 2.5103 13.5114 +v -9.7720 2.1579 13.5675 +v -10.0659 1.7695 13.6379 +v -9.9262 1.9678 13.6018 +v -9.0917 2.7082 14.5093 +v -8.9125 2.8459 14.4366 +v -8.9909 2.8305 13.9807 +v -9.1861 2.6855 14.0138 +v -8.5459 3.0744 14.3913 +v -8.7337 2.9664 14.3826 +v -8.5677 3.0891 14.0145 +v -8.7858 2.9644 13.9741 +v -8.8055 2.9658 13.5153 +v -8.5715 3.1012 13.5754 +v -9.0249 2.8228 13.4910 +v -9.2306 2.6713 13.4929 +v -5.6986 3.6321 16.6309 +v -5.7172 3.4893 17.0524 +v -5.2719 3.5331 17.0725 +v -5.2678 3.6785 16.6459 +v -5.7700 3.1498 17.7984 +v -5.7416 3.3283 17.4412 +v -5.2930 3.1888 17.8300 +v -5.2806 3.3696 17.4669 +v -4.3400 3.2459 17.7473 +v -4.3575 3.4310 17.3820 +v -4.8178 3.4034 17.4452 +v -4.8147 3.2204 17.8107 +v -4.3775 3.5990 16.9859 +v -4.8240 3.5692 17.0485 +v -4.8339 3.7173 16.6199 +v -4.4002 3.7496 16.5581 +v -5.8010 2.9545 18.1250 +v -5.8328 2.7431 18.4221 +v -5.3242 2.7775 18.4658 +v -5.3079 2.9912 18.1627 +v -5.8926 2.2750 18.9314 +v -5.8639 2.5163 18.6905 +v -5.3565 2.3043 18.9873 +v -5.3407 2.5483 18.7404 +v -4.2942 2.3457 18.9192 +v -4.3021 2.5938 18.6678 +v -4.8180 2.5739 18.7301 +v -4.8215 2.3276 18.9803 +v -4.3124 2.8269 18.3893 +v -4.8154 2.8051 18.4523 +v -4.8141 3.0208 18.1462 +v -4.3249 3.0444 18.0828 +v -2.3953 2.3822 18.3064 +v -2.4321 2.6364 18.0648 +v -2.8580 2.6295 18.2520 +v -2.8253 2.3768 18.4975 +v -2.4752 2.8761 17.7985 +v -2.8965 2.8675 17.9813 +v -3.3471 2.8570 18.1459 +v -3.3158 2.6207 18.4205 +v -3.2895 2.3695 18.6692 +v -2.5749 3.3101 17.1871 +v -2.9863 3.2974 17.3597 +v -2.9397 3.0902 17.6843 +v -2.5233 3.1008 17.5063 +v -3.4208 3.2832 17.5151 +v -3.3823 3.0780 17.8445 +v -3.8459 3.0631 17.9798 +v -3.8737 3.2665 17.6465 +v -3.8210 2.8439 18.2845 +v -3.7813 2.3594 18.8126 +v -3.7993 2.6091 18.5618 +v -2.6287 3.5035 16.8395 +v -3.0352 3.4886 17.0063 +v -2.6833 3.6805 16.4625 +v -3.0853 3.6633 16.6231 +v -3.5042 3.6448 16.7676 +v -3.4617 3.4723 17.1565 +v -3.1354 3.8212 16.2087 +v -2.7373 3.8408 16.0547 +v -3.5475 3.8003 16.3474 +v -3.9703 3.7769 16.4655 +v -3.9363 3.6238 16.8904 +v -3.9040 3.4535 17.2838 +v -6.4746 3.7259 15.5490 +v -6.4578 3.8041 15.0455 +v -6.8237 3.7197 14.9293 +v -6.8496 3.6453 15.4211 +v -6.4286 3.9087 13.9749 +v -6.4441 3.8646 14.5185 +v -6.7785 3.8172 13.8761 +v -6.8018 3.7765 14.4119 +v -7.4348 3.6097 13.6167 +v -7.4681 3.5772 14.1318 +v -7.1440 3.6804 14.2806 +v -7.1144 3.7173 13.7542 +v -7.4992 3.5296 14.6224 +v -7.1721 3.6278 14.7858 +v -7.2049 3.5577 15.2628 +v -7.5359 3.4648 15.0810 +v -6.4066 3.9378 13.4216 +v -6.3733 3.9533 12.8654 +v -6.7061 3.8566 12.7776 +v -6.7483 3.8434 13.3290 +v -6.2532 3.9487 11.7725 +v -6.3238 3.9565 12.3134 +v -6.5651 3.8496 11.6909 +v -6.6467 3.8582 12.2292 +v -7.1475 3.6258 11.4637 +v -7.2526 3.6360 11.9995 +v -6.9563 3.7512 12.1223 +v -6.8631 3.7418 11.5857 +v -7.3321 3.6376 12.5424 +v -7.0258 3.7512 12.6676 +v -7.0767 3.7405 13.2141 +v -7.3911 3.6294 13.0842 +v -8.0623 3.2455 11.6054 +v -7.9227 3.2333 11.0638 +v -8.1691 3.2518 12.1484 +v -7.9039 3.3875 12.2754 +v -7.8055 3.3827 11.7342 +v -7.6770 3.3710 11.1959 +v -8.2961 3.2446 13.1966 +v -8.2461 3.2517 12.6823 +v -8.0252 3.3732 13.3272 +v -7.9758 3.3847 12.8097 +v -7.6908 3.5107 12.9465 +v -7.7382 3.4949 13.4708 +v -7.6248 3.5163 12.4092 +v -7.4187 3.5020 11.3315 +v -7.5357 3.5130 11.8679 +v -8.3220 3.2299 13.6810 +v -8.3334 3.2067 14.1221 +v -8.0792 3.3187 14.2738 +v -8.0558 3.3520 13.8182 +v -8.3399 3.1742 14.5068 +v -8.1068 3.2706 14.6852 +v -7.8377 3.3683 14.8825 +v -7.8014 3.4265 14.4461 +v -7.7716 3.4677 13.9731 +v -7.4180 0.1980 6.0864 +v -6.8964 0.1940 5.5026 +v -7.9115 0.2014 6.6716 +v -7.8894 0.4129 6.6880 +v -7.3970 0.4060 6.1045 +v -6.8766 0.3982 5.5221 +v -8.8020 0.2072 7.8571 +v -8.3739 0.2045 7.2609 +v -8.7777 0.4244 7.8696 +v -8.3507 0.4190 7.2754 +v -8.6849 0.8529 7.9184 +v -8.2621 0.8423 7.3316 +v -8.3131 0.6319 7.2991 +v -8.7384 0.6399 7.8901 +v -7.8055 0.8304 6.7510 +v -7.8537 0.6228 6.7146 +v -6.8029 0.8017 5.5975 +v -6.8451 0.6010 5.5539 +v -7.3634 0.6125 6.1338 +v -7.3181 0.8168 6.1739 +v -9.1925 0.2095 8.4631 +v -9.5423 0.2115 9.0815 +v -9.5163 0.4330 9.0895 +v -9.1673 0.4290 8.4734 +v -10.1072 0.2146 10.3671 +v -9.8483 0.2132 9.7153 +v -10.0801 0.4392 10.3699 +v -9.8217 0.4364 9.7207 +v -9.9751 0.8823 10.3828 +v -9.7188 0.8767 9.7436 +v -9.7782 0.6578 9.7300 +v -10.0359 0.6621 10.3749 +v -9.4162 0.8699 9.1216 +v -9.4741 0.6528 9.1028 +v -9.1264 0.6468 8.4904 +v -9.0706 0.8620 8.5141 +v -9.3343 1.7086 9.8441 +v -9.4510 1.5089 9.8115 +v -9.7003 1.5185 10.4276 +v -9.0449 1.6956 9.2521 +v -9.1572 1.4974 9.2110 +v -9.2570 1.2931 9.1756 +v -9.5544 1.3030 9.7841 +v -9.8066 1.3114 10.4087 +v -8.3460 1.6630 8.1029 +v -8.4477 1.4684 8.0466 +v -8.8218 1.4839 8.6235 +v -8.7145 1.6804 8.6725 +v -8.5387 1.2680 7.9968 +v -8.9175 1.2815 8.5808 +v -9.0007 1.0739 8.5442 +v -8.6180 1.0625 7.9540 +v -9.3436 1.0837 9.1458 +v -9.8984 1.0990 10.3940 +v -9.6439 1.0920 9.7615 +v -7.9422 1.6433 7.5411 +v -8.0378 1.4508 7.4776 +v -7.5060 1.6213 6.9847 +v -7.5950 1.4310 6.9141 +v -7.6752 1.2353 6.8512 +v -8.1236 1.2526 7.4212 +v -6.6223 1.3845 5.7934 +v -7.1222 1.4090 6.3535 +v -7.0402 1.5969 6.4313 +v -6.6904 1.1942 5.7178 +v -7.1965 1.2158 6.2843 +v -7.2621 1.0182 6.2243 +v -6.7510 0.9997 5.6523 +v -7.7457 1.0348 6.7967 +v -8.1987 1.0495 7.3724 +v -2.3568 3.8603 15.8904 +v -2.4091 4.0054 15.4582 +v -2.3022 3.6978 16.2914 +v -1.9394 3.7146 16.1176 +v -1.9917 3.8793 15.7235 +v -2.0413 4.0262 15.2988 +v -2.1916 3.3226 17.0040 +v -2.2466 3.5184 16.6622 +v -1.8329 3.3345 16.8186 +v -1.8859 3.5328 16.4823 +v -1.1751 3.3552 16.4736 +v -1.2166 3.5582 16.1470 +v -1.5436 3.5462 16.3079 +v -1.4952 3.3455 16.6390 +v -1.2581 3.7443 15.7933 +v -1.5922 3.7303 15.9490 +v -1.3367 4.0628 15.0011 +v -1.6845 4.0456 15.1441 +v -1.6396 3.8970 15.5613 +v -1.2986 3.9128 15.4115 +v -2.1386 3.1110 17.3179 +v -2.0890 2.8840 17.6052 +v -1.7335 2.8911 17.4100 +v -1.7816 3.1204 17.1275 +v -2.0064 2.3864 18.1043 +v -2.0445 2.6423 17.8670 +v -1.6532 2.3896 17.9003 +v -1.6903 2.6473 17.6673 +v -1.0339 2.3935 17.5216 +v -1.0631 2.6547 17.2969 +v -1.3648 2.6514 17.4744 +v -1.3308 2.3919 17.7031 +v -1.0972 2.9026 17.0478 +v -1.4044 2.8974 17.2214 +v -1.4483 3.1290 16.9432 +v -1.1349 3.1364 16.7736 +v 0.0000 2.3953 17.1301 +v 0.0000 2.6602 16.9141 +v -0.2538 2.6598 16.9434 +v -0.2457 2.3953 17.1601 +v 0.0000 2.9125 16.6732 +v -0.2633 2.9119 16.7019 +v -0.5310 2.9100 16.7796 +v -0.5124 2.6589 17.0227 +v -0.4965 2.3951 17.2412 +v -0.0000 3.3752 16.1158 +v -0.2850 3.3737 16.1433 +v -0.2738 3.1502 16.4353 +v -0.0000 3.1513 16.4072 +v -0.5735 3.3697 16.2175 +v -0.5516 3.1473 16.5113 +v -0.8373 3.1426 16.6268 +v -0.8690 3.3634 16.3303 +v -0.8075 2.9068 16.8977 +v -0.7575 2.3945 17.3647 +v -0.7806 2.6571 17.1434 +v -0.0000 3.5830 15.7988 +v -0.2965 3.5812 15.8255 +v -0.0000 3.7736 15.4558 +v -0.3080 3.7714 15.4818 +v -0.6186 3.7655 15.5519 +v -0.5961 3.5761 15.8979 +v 0.0000 4.0984 14.6911 +v -0.3296 4.0958 14.7150 +v -0.3192 3.9434 15.1117 +v 0.0000 3.9458 15.0867 +v -0.6611 4.0885 14.7794 +v -0.6405 3.9366 15.1792 +v -0.9663 3.9263 15.2817 +v -0.9962 4.0774 14.8772 +v -0.9344 3.7563 15.6583 +v -0.9017 3.5683 16.0077 +v -2.0640 2.7953 4.0386 +v -2.0495 2.6381 3.6996 +v -2.0822 2.9495 4.3963 +v -1.7499 2.9387 4.2185 +v -1.7293 2.7836 3.8530 +v -1.7119 2.6258 3.5061 +v -2.1298 3.2480 5.1680 +v -2.1041 3.1005 4.7728 +v -1.8009 3.2391 5.0054 +v -1.7738 3.0906 4.6026 +v -1.1753 3.2252 4.7631 +v -1.1521 3.0758 4.3515 +v -1.4572 3.0823 4.4627 +v -1.4833 3.2315 4.8708 +v -1.1309 2.9231 3.9582 +v -1.4337 2.9299 4.0731 +v -1.0953 2.6091 3.2265 +v -1.3950 2.6162 3.3492 +v -1.4129 2.7745 3.7019 +v -1.1119 2.7675 3.5833 +v -2.1595 3.3917 5.5820 +v -2.1934 3.5312 6.0146 +v -1.8646 3.5250 5.8668 +v -1.8312 3.3840 5.4268 +v -2.2739 3.7964 6.9360 +v -2.2315 3.6662 6.4660 +v -1.9407 3.7942 6.8028 +v -1.9011 3.6619 6.3255 +v -1.2852 3.7880 6.5957 +v -1.2555 3.6529 6.1094 +v -1.5760 3.6573 6.2066 +v -1.6113 3.7913 6.6893 +v -1.2272 3.5139 5.6420 +v -1.5429 3.5192 5.7427 +v -1.5119 3.3772 5.2974 +v -1.2004 3.3713 5.1933 +v 0.0000 3.7793 6.4269 +v 0.0000 3.6427 5.9367 +v -0.3116 3.6435 5.9475 +v -0.3197 3.7801 6.4376 +v 0.0000 3.5029 5.4657 +v -0.3038 3.5037 5.4765 +v -0.6088 3.5060 5.5092 +v -0.6242 3.6457 5.9798 +v -0.6400 3.7820 6.4696 +v 0.0000 3.2138 4.5802 +v -0.2891 3.2145 4.5909 +v -0.2963 3.3607 5.0244 +v 0.0000 3.3599 5.0136 +v -0.5801 3.2167 4.6243 +v -0.5941 3.3629 5.0574 +v -0.8949 3.3665 5.1135 +v -0.8748 3.2202 4.6813 +v -0.9162 3.5095 5.5643 +v -0.9616 3.7848 6.5223 +v -0.9385 3.6489 6.0338 +v 0.0000 3.0645 4.1652 +v -0.2823 3.0652 4.1759 +v 0.0000 2.9123 3.7683 +v -0.2760 2.9129 3.7790 +v -0.5547 2.9148 3.8130 +v -0.5669 3.0673 4.2095 +v -0.0000 2.5988 3.0277 +v -0.2652 2.5993 3.0386 +v -0.2703 2.7575 3.4000 +v 0.0000 2.7570 3.3892 +v -0.5339 2.6009 3.0737 +v -0.5437 2.7593 3.4345 +v -0.8232 2.7625 3.4948 +v -0.8094 2.6041 3.1355 +v -0.8388 2.9181 3.8722 +v -0.8561 3.0707 4.2676 +v -2.6076 4.4934 11.7721 +v -2.5998 4.4826 11.2043 +v -2.6044 4.4832 12.3383 +v -2.2253 4.5064 12.2294 +v -2.2294 4.5154 11.6685 +v -2.2237 4.5029 11.1042 +v -2.5686 4.4016 13.4490 +v -2.5910 4.4525 12.8988 +v -2.1911 4.4258 13.3250 +v -2.2123 4.4764 12.7829 +v -1.4499 4.4647 13.0977 +v -1.4660 4.5138 12.5725 +v -1.8375 4.4968 12.6727 +v -1.8185 4.4469 13.2063 +v -1.4764 4.5415 12.0341 +v -1.8495 4.5258 12.1267 +v -1.4777 4.5315 10.9304 +v -1.8498 4.5190 11.0120 +v -1.8538 4.5333 11.5720 +v -1.4804 4.5475 11.4856 +v -2.5382 4.3310 13.9844 +v -2.5008 4.2411 14.5007 +v -2.1276 4.2645 14.3589 +v -2.1626 4.3550 13.8517 +v -2.4574 4.1325 14.9935 +v -2.0869 4.1548 14.8426 +v -1.3714 4.1934 14.5613 +v -1.7254 4.1753 14.6963 +v -1.4021 4.3041 14.0953 +v -1.7618 4.2857 14.2217 +v -1.7931 4.3763 13.7238 +v -1.4285 4.3947 13.6063 +v 0.0000 4.2301 14.2689 +v -0.3391 4.2275 14.2913 +v 0.0000 4.3408 13.8223 +v -0.3475 4.3382 13.8432 +v -0.6962 4.3309 13.8998 +v -0.6797 4.2201 14.3521 +v 0.0000 4.4983 12.8655 +v -0.3605 4.4961 12.8832 +v -0.3546 4.4279 13.3730 +v 0.0000 4.4303 13.3537 +v -0.7217 4.4895 12.9311 +v -0.7103 4.4208 13.4253 +v -1.0679 4.4097 13.5050 +v -1.0846 4.4790 13.0043 +v -1.0473 4.3194 13.9859 +v -1.0233 4.2085 14.4443 +v 0.0000 4.5446 12.3601 +v -0.3649 4.5426 12.3761 +v 0.0000 4.5690 11.8398 +v -0.3677 4.5673 11.8543 +v -0.7360 4.5622 11.8941 +v -0.7304 4.5368 12.4198 +v 0.0000 4.5510 10.7641 +v -0.3685 4.5500 10.7762 +v -0.3690 4.5698 11.3202 +v 0.0000 4.5712 11.3070 +v -0.7374 4.5466 10.8097 +v -0.7384 4.5656 11.3565 +v -1.1088 4.5582 11.4127 +v -1.1070 4.5406 10.8620 +v -1.1054 4.5536 11.9553 +v -1.0972 4.5271 12.4867 +v -2.5785 0.1580 1.3893 +v -2.1545 0.1550 1.0540 +v -2.5690 0.3267 1.4177 +v -2.1462 0.3209 1.0838 +v -1.7640 0.3164 0.8038 +v -1.7711 0.1527 0.7726 +v -2.5372 0.6642 1.5329 +v -2.1189 0.6530 1.2042 +v -2.1339 0.4869 1.1337 +v -2.5548 0.4955 1.4655 +v -1.7411 0.6443 0.9297 +v -1.7537 0.4802 0.8560 +v -1.0837 0.6328 0.5301 +v -1.0918 0.4713 0.4508 +v -1.4082 0.4751 0.6294 +v -1.3979 0.6376 0.7060 +v -1.0985 0.3104 0.3942 +v -1.4168 0.3129 0.5749 +v -1.4226 0.1510 0.5423 +v -1.1032 0.1497 0.3603 +v -2.5173 0.8328 1.6202 +v -2.1022 0.8193 1.2956 +v -2.4964 1.0013 1.7277 +v -2.0850 0.9858 1.4080 +v -1.7133 0.9737 1.1419 +v -1.7273 0.8087 1.0249 +v -2.0538 1.3197 1.6973 +v -2.0685 1.1526 1.5418 +v -2.4759 1.1697 1.8558 +v -1.6892 1.3052 1.4426 +v -1.7002 1.1391 1.2811 +v -1.0530 1.2863 1.0766 +v -1.0589 1.1215 0.9055 +v -1.3656 1.1289 1.0701 +v -1.3574 1.2943 1.2369 +v -1.0665 0.9577 0.7574 +v -1.3757 0.9644 0.9262 +v -1.3868 0.8007 0.8049 +v -1.0750 0.7948 0.6323 +v 0.0000 1.2757 0.8195 +v 0.0000 1.1115 0.6399 +v -0.2507 1.1118 0.6543 +v -0.2496 1.2761 0.8333 +v 0.0000 0.9486 0.4836 +v -0.2524 0.9489 0.4986 +v -0.5105 0.9503 0.5469 +v -0.5071 1.1133 0.7010 +v -0.5046 1.2777 0.8784 +v 0.0000 0.6262 0.2417 +v -0.2565 0.6265 0.2578 +v -0.2544 0.7872 0.3663 +v 0.0000 0.7869 0.3508 +v -0.5187 0.6274 0.3091 +v -0.5145 0.7884 0.4163 +v -0.7861 0.7908 0.5038 +v -0.7925 0.6295 0.3988 +v -0.7800 0.9531 0.6321 +v -0.7706 1.2809 0.9583 +v -0.7746 1.1164 0.7836 +v 0.0000 0.4663 0.1565 +v -0.2584 0.4665 0.1730 +v -0.0000 0.3069 0.0954 +v -0.2601 0.3070 0.1123 +v -0.5260 0.3076 0.1658 +v -0.5227 0.4672 0.2256 +v -0.2613 0.1480 0.0757 +v 0.0000 0.1480 0.0586 +v -0.5283 0.1483 0.1298 +v -0.8071 0.1488 0.2238 +v -0.8036 0.3086 0.2588 +v -0.7985 0.4688 0.3172 +v -0.3279 3.9133 6.9472 +v 0.0000 3.9126 6.9366 +v -0.6562 3.9149 6.9785 +v -0.6722 4.0419 7.5036 +v -0.3360 4.0407 7.4729 +v 0.0000 4.0402 7.4624 +v -1.3161 3.9192 7.1008 +v -0.9854 3.9170 7.0299 +v -1.3471 4.0440 7.6221 +v -1.0092 4.0432 7.5536 +v -1.4054 4.2656 8.7017 +v -1.0533 4.2678 8.6369 +v -1.0321 4.1609 8.0903 +v -1.3772 4.1603 8.1566 +v -0.7019 4.2687 8.5889 +v -0.6876 4.1606 8.0415 +v 0.0000 4.2686 8.5486 +v 0.0000 4.1597 8.0009 +v -0.3437 4.1600 8.0113 +v -0.3508 4.2688 8.5590 +v -1.6485 3.9210 7.1907 +v -1.9833 3.9219 7.2988 +v -2.0272 4.0427 7.8112 +v -1.6863 4.0441 7.7083 +v -2.6615 3.9194 7.5678 +v -2.3208 3.9215 7.4247 +v -2.7152 4.0339 8.0643 +v -2.3701 4.0395 7.9302 +v -2.8242 4.2328 9.1019 +v -2.4675 4.2457 8.9834 +v -2.4197 4.1482 8.4504 +v -2.7703 4.1390 8.5762 +v -2.1123 4.2551 8.8763 +v -2.0708 4.1545 8.3378 +v -1.7234 4.1583 8.2395 +v -1.7584 4.2616 8.7819 +v -2.5797 4.4504 10.6397 +v -2.9540 4.4281 10.7453 +v -2.2075 4.4684 10.5406 +v -2.1824 4.4142 9.9799 +v -2.5496 4.3989 10.0800 +v -2.9186 4.3793 10.1882 +v -1.4678 4.4929 10.3715 +v -1.8369 4.4824 10.4505 +v -1.4518 4.4342 9.8119 +v -1.8165 4.4259 9.8899 +v -1.7898 4.3515 9.3329 +v -1.4306 4.3577 9.2544 +v -2.1501 4.3424 9.4244 +v -2.8745 4.3136 9.6398 +v -2.5115 4.3299 9.5272 +v -1.0999 4.5003 10.3061 +v -0.7328 4.5051 10.2563 +v -0.7249 4.4433 9.6996 +v -1.0880 4.4399 9.7478 +v 0.0000 4.5083 10.2134 +v -0.3662 4.5076 10.2247 +v 0.0000 4.4453 9.6583 +v -0.3624 4.4450 9.6691 +v -0.3571 4.3646 9.1128 +v 0.0000 4.3647 9.1022 +v -0.7145 4.3637 9.1427 +v -1.0722 4.3616 9.1904 +v -3.0059 3.9151 7.7275 +v -3.3489 3.9080 7.8977 +v -3.4090 4.0133 8.3690 +v -3.0630 4.0254 8.2127 +v -4.0109 3.8826 8.2452 +v -3.6856 3.8974 8.0723 +v -4.0782 3.9755 8.6799 +v -3.7489 3.9969 8.5269 +v -4.2370 4.1333 9.6135 +v -3.8920 4.1670 9.4928 +v -3.8192 4.0872 9.0007 +v -4.1556 4.0594 9.1363 +v -3.5395 4.1942 9.3630 +v -3.4738 4.1093 8.8578 +v -3.1229 4.1262 8.7142 +v -3.1826 4.2159 9.2306 +v -4.3198 3.8632 8.4102 +v -4.6042 3.8385 8.5556 +v -4.6875 3.9137 8.9396 +v -4.3926 3.9483 8.8217 +v -5.0682 3.7655 8.7140 +v -4.8558 3.8082 8.6692 +v -5.2010 3.8153 9.0472 +v -4.9583 3.8705 9.0211 +v -5.4835 3.9149 9.8566 +v -5.1974 3.9844 9.8491 +v -5.0756 3.9299 9.4169 +v -5.3422 3.8663 9.4317 +v -4.8925 4.0432 9.8003 +v -4.7869 3.9823 9.3555 +v -4.4792 4.0249 9.2583 +v -4.5714 4.0924 9.7189 +v -5.5128 4.0999 11.3068 +v -5.8426 4.0206 11.2974 +v -5.1695 4.1698 11.2831 +v -5.0883 4.1381 10.7664 +v -5.4204 4.0706 10.7967 +v -5.7378 3.9933 10.7922 +v -4.4517 4.2839 11.1578 +v -4.8151 4.2309 11.2317 +v -4.3893 4.2468 10.6257 +v -4.7438 4.1966 10.7074 +v -4.6611 4.1500 10.2026 +v -4.3163 4.1962 10.1104 +v -4.9944 4.0955 10.2714 +v -5.6168 3.9576 10.3110 +v -5.3138 4.0317 10.3099 +v -4.0817 4.3295 11.0669 +v -3.7072 4.3682 10.9643 +v -3.6597 4.3253 10.4175 +v -4.0271 4.2895 10.5271 +v -3.3306 4.4009 10.8553 +v -3.2894 4.3550 10.3026 +v -3.2390 4.2928 9.7606 +v -3.6026 4.2668 9.8833 +v -3.9626 4.2348 10.0020 +v -5.2346 3.7034 8.6532 +v -5.3767 3.6241 8.5232 +v -5.5987 3.6612 8.8958 +v -5.4113 3.7452 8.9992 +v -5.6525 3.4230 8.1772 +v -5.5157 3.5300 8.3605 +v -5.9372 3.4566 8.5921 +v -5.7726 3.5647 8.7558 +v -6.4390 3.5256 9.4788 +v -6.2230 3.6381 9.6161 +v -6.0080 3.6016 9.1746 +v -6.1994 3.4914 9.0261 +v -5.9936 3.7410 9.7309 +v -5.8042 3.7013 9.2993 +v -5.5837 3.7898 9.3887 +v -5.7480 3.8335 9.8141 +v -5.7874 3.3051 7.9854 +v -5.9203 3.1779 7.7910 +v -6.2512 3.2107 8.2377 +v -6.0967 3.3381 8.4172 +v -6.1778 2.9019 7.4179 +v -6.0505 3.0429 7.5998 +v -6.5458 2.9346 7.8904 +v -6.4009 3.0757 8.0599 +v -7.2045 2.9968 8.8656 +v -7.0261 3.1389 9.0147 +v -6.7267 3.1080 8.5316 +v -6.8887 2.9665 8.3729 +v -6.8396 3.2750 9.1712 +v -6.5581 3.2434 8.6978 +v -6.3826 3.3716 8.8649 +v -6.6442 3.4042 9.3282 +v -7.7474 3.2157 10.5340 +v -7.9689 3.0719 10.4065 +v -7.5144 3.3534 10.6704 +v -7.3194 3.3310 10.1576 +v -7.5383 3.1936 10.0159 +v -7.7466 3.0502 9.8822 +v -7.0117 3.6085 10.9429 +v -7.2693 3.4846 10.8089 +v -6.8470 3.5853 10.4380 +v -7.0893 3.4618 10.3006 +v -6.8803 3.4346 9.8069 +v -6.6555 3.5572 9.9497 +v -7.0939 3.3045 9.6579 +v -7.4911 3.0249 9.3686 +v -7.2972 3.1677 9.5095 +v -6.7408 3.7246 11.0655 +v -6.4560 3.8324 11.1699 +v -6.3225 3.8077 10.6683 +v -6.5917 3.7008 10.5629 +v -6.1568 3.9313 11.2495 +v -6.0382 3.9054 10.7471 +v -5.9007 3.8724 10.2678 +v -6.1673 3.7769 10.1879 +v -6.4184 3.6715 10.0793 +v -6.0981 1.3577 5.2312 +v -5.5585 1.3292 4.6743 +v -5.6137 1.1448 4.5854 +v -6.1599 1.1702 5.1490 +v -4.4668 1.2706 3.6058 +v -5.0118 1.2999 4.1301 +v -4.5093 1.0922 3.5034 +v -5.0606 1.1185 4.0344 +v -4.5838 0.7293 3.3449 +v -5.1446 0.7481 3.8853 +v -5.1053 0.9344 3.9527 +v -4.5487 0.9117 3.4164 +v -5.7073 0.7668 4.4458 +v -5.6637 0.9571 4.5091 +v -6.2152 0.9791 5.0781 +v -6.2630 0.7848 5.0190 +v -3.9321 1.2422 3.1089 +v -3.4163 1.2153 2.6467 +v -3.4469 1.0424 2.5311 +v -3.9685 1.0666 2.9998 +v -2.9280 1.1909 2.2266 +v -2.9533 1.0204 2.1046 +v -3.0016 0.6779 1.9186 +v -2.9783 0.8494 2.0020 +v -3.5035 0.6937 2.3542 +v -3.4764 0.8685 2.4336 +v -4.0028 0.8895 2.9075 +v -4.0339 0.7110 2.8321 +v -3.0491 0.1616 1.7813 +v -3.5573 0.1657 2.2228 +v -3.5452 0.3421 2.2489 +v -3.0383 0.3339 1.8085 +v -4.6508 0.1751 3.2250 +v -4.0942 0.1703 2.7064 +v -4.6361 0.3607 3.2491 +v -4.0808 0.3512 2.7315 +v -4.0603 0.5315 2.7734 +v -4.6134 0.5455 3.2891 +v -3.5269 0.5182 2.2927 +v -3.0221 0.5060 1.8542 +v -5.2182 0.1800 3.7711 +v -5.7876 0.1849 4.3376 +v -5.7704 0.3801 4.3596 +v -5.2023 0.3704 3.7942 +v -6.3499 0.1896 4.9172 +v -6.3314 0.3895 4.9380 +v -6.3021 0.5881 4.9721 +v -5.7432 0.5743 4.3958 +v -5.1773 0.5600 3.8323 +v -6.9887 1.9475 18.7921 +v -6.4590 1.9871 19.0103 +v -7.4996 1.9029 18.4985 +v -7.5490 1.6497 18.6584 +v -7.0284 1.6889 18.9630 +v -6.4892 1.7236 19.1904 +v -8.4386 1.8058 17.7148 +v -7.9852 1.8551 18.1370 +v -8.5068 1.5643 17.8488 +v -8.0441 1.6076 18.2844 +v -8.6094 1.0577 18.0605 +v -8.1322 1.0877 18.5159 +v -8.0930 1.3513 18.4109 +v -8.5636 1.3144 17.9643 +v -7.6223 1.1168 18.9080 +v -7.5898 1.3871 18.7951 +v -6.5335 1.1679 19.4706 +v -6.5139 1.4500 19.3440 +v -7.0611 1.4204 19.1087 +v -7.0870 1.1439 19.2290 +v -8.8533 1.7569 17.2394 +v -9.2227 1.7103 16.7181 +v -9.3076 1.4803 16.8233 +v -8.9302 1.5213 17.3592 +v -9.7984 1.6313 15.5677 +v -9.5399 1.6678 16.1585 +v -9.8965 1.4107 15.6435 +v -9.6319 1.4429 16.2488 +v -10.0476 0.9513 15.7693 +v -9.7731 0.9736 16.3964 +v -9.7097 1.2111 16.3285 +v -9.9796 1.1837 15.7111 +v -9.4371 0.9995 16.9927 +v -9.3790 1.2430 16.9151 +v -8.9946 1.2779 17.4630 +v -9.0468 1.0279 17.5501 +v -9.8784 0.2382 16.5174 +v -10.1613 0.2324 15.8746 +v -9.5328 0.2448 17.1291 +v -9.5138 0.4992 17.1007 +v -9.8574 0.4860 16.4920 +v -10.1386 0.4745 15.8523 +v -8.6836 0.2598 18.2260 +v -9.1320 0.2521 17.7013 +v -8.6691 0.5290 18.1921 +v -9.1152 0.5138 17.6702 +v -9.0869 0.7728 17.6195 +v -8.6445 0.7954 18.1367 +v -9.4820 0.7512 17.0549 +v -10.1007 0.7145 15.8168 +v -9.8223 0.7315 16.4513 +v -8.1951 0.2675 18.6949 +v -7.6740 0.2750 19.0997 +v -7.6641 0.5592 19.0609 +v -8.1829 0.5443 18.6584 +v -6.5642 0.2881 19.6844 +v -7.1279 0.2819 19.4323 +v -6.5584 0.5853 19.6413 +v -7.1201 0.5730 19.3912 +v -7.1066 0.8609 19.3233 +v -6.5482 0.8792 19.5699 +v -7.6470 0.8403 18.9968 +v -8.1620 0.8182 18.5986 +v -9.9914 1.6025 14.9533 +v -10.1213 1.5803 14.3204 +v -10.2278 1.3658 14.3687 +v -10.0943 1.3854 15.0150 +v -10.2006 1.5509 13.0202 +v -10.1903 1.5636 13.6743 +v -10.3108 1.3398 13.0433 +v -10.2992 1.3510 13.7097 +v -10.4832 0.9019 13.0869 +v -10.4689 0.9097 13.7729 +v -10.3921 1.1327 13.7430 +v -10.4052 1.1232 13.0659 +v -10.3931 0.9200 14.4522 +v -10.3184 1.1454 14.4130 +v -10.1817 1.1621 15.0708 +v -10.2535 0.9337 15.1194 +v -10.1545 1.5413 12.3632 +v -10.0543 1.5335 11.7086 +v -10.1643 1.3245 11.7093 +v -10.2651 1.3314 12.3748 +v -9.9021 1.5263 11.0617 +v -10.0107 1.3182 11.0522 +v -10.1821 0.8869 11.0421 +v -10.1042 1.1047 11.0459 +v -10.3374 0.8913 11.7161 +v -10.2588 1.1101 11.7121 +v -10.3600 1.1160 12.3872 +v -10.4386 0.8960 12.3995 +v -10.3160 0.2158 11.0399 +v -10.4720 0.2169 11.7282 +v -10.4445 0.4438 11.7250 +v -10.2886 0.4416 11.0398 +v -10.6159 0.2197 13.1290 +v -10.5728 0.2182 12.4263 +v -10.5890 0.4493 13.1195 +v -10.5455 0.4462 12.4200 +v -10.5006 0.6725 12.4108 +v -10.5446 0.6770 13.1051 +v -10.3995 0.6689 11.7207 +v -10.2438 0.6656 11.0403 +v -10.5988 0.2217 13.8306 +v -10.5191 0.2244 14.5258 +v -10.4936 0.4585 14.5098 +v -10.5725 0.4532 13.8179 +v -10.3741 0.2279 15.2089 +v -10.3498 0.4655 15.1897 +v -10.3096 0.7011 15.1595 +v -10.4516 0.6908 14.4848 +v -10.5291 0.6829 13.7982 +v -2.7994 2.1097 18.7191 +v -2.3663 2.1138 18.5245 +v -3.2688 2.1037 18.8932 +v -3.2531 1.8252 19.0913 +v -2.7797 1.8301 18.9153 +v -2.3440 1.8332 18.7179 +v -4.2885 2.0830 19.1445 +v -3.7675 2.0951 19.0380 +v -4.2847 1.8076 19.3428 +v -3.7571 1.8179 19.2368 +v -4.2814 1.2257 19.6546 +v -3.7451 1.2327 19.5506 +v -3.7499 1.5299 19.4080 +v -4.2825 1.5212 19.5131 +v -3.2340 1.2374 19.4049 +v -3.2417 1.5359 19.2623 +v -2.3163 1.2420 19.0251 +v -2.3276 1.5420 18.8852 +v -2.7653 1.5397 19.0850 +v -2.7553 1.2404 19.2267 +v -4.8251 2.0669 19.2039 +v -5.3703 2.0461 19.2073 +v -5.3823 1.7753 19.4000 +v -4.8288 1.7936 19.4002 +v -5.9172 2.0197 19.1458 +v -5.9381 1.7522 19.3331 +v -5.9689 1.1877 19.6249 +v -5.9552 1.4743 19.4930 +v -5.4005 1.2037 19.7008 +v -5.3923 1.4940 19.5647 +v -4.8323 1.5094 19.5684 +v -4.8356 1.2162 19.7077 +v -5.9905 0.2932 19.8479 +v -5.4141 0.2973 19.9317 +v -5.4114 0.6035 19.8849 +v -5.9864 0.5954 19.8028 +v -4.2819 0.3029 19.8964 +v -4.8421 0.3005 19.9449 +v -4.2815 0.6148 19.8471 +v -4.8407 0.6099 19.8967 +v -4.8385 0.9158 19.8174 +v -4.2812 0.9230 19.7662 +v -5.4069 0.9063 19.8078 +v -5.9792 0.8942 19.7283 +v -3.7407 0.3046 19.7954 +v -3.2257 0.3058 19.6508 +v -3.2267 0.6206 19.6004 +v -3.7411 0.6182 19.7454 +v -2.3033 0.3068 19.2670 +v -2.7442 0.3065 19.4717 +v -2.3050 0.6226 19.2173 +v -2.7456 0.6220 19.4214 +v -2.7490 0.9339 19.3393 +v -2.3091 0.9349 19.1362 +v -3.2292 0.9317 19.5181 +v -3.7424 0.9282 19.6634 +v -6.9514 1.7789 6.5172 +v -7.4091 1.8053 7.0626 +v -7.3049 1.9833 7.1488 +v -6.8564 1.9552 6.6120 +v -8.2343 1.8509 8.1656 +v -7.8377 1.8293 7.6114 +v -8.1131 2.0324 8.2357 +v -7.7247 2.0090 7.6894 +v -7.8434 2.3766 8.4018 +v -7.4745 2.3503 7.8725 +v -7.6035 2.1826 7.7761 +v -7.9827 2.2075 8.3140 +v -7.0756 2.3217 7.3496 +v -7.1936 2.1553 7.2442 +v -6.7556 2.1259 6.7166 +v -6.6493 2.2911 6.8320 +v -8.5963 1.8701 8.7274 +v -8.9209 1.8870 9.2988 +v -8.7854 2.0716 9.3524 +v -8.4676 2.0532 8.7894 +v -9.2052 1.9014 9.8821 +v -9.0638 2.0874 9.9267 +v -8.7449 2.4400 10.0410 +v -8.9103 2.2669 9.9792 +v -8.4811 2.4217 9.4848 +v -8.6387 2.2498 9.4140 +v -8.3287 2.2299 8.8595 +v -8.1798 2.4005 8.9388 +v -8.1797 2.9226 10.2948 +v -7.9454 2.9015 9.7634 +v -8.1342 2.7473 9.6583 +v -8.3794 2.7676 10.1975 +v -7.3758 2.8498 8.7307 +v -7.6767 2.8771 9.2421 +v -7.5396 2.6975 8.6091 +v -7.8535 2.7238 9.1290 +v -8.0213 2.5650 9.0283 +v -7.6956 2.5399 8.4998 +v -8.3129 2.5874 9.5658 +v -8.5679 2.6068 10.1134 +v -7.0449 2.8202 8.2286 +v -6.6862 2.7889 7.7355 +v -6.8215 2.6383 7.5944 +v -7.1949 2.6689 8.0978 +v -6.3018 2.7564 7.2510 +v -6.4220 2.6062 7.0983 +v -6.5379 2.4512 6.9589 +v -6.9515 2.4827 7.4661 +v -7.3382 2.5123 7.9794 +v -0.2392 2.1194 17.3522 +v 0.0000 2.1192 17.3214 +v -0.4838 2.1197 17.4355 +v -0.4741 1.8342 17.6050 +v -0.2342 1.8335 17.5196 +v 0.0000 1.8332 17.4880 +v -1.0107 2.1200 17.7227 +v -0.7392 2.1200 17.5620 +v -0.9929 1.8357 17.8994 +v -0.7251 1.8350 17.7348 +v -0.9705 1.2408 18.1767 +v -0.7074 1.2396 18.0046 +v -0.7147 1.5410 17.8825 +v -0.9798 1.5421 18.0510 +v -0.4618 1.2385 17.8687 +v -0.4669 1.5400 17.7496 +v 0.0000 1.2373 17.7459 +v 0.0000 1.5388 17.6296 +v -0.2306 1.5391 17.6620 +v -0.2280 1.2377 17.7791 +v -1.3038 2.1196 17.9085 +v -1.6239 2.1186 18.1101 +v -1.6013 1.8359 18.2956 +v -1.2831 1.8361 18.0895 +v -1.9762 2.1167 18.3185 +v -1.9531 1.8351 18.5082 +v -1.9242 1.2426 18.8092 +v -1.9360 1.5431 18.6722 +v -1.5731 1.2425 18.5891 +v -1.5847 1.5434 18.4556 +v -1.2678 1.5429 18.2453 +v -1.2572 1.2418 18.3749 +v -1.9105 0.3068 19.0458 +v -1.5596 0.3067 18.8190 +v -1.5614 0.6225 18.7719 +v -1.9123 0.6228 18.9973 +v -0.9598 0.3059 18.3911 +v -1.2447 0.3063 18.5971 +v -0.9613 0.6211 18.3475 +v -1.2464 0.6219 18.5517 +v -1.2503 0.9342 18.4773 +v -0.9646 0.9333 18.2758 +v -1.5656 0.9350 18.6949 +v -1.9166 0.9353 18.9179 +v -0.6989 0.3055 18.2118 +v -0.4559 0.3051 18.0698 +v -0.4567 0.6196 18.0292 +v -0.7000 0.6204 18.1698 +v 0.0000 0.3047 17.9411 +v -0.2250 0.3049 17.9760 +v 0.0000 0.6189 17.9018 +v -0.2254 0.6191 17.9363 +v -0.2263 0.9305 17.8706 +v 0.0000 0.9302 17.8367 +v -0.4586 0.9312 17.9620 +v -0.7027 0.9322 18.1005 +v -0.2491 1.4419 1.0355 +v 0.0000 1.4415 1.0222 +v -0.5035 1.4435 1.0790 +v -0.5037 1.6103 1.3022 +v -0.2493 1.6087 1.2602 +v 0.0000 1.6083 1.2474 +v -1.0496 1.4524 1.2710 +v -0.7685 1.4469 1.1563 +v -1.0487 1.6193 1.4878 +v -0.7685 1.6137 1.3769 +v -1.0542 1.9534 1.9866 +v -0.7742 1.9479 1.8828 +v -0.7704 1.7809 1.6193 +v -1.0502 1.7865 1.7266 +v -0.5083 1.9446 1.8130 +v -0.5053 1.7775 1.5471 +v 0.0000 1.9426 1.7619 +v -0.0000 1.7755 1.4942 +v -0.2502 1.7759 1.5065 +v -0.2518 1.9430 1.7739 +v -1.3520 1.4607 1.4266 +v -1.6811 1.4721 1.6267 +v -1.6760 1.6392 1.8329 +v -1.3495 1.6277 1.6387 +v -2.0421 1.4871 1.8749 +v -2.0335 1.6545 2.0740 +v -2.0257 1.9878 2.5354 +v -2.0280 1.8215 2.2943 +v -1.6752 1.9728 2.3095 +v -1.6741 1.8063 2.0606 +v -1.3498 1.7948 1.8726 +v -1.3530 1.9616 2.1277 +v -2.0385 2.4785 3.3794 +v -1.6979 2.4654 3.1778 +v -1.6871 2.3028 2.8686 +v -2.0309 2.3166 3.0784 +v -1.0813 2.4479 2.8878 +v -1.3801 2.4553 3.0148 +v -1.0697 2.2846 2.5679 +v -1.3681 2.2923 2.6994 +v -1.3591 2.1275 2.4035 +v -1.0607 2.1196 2.2672 +v -1.6796 2.1385 2.5790 +v -2.0266 2.1529 2.7969 +v -0.7977 2.4429 2.7939 +v -0.5254 2.4397 2.7304 +v -0.5184 2.2762 2.4054 +v -0.7879 2.2794 2.4709 +v 0.0000 2.4377 2.6835 +v -0.2608 2.4381 2.6945 +v 0.0000 2.2743 2.3573 +v -0.2571 2.2747 2.3686 +v -0.2541 2.1095 2.0615 +v -0.0000 2.1091 2.0499 +v -0.5127 2.1110 2.0994 +v -0.7800 2.1143 2.1669 +v 5.7868 2.8690 6.9550 +v 5.8939 2.7232 6.7745 +v 5.4647 2.6900 6.3057 +v 5.3747 2.8366 6.5017 +v 5.9984 2.5731 6.6087 +v 5.5531 2.5392 6.1250 +v 5.0930 2.5053 5.6524 +v 5.0205 2.6571 5.8491 +v 4.9477 2.8050 6.0619 +v 6.1979 2.2587 6.3182 +v 5.7241 2.2247 5.8071 +v 5.6397 2.3842 5.9591 +v 6.0999 2.4183 6.4569 +v 5.2354 2.1899 5.3046 +v 5.1648 2.3496 5.4711 +v 4.2430 2.1208 4.3498 +v 4.1989 2.2818 4.5466 +v 4.6821 2.3153 4.9984 +v 4.7391 2.1550 4.8169 +v 4.1556 2.4397 4.7603 +v 4.6249 2.4719 5.1957 +v 4.0729 2.7458 5.2391 +v 4.5117 2.7746 5.6397 +v 4.5680 2.6250 5.4094 +v 4.1136 2.5944 4.9910 +v 6.2921 2.0943 6.1919 +v 5.8058 2.0608 5.6684 +v 6.3821 1.9248 6.0770 +v 5.8845 1.8922 5.5421 +v 5.3717 1.8583 5.0140 +v 5.3044 2.0261 5.1525 +v 6.5476 1.5701 5.8786 +v 6.0310 1.5408 5.3243 +v 5.9597 1.7189 5.4277 +v 6.4674 1.7501 5.9729 +v 5.4990 1.5099 4.7755 +v 5.4367 1.6862 4.8885 +v 4.4226 1.4465 3.7236 +v 4.3778 1.6195 3.8566 +v 4.9066 1.6528 4.3625 +v 4.9601 1.4781 4.2395 +v 4.3327 1.7896 4.0050 +v 4.8517 1.8238 4.4994 +v 4.7958 1.9912 4.6507 +v 4.2877 1.9568 4.1693 +v 2.4568 1.3380 2.0047 +v 2.4405 1.5062 2.1748 +v 2.8815 1.5298 2.5299 +v 2.9037 1.3607 2.3683 +v 2.4270 1.6739 2.3656 +v 2.8618 1.6980 2.7113 +v 3.3297 1.7259 3.1043 +v 3.3569 1.5572 2.9333 +v 3.3859 1.3870 2.7807 +v 2.4090 2.0068 2.8087 +v 2.8299 2.0304 3.1328 +v 2.8445 1.8649 2.9123 +v 2.4165 1.8409 2.5770 +v 3.2809 2.0577 3.5017 +v 3.3043 1.8928 3.2937 +v 3.7879 1.9237 3.7149 +v 3.7544 2.0882 3.9094 +v 3.8227 1.7567 3.5378 +v 3.8950 1.4158 3.2349 +v 3.8584 1.5874 3.3778 +v 2.4046 2.1713 3.0604 +v 2.8180 2.1941 3.3727 +v 2.4035 2.3342 3.3317 +v 2.8091 2.3558 3.6317 +v 3.2409 2.3811 3.9731 +v 3.2597 2.2206 3.7282 +v 2.4112 2.6536 3.9323 +v 2.8005 2.6724 4.2066 +v 2.8032 2.5154 3.9097 +v 2.4056 2.4950 3.6224 +v 3.2112 2.6943 4.5185 +v 3.2247 2.5390 4.2366 +v 3.6636 2.5655 4.5985 +v 3.6374 2.7189 4.8640 +v 3.6920 2.4092 4.3510 +v 3.7224 2.2500 4.1214 +v 8.5188 3.0610 14.6532 +v 8.3736 3.1214 14.8222 +v 8.4663 3.0376 15.0557 +v 8.6327 2.9861 14.7425 +v 8.1557 3.2025 15.0437 +v 8.2430 3.1095 15.3407 +v 8.3571 2.9938 15.5908 +v 8.5961 2.9272 15.2403 +v 8.7831 2.8758 14.8571 +v 7.5863 3.3806 15.5003 +v 7.6582 3.2749 15.8731 +v 7.9713 3.1903 15.6161 +v 7.8909 3.2905 15.2749 +v 7.7467 3.1488 16.2042 +v 8.0721 3.0692 15.9129 +v 7.9530 2.8407 16.7607 +v 8.3082 2.7698 16.4011 +v 8.1867 2.9286 16.1723 +v 7.8466 3.0036 16.4985 +v 8.6228 2.7025 16.0010 +v 8.4865 2.8575 15.8087 +v 9.1079 2.5917 15.0921 +v 8.9442 2.7433 14.9756 +v 8.7407 2.7943 15.4092 +v 8.8912 2.6420 15.5636 +v 7.2490 3.4684 15.7043 +v 7.3107 3.3580 16.1030 +v 6.8848 3.5517 15.8803 +v 6.9349 3.4374 16.2998 +v 6.9968 3.3035 16.6819 +v 7.3861 3.2277 16.4624 +v 6.0984 3.6974 16.1225 +v 6.1228 3.5767 16.5697 +v 6.5370 3.5111 16.4574 +v 6.4994 3.6287 16.0219 +v 6.1561 3.4367 16.9824 +v 6.5847 3.3740 16.8571 +v 6.2408 3.1023 17.7093 +v 6.7005 3.0452 17.5558 +v 6.6401 3.2184 17.2227 +v 6.1962 3.2783 17.3619 +v 7.1431 2.9809 17.3432 +v 7.0672 3.1510 17.0289 +v 7.4714 3.0786 16.7858 +v 7.5626 2.9119 17.0764 +v 6.4231 2.2388 18.8041 +v 6.9415 2.1949 18.5966 +v 6.8865 2.4292 18.3769 +v 6.3812 2.4770 18.5721 +v 7.4412 2.1454 18.3160 +v 7.3734 2.3754 18.1112 +v 7.2992 2.5921 17.8822 +v 6.8263 2.6497 18.1313 +v 6.3355 2.7008 18.3131 +v 8.3588 2.0376 17.5630 +v 8.2669 2.2584 17.3943 +v 7.8356 2.3177 17.7816 +v 7.9158 2.0923 17.9691 +v 8.1665 2.4667 17.2061 +v 7.7479 2.5303 17.5719 +v 7.6558 2.7287 17.3376 +v 8.0607 2.6613 16.9957 +v 7.2214 2.7942 17.6269 +v 6.2880 2.9096 18.0260 +v 6.7635 2.8553 17.8581 +v 8.7637 1.9834 17.1046 +v 8.6610 2.1996 16.9558 +v 9.1241 1.9318 16.6008 +v 9.0117 2.1435 16.4724 +v 8.8886 2.3437 16.3309 +v 8.5487 2.4037 16.7905 +v 9.6853 1.8443 15.4850 +v 9.5573 2.0487 15.3967 +v 9.3125 2.0925 15.9506 +v 9.4334 1.8848 16.0587 +v 9.4168 2.2426 15.3021 +v 9.1800 2.2892 15.8329 +v 9.0386 2.4730 15.7044 +v 9.2662 2.4242 15.2008 +v 8.7579 2.5306 16.1744 +v 8.4300 2.5943 16.6064 +v 2.4203 2.8096 4.2609 +v 2.8011 2.8268 4.5222 +v 2.4332 2.9626 4.6084 +v 2.8056 2.9781 4.8565 +v 3.1942 2.9959 5.1377 +v 3.2007 2.8468 4.8188 +v 2.4720 3.2582 5.3598 +v 2.8294 3.2696 5.5818 +v 2.8148 3.1258 5.2097 +v 2.4503 3.1122 4.9747 +v 3.1970 3.2821 5.8312 +v 3.1926 3.1411 5.4752 +v 3.9430 3.3110 6.4017 +v 3.9675 3.1772 6.0869 +v 3.5785 3.1583 5.7685 +v 3.5698 3.2960 6.1055 +v 3.9983 3.0379 5.7877 +v 3.5935 3.0158 5.4491 +v 3.6136 2.8692 5.1476 +v 4.0340 2.8939 5.5049 +v 2.4986 3.4001 5.7637 +v 2.8500 3.4090 5.9728 +v 2.5305 3.5375 6.1865 +v 2.8772 3.5437 6.3828 +v 3.2281 3.5496 6.5996 +v 3.2084 3.4184 6.2059 +v 2.6116 3.7975 7.0886 +v 2.9545 3.7971 7.2601 +v 2.9119 3.6732 6.8119 +v 2.5681 3.6701 6.6281 +v 3.2971 3.7947 7.4452 +v 3.2573 3.6751 7.0126 +v 3.9599 3.7818 7.8332 +v 3.9312 3.6741 7.4451 +v 3.5989 3.6756 7.2252 +v 3.6341 3.7898 7.6380 +v 3.9212 3.5596 7.0786 +v 3.5779 3.5549 6.8329 +v 3.5689 3.4283 6.4599 +v 3.9263 3.4385 6.7316 +v 4.9681 3.7269 8.4781 +v 5.0384 3.6734 8.3553 +v 4.8073 3.6643 8.1100 +v 4.7961 3.7405 8.3644 +v 5.1329 3.5947 8.1836 +v 4.8624 3.5776 7.8789 +v 4.5680 3.5685 7.5988 +v 4.5434 3.6665 7.8898 +v 4.5514 3.7562 8.2051 +v 5.3456 3.3925 7.7821 +v 5.0170 3.3670 7.4072 +v 4.9344 3.4781 7.6440 +v 5.2367 3.5003 7.9896 +v 4.6708 3.3456 7.0524 +v 4.6128 3.4616 7.3209 +v 4.2755 3.4490 7.0177 +v 4.3114 3.3272 6.7173 +v 4.2527 3.5633 7.3330 +v 4.2691 3.7703 8.0251 +v 4.2487 3.6704 7.6674 +v 5.4561 3.2739 7.5698 +v 5.1036 3.2459 7.1706 +v 5.5670 3.1460 7.3578 +v 5.1929 3.1160 6.9382 +v 4.8033 3.0880 6.5349 +v 4.7348 3.2206 6.7894 +v 5.2837 2.9791 6.7139 +v 5.6775 3.0105 7.1512 +v 4.8747 2.9490 6.2915 +v 4.4563 2.9206 5.8873 +v 4.4033 3.0620 6.1505 +v 4.3545 3.1979 6.4277 +v 2.9783 4.4581 11.3096 +v 2.9889 4.4673 11.8794 +v 3.3738 4.4368 11.9872 +v 3.3597 4.4287 11.4173 +v 2.9872 4.4562 12.4497 +v 3.3743 4.4254 12.5597 +v 3.7637 4.3899 12.6640 +v 3.7600 4.4013 12.0909 +v 3.7418 4.3941 11.5225 +v 2.9518 4.3746 13.5730 +v 3.3415 4.3451 13.6922 +v 3.3630 4.3947 13.1298 +v 2.9744 4.4252 13.0159 +v 3.7354 4.3121 13.8024 +v 3.7548 4.3602 13.2363 +v 4.5274 4.2321 13.9791 +v 4.5394 4.2757 13.4104 +v 4.1477 4.3208 13.3312 +v 4.1315 4.2747 13.8994 +v 4.5405 4.3024 12.8378 +v 4.1531 4.3492 12.7582 +v 4.4994 4.3062 11.7056 +v 4.1224 4.3535 11.6203 +v 4.1455 4.3601 12.1859 +v 4.5281 4.3125 12.2676 +v 2.9207 4.3048 14.1163 +v 3.3112 4.2767 14.2418 +v 2.8824 4.2161 14.6410 +v 3.2739 4.1898 14.7734 +v 3.6726 4.1613 14.8938 +v 3.7074 4.2457 14.3567 +v 2.7895 3.9837 15.6150 +v 3.1844 3.9618 15.7620 +v 3.2311 4.0848 15.2819 +v 2.8383 4.1089 15.1421 +v 3.5907 3.9385 15.8946 +v 3.6331 4.0588 15.4083 +v 4.4256 3.8823 16.0976 +v 4.4537 3.9966 15.6034 +v 4.0415 4.0298 15.5169 +v 4.0055 3.9124 16.0080 +v 4.4819 4.0928 15.0817 +v 4.0761 4.1293 14.9980 +v 4.1068 4.2109 14.4569 +v 4.5073 4.1712 14.5382 +v 6.0849 3.7980 15.6395 +v 5.6852 3.8599 15.6858 +v 5.6874 3.7558 16.1757 +v 6.0780 3.8797 15.1274 +v 5.6880 3.9453 15.1678 +v 5.2903 4.0019 15.1708 +v 5.2783 3.9129 15.6923 +v 5.2696 3.8053 16.1861 +v 6.0662 3.9911 14.0432 +v 5.6926 4.0637 14.0737 +v 5.6918 4.0129 14.6282 +v 6.0732 3.9437 14.5931 +v 5.3102 4.1275 14.0704 +v 5.3021 4.0732 14.6280 +v 4.9065 4.1256 14.5967 +v 4.9211 4.1833 14.0375 +v 4.8874 4.0507 15.1407 +v 4.8480 3.8471 16.1585 +v 4.8669 3.9581 15.6634 +v 6.0525 4.0231 13.4846 +v 5.6865 4.0987 13.5108 +v 6.0277 4.0409 12.9239 +v 5.6695 4.1188 12.9461 +v 5.3008 4.1880 12.9362 +v 5.3109 4.1655 13.5043 +v 5.9272 4.0385 11.8236 +v 5.5866 4.1185 11.8375 +v 5.6375 4.1251 12.3861 +v 5.9874 4.0456 12.3680 +v 5.2336 4.1894 11.8192 +v 5.2762 4.1957 12.3723 +v 4.9057 4.2579 12.3313 +v 4.8705 4.2517 11.7735 +v 4.9238 4.2489 12.8986 +v 4.9279 4.2242 13.4695 +v 8.1561 3.0894 10.9419 +v 8.3060 3.1019 11.4884 +v 8.5367 2.9525 11.3901 +v 8.3775 2.9398 10.8369 +v 8.4206 3.1095 12.0356 +v 8.6581 2.9611 11.9445 +v 8.8817 2.8063 11.8725 +v 8.7543 2.7969 11.3087 +v 8.5869 2.7843 10.7474 +v 8.5514 3.1093 13.0897 +v 8.7916 2.9674 13.0170 +v 8.7428 2.9659 12.4901 +v 8.5018 3.1120 12.5729 +v 9.0170 2.8184 12.9725 +v 8.9693 2.8132 12.4301 +v 9.4252 2.4972 12.9439 +v 9.3793 2.4866 12.3634 +v 9.1814 2.6535 12.3891 +v 9.2280 2.6619 12.9502 +v 9.2871 2.4770 11.7764 +v 9.0914 2.6450 11.8173 +v 8.9687 2.4551 10.6088 +v 8.7840 2.6228 10.6719 +v 8.9587 2.6351 11.2424 +v 9.1498 2.4670 11.1894 +v 8.5715 3.1012 13.5754 +v 8.8055 2.9658 13.5153 +v 8.5677 3.0891 14.0145 +v 8.7858 2.9644 13.9741 +v 8.9909 2.8305 13.9807 +v 9.0249 2.8228 13.4910 +v 8.7337 2.9664 14.3826 +v 8.5459 3.0744 14.3913 +v 8.9125 2.8459 14.4366 +v 9.2671 2.5548 14.5900 +v 9.0917 2.7082 14.5093 +v 9.3715 2.5286 14.0616 +v 9.1861 2.6855 14.0138 +v 9.2306 2.6713 13.4929 +v 9.4234 2.5103 13.5114 +v 9.8732 1.8125 14.8869 +v 9.7398 2.0143 14.8171 +v 9.9994 1.7880 14.2695 +v 9.8621 1.9878 14.2171 +v 9.7108 2.1786 14.1643 +v 9.5931 2.2063 14.7442 +v 10.0749 1.7556 12.9975 +v 9.9341 1.9528 12.9765 +v 9.9262 1.9678 13.6018 +v 10.0659 1.7695 13.6379 +v 9.7786 2.1424 12.9591 +v 9.7720 2.1579 13.5675 +v 9.6041 2.3389 13.5368 +v 9.6089 2.3240 12.9475 +v 9.5468 2.3592 14.1121 +v 9.4349 2.3870 14.6684 +v 10.0287 1.7450 12.3534 +v 9.8881 1.9414 12.3463 +v 9.9294 1.7363 11.7108 +v 9.7901 1.9320 11.7166 +v 9.6366 2.1206 11.7281 +v 9.7329 2.1305 12.3442 +v 9.5800 1.7195 10.4510 +v 9.4466 1.9135 10.4793 +v 9.6423 1.9232 11.0925 +v 9.7791 1.7283 11.0749 +v 9.3001 2.1006 10.5140 +v 9.4917 2.1112 11.1163 +v 9.3275 2.2924 11.1480 +v 9.1408 2.2811 10.5567 +v 9.4689 2.3023 11.7474 +v 9.5632 2.3123 12.3491 +v 5.6986 3.6321 16.6309 +v 5.2678 3.6785 16.6459 +v 5.2719 3.5331 17.0725 +v 5.7172 3.4893 17.0524 +v 4.4002 3.7496 16.5581 +v 4.8339 3.7173 16.6199 +v 4.3775 3.5990 16.9859 +v 4.8240 3.5692 17.0485 +v 4.3400 3.2459 17.7473 +v 4.8147 3.2204 17.8107 +v 4.8178 3.4034 17.4452 +v 4.3575 3.4310 17.3820 +v 5.2930 3.1888 17.8300 +v 5.2807 3.3696 17.4669 +v 5.7416 3.3283 17.4412 +v 5.7700 3.1498 17.7984 +v 3.9703 3.7769 16.4655 +v 3.5475 3.8003 16.3474 +v 3.5042 3.6448 16.7676 +v 3.9363 3.6238 16.8904 +v 2.7373 3.8408 16.0547 +v 3.1354 3.8212 16.2087 +v 2.6833 3.6805 16.4625 +v 3.0853 3.6633 16.6231 +v 2.5749 3.3101 17.1871 +v 2.9863 3.2974 17.3597 +v 3.0352 3.4886 17.0063 +v 2.6287 3.5035 16.8395 +v 3.4208 3.2832 17.5151 +v 3.4617 3.4723 17.1565 +v 3.9040 3.4535 17.2838 +v 3.8737 3.2665 17.6465 +v 2.3953 2.3822 18.3064 +v 2.8253 2.3768 18.4975 +v 2.8580 2.6295 18.2520 +v 2.4321 2.6364 18.0648 +v 3.2895 2.3695 18.6692 +v 3.3158 2.6207 18.4205 +v 3.3471 2.8570 18.1460 +v 2.8965 2.8675 17.9813 +v 2.4752 2.8761 17.7985 +v 4.2942 2.3457 18.9192 +v 4.3021 2.5938 18.6678 +v 3.7993 2.6091 18.5618 +v 3.7813 2.3594 18.8126 +v 4.3124 2.8269 18.3893 +v 3.8210 2.8439 18.2845 +v 3.8459 3.0631 17.9798 +v 4.3249 3.0444 18.0828 +v 3.3823 3.0780 17.8445 +v 2.5233 3.1008 17.5063 +v 2.9397 3.0902 17.6843 +v 4.8215 2.3276 18.9803 +v 4.8180 2.5739 18.7301 +v 5.3565 2.3043 18.9873 +v 5.3407 2.5483 18.7404 +v 5.3242 2.7775 18.4658 +v 4.8154 2.8051 18.4523 +v 5.8639 2.5163 18.6905 +v 5.8926 2.2750 18.9314 +v 5.8328 2.7431 18.4221 +v 5.8010 2.9545 18.1250 +v 5.3079 2.9912 18.1627 +v 4.8141 3.0208 18.1462 +v 6.4746 3.7259 15.5490 +v 6.8496 3.6453 15.4211 +v 6.8237 3.7197 14.9293 +v 6.4578 3.8041 15.0455 +v 7.5359 3.4648 15.0810 +v 7.2049 3.5577 15.2628 +v 7.4992 3.5296 14.6224 +v 7.1721 3.6278 14.7858 +v 7.4348 3.6097 13.6167 +v 7.1144 3.7173 13.7542 +v 7.1440 3.6804 14.2806 +v 7.4681 3.5772 14.1318 +v 6.7785 3.8172 13.8761 +v 6.8018 3.7765 14.4119 +v 6.4441 3.8646 14.5185 +v 6.4286 3.9087 13.9749 +v 7.8377 3.3683 14.8825 +v 8.1068 3.2706 14.6852 +v 8.0792 3.3187 14.2738 +v 7.8014 3.4265 14.4461 +v 8.3399 3.1742 14.5068 +v 8.3334 3.2067 14.1221 +v 8.2961 3.2446 13.1966 +v 8.3220 3.2299 13.6810 +v 8.0252 3.3732 13.3272 +v 8.0558 3.3520 13.8182 +v 7.7716 3.4677 13.9731 +v 7.7382 3.4949 13.4708 +v 7.9227 3.2333 11.0638 +v 8.0623 3.2455 11.6054 +v 7.6770 3.3710 11.1959 +v 7.8055 3.3827 11.7342 +v 7.9039 3.3875 12.2754 +v 8.1691 3.2518 12.1484 +v 7.1475 3.6258 11.4637 +v 7.2526 3.6360 11.9995 +v 7.5357 3.5130 11.8679 +v 7.4187 3.5020 11.3315 +v 7.3321 3.6376 12.5424 +v 7.6249 3.5163 12.4092 +v 7.6908 3.5107 12.9465 +v 7.3911 3.6294 13.0842 +v 7.9758 3.3847 12.8097 +v 8.2461 3.2517 12.6823 +v 6.8631 3.7418 11.5857 +v 6.9563 3.7512 12.1223 +v 6.5651 3.8496 11.6909 +v 6.6467 3.8582 12.2292 +v 6.7061 3.8566 12.7776 +v 7.0258 3.7512 12.6676 +v 6.3238 3.9565 12.3134 +v 6.2532 3.9487 11.7725 +v 6.3733 3.9533 12.8654 +v 6.4066 3.9378 13.4216 +v 6.7483 3.8434 13.3290 +v 7.0767 3.7405 13.2141 +v 6.8964 0.1930 5.5026 +v 7.4180 0.1965 6.0864 +v 6.8766 0.3975 5.5221 +v 7.3970 0.4051 6.1045 +v 7.8894 0.4117 6.6880 +v 7.9115 0.1994 6.6716 +v 6.8029 0.8015 5.5975 +v 7.3181 0.8166 6.1739 +v 7.3634 0.6120 6.1338 +v 6.8451 0.6006 5.5539 +v 7.8055 0.8300 6.7510 +v 7.8537 0.6221 6.7146 +v 8.6849 0.8523 7.9184 +v 8.7384 0.6388 7.8901 +v 8.3131 0.6310 7.2991 +v 8.2621 0.8419 7.3316 +v 8.7777 0.4225 7.8696 +v 8.3507 0.4174 7.2754 +v 8.3739 0.2020 7.2609 +v 8.8020 0.2042 7.8571 +v 6.7510 0.9996 5.6523 +v 7.2621 1.0181 6.2243 +v 6.6904 1.1941 5.7178 +v 7.1965 1.2158 6.2843 +v 7.6752 1.2352 6.8512 +v 7.7457 1.0346 6.7967 +v 7.0402 1.5969 6.4313 +v 7.1222 1.4090 6.3535 +v 6.6223 1.3845 5.7934 +v 7.5060 1.6213 6.9847 +v 7.5950 1.4310 6.9141 +v 8.3460 1.6630 8.1029 +v 8.4477 1.4684 8.0466 +v 8.0378 1.4508 7.4776 +v 7.9422 1.6433 7.5411 +v 8.5387 1.2679 7.9968 +v 8.1236 1.2526 7.4212 +v 8.1987 1.0493 7.3724 +v 8.6180 1.0623 7.9540 +v 9.7003 1.5185 10.4276 +v 9.4510 1.5089 9.8115 +v 9.3343 1.7086 9.8441 +v 9.8066 1.3113 10.4087 +v 9.5544 1.3030 9.7841 +v 9.2570 1.2930 9.1756 +v 9.1572 1.4974 9.2110 +v 9.0449 1.6956 9.2521 +v 9.9751 0.8815 10.3828 +v 9.7188 0.8759 9.7436 +v 9.6439 1.0917 9.7615 +v 9.8984 1.0987 10.3940 +v 9.4162 0.8692 9.1216 +v 9.3436 1.0834 9.1458 +v 9.0007 1.0736 8.5442 +v 9.0706 0.8614 8.5141 +v 8.9175 1.2814 8.5808 +v 8.7145 1.6804 8.6725 +v 8.8218 1.4839 8.6235 +v 10.0359 0.6606 10.3749 +v 9.7782 0.6563 9.7300 +v 10.0801 0.4366 10.3699 +v 9.8217 0.4338 9.7207 +v 9.5163 0.4306 9.0895 +v 9.4741 0.6514 9.1028 +v 9.8483 0.2091 9.7153 +v 10.1072 0.2104 10.3671 +v 9.5423 0.2076 9.0815 +v 9.1925 0.2060 8.4631 +v 9.1673 0.4268 8.4734 +v 9.1264 0.6456 8.4904 +v 2.4091 4.0054 15.4582 +v 2.3568 3.8603 15.8904 +v 2.0413 4.0262 15.2988 +v 1.9917 3.8793 15.7235 +v 1.9394 3.7146 16.1176 +v 2.3022 3.6978 16.2914 +v 1.3367 4.0628 15.0011 +v 1.2986 3.9128 15.4115 +v 1.6396 3.8970 15.5613 +v 1.6845 4.0456 15.1441 +v 1.2581 3.7443 15.7933 +v 1.5922 3.7303 15.9490 +v 1.1751 3.3552 16.4736 +v 1.4952 3.3455 16.6390 +v 1.5436 3.5462 16.3079 +v 1.2166 3.5582 16.1470 +v 1.8329 3.3345 16.8186 +v 1.8859 3.5328 16.4823 +v 2.2466 3.5184 16.6622 +v 2.1916 3.3226 17.0040 +v 0.9962 4.0774 14.8772 +v 0.9663 3.9263 15.2817 +v 0.6611 4.0885 14.7794 +v 0.6405 3.9366 15.1792 +v 0.6186 3.7655 15.5519 +v 0.9344 3.7563 15.6583 +v 0.3192 3.9434 15.1117 +v 0.3296 4.0958 14.7150 +v 0.3080 3.7714 15.4818 +v 0.2850 3.3737 16.1433 +v 0.2965 3.5812 15.8255 +v 0.5735 3.3697 16.2175 +v 0.5961 3.5761 15.8979 +v 0.9017 3.5683 16.0077 +v 0.8690 3.3634 16.3303 +v 0.2457 2.3953 17.1601 +v 0.2538 2.6598 16.9434 +v 0.4965 2.3951 17.2412 +v 0.5124 2.6589 17.0227 +v 0.5310 2.9099 16.7796 +v 0.2633 2.9119 16.7019 +v 1.0339 2.3935 17.5216 +v 1.0631 2.6547 17.2969 +v 0.7806 2.6571 17.1434 +v 0.7575 2.3945 17.3647 +v 1.0972 2.9026 17.0478 +v 0.8075 2.9068 16.8977 +v 0.8373 3.1426 16.6268 +v 1.1349 3.1364 16.7736 +v 0.5516 3.1473 16.5113 +v 0.2738 3.1502 16.4353 +v 1.3308 2.3919 17.7031 +v 1.3648 2.6514 17.4744 +v 1.6532 2.3896 17.9003 +v 1.6903 2.6473 17.6673 +v 1.7335 2.8911 17.4100 +v 1.4044 2.8974 17.2214 +v 2.0445 2.6423 17.8670 +v 2.0064 2.3864 18.1043 +v 2.0890 2.8840 17.6052 +v 2.1386 3.1110 17.3179 +v 1.7816 3.1204 17.1275 +v 1.4483 3.1290 16.9432 +v 2.0495 2.6381 3.6996 +v 2.0640 2.7953 4.0386 +v 1.7119 2.6258 3.5061 +v 1.7293 2.7836 3.8530 +v 1.7499 2.9387 4.2185 +v 2.0822 2.9495 4.3963 +v 1.0953 2.6091 3.2265 +v 1.1119 2.7675 3.5833 +v 1.4129 2.7745 3.7019 +v 1.3950 2.6162 3.3492 +v 1.1309 2.9231 3.9582 +v 1.4337 2.9299 4.0731 +v 1.1753 3.2252 4.7631 +v 1.4833 3.2315 4.8708 +v 1.4572 3.0823 4.4627 +v 1.1521 3.0758 4.3515 +v 1.8009 3.2391 5.0054 +v 1.7738 3.0906 4.6026 +v 2.1041 3.1005 4.7728 +v 2.1298 3.2480 5.1680 +v 0.8094 2.6041 3.1355 +v 0.8232 2.7625 3.4948 +v 0.5339 2.6009 3.0737 +v 0.5437 2.7593 3.4345 +v 0.5547 2.9148 3.8130 +v 0.8388 2.9181 3.8722 +v 0.2703 2.7575 3.4000 +v 0.2652 2.5993 3.0386 +v 0.2760 2.9129 3.7790 +v 0.2891 3.2145 4.5909 +v 0.2823 3.0652 4.1759 +v 0.5801 3.2167 4.6243 +v 0.5669 3.0673 4.2095 +v 0.8561 3.0707 4.2676 +v 0.8748 3.2202 4.6813 +v 0.3197 3.7801 6.4376 +v 0.3116 3.6435 5.9475 +v 0.6400 3.7820 6.4696 +v 0.6242 3.6457 5.9798 +v 0.6088 3.5060 5.5092 +v 0.3038 3.5037 5.4765 +v 1.2852 3.7880 6.5957 +v 1.2555 3.6529 6.1094 +v 0.9385 3.6489 6.0338 +v 0.9616 3.7848 6.5223 +v 1.2272 3.5139 5.6420 +v 0.9162 3.5095 5.5643 +v 0.8949 3.3665 5.1135 +v 1.2004 3.3713 5.1933 +v 0.5941 3.3629 5.0574 +v 0.2963 3.3607 5.0244 +v 1.6113 3.7913 6.6893 +v 1.5760 3.6573 6.2066 +v 1.9407 3.7942 6.8028 +v 1.9011 3.6619 6.3255 +v 1.8646 3.5250 5.8668 +v 1.5429 3.5192 5.7427 +v 2.2315 3.6662 6.4660 +v 2.2739 3.7964 6.9360 +v 2.1934 3.5312 6.0146 +v 2.1595 3.3917 5.5820 +v 1.8312 3.3840 5.4268 +v 1.5119 3.3772 5.2974 +v 2.5998 4.4826 11.2043 +v 2.6076 4.4934 11.7721 +v 2.2237 4.5029 11.1042 +v 2.2294 4.5154 11.6685 +v 2.2253 4.5064 12.2294 +v 2.6044 4.4832 12.3383 +v 1.4777 4.5315 10.9304 +v 1.4804 4.5475 11.4856 +v 1.8538 4.5333 11.5720 +v 1.8498 4.5190 11.0120 +v 1.4764 4.5415 12.0341 +v 1.8495 4.5258 12.1267 +v 1.4499 4.4647 13.0977 +v 1.8185 4.4469 13.2063 +v 1.8375 4.4968 12.6727 +v 1.4660 4.5138 12.5725 +v 2.1911 4.4258 13.3250 +v 2.2123 4.4764 12.7829 +v 2.5910 4.4525 12.8988 +v 2.5686 4.4016 13.4490 +v 1.1070 4.5406 10.8620 +v 1.1088 4.5582 11.4127 +v 0.7374 4.5466 10.8097 +v 0.7384 4.5656 11.3565 +v 0.7360 4.5622 11.8941 +v 1.1054 4.5536 11.9553 +v 0.3690 4.5698 11.3202 +v 0.3685 4.5500 10.7762 +v 0.3677 4.5673 11.8543 +v 0.3605 4.4961 12.8832 +v 0.3649 4.5426 12.3761 +v 0.7217 4.4895 12.9311 +v 0.7304 4.5368 12.4198 +v 1.0972 4.5271 12.4867 +v 1.0846 4.4790 13.0043 +v 0.3391 4.2275 14.2913 +v 0.6797 4.2201 14.3521 +v 0.6962 4.3309 13.8998 +v 0.3475 4.3382 13.8432 +v 1.3714 4.1934 14.5613 +v 1.0233 4.2085 14.4443 +v 1.4021 4.3041 14.0953 +v 1.0473 4.3194 13.9859 +v 1.0679 4.4097 13.5050 +v 1.4285 4.3947 13.6063 +v 0.7103 4.4208 13.4253 +v 0.3546 4.4279 13.3730 +v 1.7254 4.1753 14.6963 +v 2.0869 4.1548 14.8426 +v 2.1276 4.2645 14.3589 +v 1.7618 4.2857 14.2217 +v 2.4574 4.1325 14.9935 +v 2.5008 4.2411 14.5007 +v 2.5382 4.3310 13.9844 +v 2.1626 4.3550 13.8517 +v 1.7931 4.3763 13.7238 +v 2.1545 0.1550 1.0540 +v 2.5785 0.1580 1.3893 +v 1.7711 0.1527 0.7726 +v 1.7640 0.3164 0.8038 +v 2.1462 0.3209 1.0838 +v 2.5690 0.3267 1.4177 +v 1.1032 0.1497 0.3603 +v 1.4226 0.1510 0.5423 +v 1.0985 0.3104 0.3942 +v 1.4168 0.3129 0.5749 +v 1.0837 0.6328 0.5301 +v 1.3979 0.6376 0.7060 +v 1.4082 0.4751 0.6294 +v 1.0918 0.4713 0.4508 +v 1.7411 0.6443 0.9297 +v 1.7537 0.4802 0.8560 +v 2.5372 0.6642 1.5329 +v 2.5548 0.4955 1.4655 +v 2.1339 0.4869 1.1337 +v 2.1189 0.6530 1.2042 +v 0.8071 0.1488 0.2238 +v 0.5283 0.1483 0.1298 +v 0.5260 0.3076 0.1658 +v 0.8036 0.3086 0.2588 +v 0.2613 0.1480 0.0757 +v 0.2601 0.3070 0.1123 +v 0.2565 0.6265 0.2578 +v 0.2584 0.4665 0.1730 +v 0.5187 0.6274 0.3091 +v 0.5227 0.4672 0.2256 +v 0.7985 0.4688 0.3172 +v 0.7925 0.6295 0.3988 +v 0.2496 1.2761 0.8333 +v 0.2507 1.1118 0.6543 +v 0.5046 1.2777 0.8784 +v 0.5071 1.1133 0.7010 +v 0.5105 0.9503 0.5469 +v 0.2524 0.9489 0.4986 +v 1.0530 1.2863 1.0766 +v 1.0589 1.1215 0.9055 +v 0.7746 1.1164 0.7836 +v 0.7706 1.2809 0.9583 +v 1.0665 0.9577 0.7574 +v 0.7800 0.9531 0.6321 +v 0.7861 0.7908 0.5038 +v 1.0750 0.7948 0.6323 +v 0.5145 0.7884 0.4163 +v 0.2544 0.7872 0.3663 +v 1.3574 1.2943 1.2369 +v 1.3656 1.1289 1.0701 +v 1.6892 1.3052 1.4426 +v 1.7002 1.1391 1.2811 +v 1.7133 0.9737 1.1419 +v 1.3757 0.9644 0.9262 +v 2.4759 1.1697 1.8558 +v 2.0685 1.1526 1.5418 +v 2.0538 1.3197 1.6973 +v 2.4964 1.0013 1.7277 +v 2.0850 0.9858 1.4080 +v 2.1022 0.8193 1.2956 +v 2.5173 0.8328 1.6202 +v 1.7273 0.8087 1.0249 +v 1.3868 0.8007 0.8049 +v 0.3279 3.9133 6.9472 +v 0.3360 4.0407 7.4729 +v 0.6722 4.0419 7.5036 +v 0.6562 3.9149 6.9785 +v 0.3508 4.2688 8.5590 +v 0.3437 4.1600 8.0113 +v 0.7019 4.2687 8.5889 +v 0.6876 4.1606 8.0415 +v 1.4054 4.2656 8.7017 +v 1.3772 4.1603 8.1566 +v 1.0321 4.1609 8.0903 +v 1.0533 4.2678 8.6369 +v 1.3471 4.0440 7.6221 +v 1.0092 4.0432 7.5536 +v 0.9854 3.9170 7.0299 +v 1.3161 3.9192 7.1008 +v 0.3571 4.3646 9.1128 +v 0.3624 4.4450 9.6691 +v 0.7249 4.4433 9.6996 +v 0.7145 4.3637 9.1427 +v 0.3662 4.5076 10.2247 +v 0.7328 4.5051 10.2563 +v 1.4678 4.4929 10.3715 +v 1.0999 4.5003 10.3061 +v 1.4518 4.4342 9.8119 +v 1.0880 4.4399 9.7478 +v 1.0722 4.3616 9.1904 +v 1.4306 4.3577 9.2544 +v 2.9540 4.4281 10.7453 +v 2.5797 4.4504 10.6397 +v 2.9186 4.3793 10.1882 +v 2.5496 4.3989 10.0800 +v 2.1824 4.4142 9.9799 +v 2.2075 4.4684 10.5406 +v 2.8242 4.2328 9.1019 +v 2.4675 4.2457 8.9834 +v 2.5115 4.3299 9.5272 +v 2.8745 4.3136 9.6398 +v 2.1123 4.2551 8.8763 +v 2.1501 4.3424 9.4244 +v 1.7898 4.3515 9.3329 +v 1.7584 4.2616 8.7819 +v 1.8165 4.4259 9.8899 +v 1.8369 4.4824 10.4505 +v 2.7703 4.1390 8.5762 +v 2.4197 4.1482 8.4504 +v 2.7152 4.0339 8.0643 +v 2.3701 4.0395 7.9302 +v 2.0272 4.0427 7.8112 +v 2.0708 4.1545 8.3378 +v 2.3208 3.9215 7.4247 +v 2.6615 3.9194 7.5678 +v 1.9833 3.9219 7.2988 +v 1.6485 3.9210 7.1907 +v 1.6863 4.0441 7.7083 +v 1.7234 4.1583 8.2395 +v 3.0059 3.9151 7.7275 +v 3.0630 4.0254 8.2127 +v 3.4090 4.0133 8.3690 +v 3.3489 3.9080 7.8977 +v 3.1826 4.2159 9.2306 +v 3.1229 4.1262 8.7142 +v 3.5395 4.1942 9.3630 +v 3.4738 4.1093 8.8578 +v 4.2370 4.1333 9.6135 +v 4.1556 4.0594 9.1363 +v 3.8192 4.0872 9.0007 +v 3.8920 4.1670 9.4928 +v 4.0782 3.9755 8.6799 +v 3.7489 3.9969 8.5269 +v 3.6856 3.8974 8.0723 +v 4.0109 3.8826 8.2452 +v 3.2390 4.2928 9.7606 +v 3.2894 4.3550 10.3026 +v 3.6597 4.3253 10.4175 +v 3.6026 4.2668 9.8833 +v 3.3306 4.4009 10.8553 +v 3.7072 4.3682 10.9643 +v 4.4517 4.2839 11.1578 +v 4.0817 4.3295 11.0669 +v 4.3893 4.2468 10.6257 +v 4.0271 4.2895 10.5271 +v 3.9626 4.2348 10.0020 +v 4.3163 4.1962 10.1104 +v 5.8426 4.0206 11.2974 +v 5.5128 4.0999 11.3068 +v 5.7378 3.9933 10.7922 +v 5.4204 4.0706 10.7967 +v 5.0883 4.1381 10.7664 +v 5.1695 4.1698 11.2831 +v 5.4835 3.9149 9.8566 +v 5.1974 3.9844 9.8491 +v 5.3138 4.0317 10.3099 +v 5.6168 3.9576 10.3110 +v 4.8925 4.0432 9.8003 +v 4.9944 4.0955 10.2714 +v 4.6611 4.1500 10.2026 +v 4.5714 4.0924 9.7189 +v 4.7438 4.1966 10.7074 +v 4.8151 4.2309 11.2317 +v 5.3422 3.8663 9.4317 +v 5.0756 3.9299 9.4169 +v 5.2010 3.8153 9.0472 +v 4.9583 3.8705 9.0211 +v 4.6875 3.9137 8.9396 +v 4.7869 3.9823 9.3555 +v 4.8558 3.8082 8.6692 +v 5.0682 3.7655 8.7140 +v 4.6042 3.8385 8.5556 +v 4.3198 3.8632 8.4102 +v 4.3926 3.9483 8.8217 +v 4.4792 4.0249 9.2583 +v 5.2346 3.7034 8.6532 +v 5.4113 3.7452 8.9992 +v 5.5987 3.6612 8.8958 +v 5.3767 3.6241 8.5232 +v 5.7480 3.8335 9.8141 +v 5.5837 3.7898 9.3887 +v 5.9936 3.7410 9.7309 +v 5.8042 3.7013 9.2993 +v 6.4390 3.5256 9.4788 +v 6.1994 3.4914 9.0261 +v 6.0080 3.6016 9.1746 +v 6.2230 3.6381 9.6161 +v 5.9372 3.4566 8.5921 +v 5.7726 3.5647 8.7558 +v 5.5157 3.5300 8.3605 +v 5.6525 3.4230 8.1772 +v 5.9007 3.8724 10.2678 +v 6.0382 3.9054 10.7471 +v 6.3225 3.8077 10.6683 +v 6.1673 3.7769 10.1879 +v 6.1568 3.9313 11.2495 +v 6.4560 3.8324 11.1699 +v 7.0117 3.6085 10.9429 +v 6.7408 3.7246 11.0655 +v 6.8470 3.5853 10.4380 +v 6.5917 3.7008 10.5629 +v 6.4184 3.6715 10.0793 +v 6.6555 3.5572 9.9497 +v 7.9689 3.0719 10.4065 +v 7.7474 3.2157 10.5340 +v 7.7466 3.0502 9.8822 +v 7.5383 3.1936 10.0159 +v 7.3194 3.3310 10.1576 +v 7.5144 3.3534 10.6704 +v 7.2045 2.9968 8.8656 +v 7.0261 3.1389 9.0147 +v 7.2972 3.1677 9.5095 +v 7.4911 3.0249 9.3686 +v 6.8396 3.2750 9.1712 +v 7.0939 3.3045 9.6579 +v 6.8803 3.4346 9.8069 +v 6.6442 3.4042 9.3282 +v 7.0893 3.4618 10.3006 +v 7.2693 3.4846 10.8089 +v 6.8887 2.9665 8.3729 +v 6.7267 3.1080 8.5316 +v 6.5458 2.9346 7.8904 +v 6.4009 3.0757 8.0599 +v 6.2512 3.2107 8.2377 +v 6.5581 3.2434 8.6978 +v 6.0505 3.0429 7.5998 +v 6.1778 2.9019 7.4179 +v 5.9203 3.1779 7.7910 +v 5.7874 3.3051 7.9854 +v 6.0967 3.3381 8.4172 +v 6.3826 3.3716 8.8649 +v 6.0981 1.3577 5.2312 +v 6.1599 1.1702 5.1490 +v 5.6137 1.1448 4.5854 +v 5.5585 1.3292 4.6743 +v 6.2630 0.7847 5.0190 +v 6.2152 0.9790 5.0781 +v 5.7073 0.7667 4.4457 +v 5.6637 0.9571 4.5091 +v 4.5838 0.7293 3.3449 +v 4.5487 0.9117 3.4164 +v 5.1053 0.9344 3.9527 +v 5.1446 0.7481 3.8853 +v 4.5093 1.0922 3.5034 +v 5.0606 1.1185 4.0344 +v 5.0118 1.2999 4.1301 +v 4.4668 1.2706 3.6058 +v 6.3021 0.5878 4.9721 +v 6.3314 0.3891 4.9380 +v 5.7704 0.3799 4.3596 +v 5.7432 0.5741 4.3958 +v 6.3499 0.1890 4.9172 +v 5.7876 0.1845 4.3376 +v 4.6508 0.1750 3.2250 +v 5.2182 0.1798 3.7711 +v 4.6361 0.3606 3.2491 +v 5.2023 0.3703 3.7942 +v 5.1773 0.5599 3.8323 +v 4.6134 0.5455 3.2891 +v 3.0491 0.1616 1.7813 +v 3.0383 0.3339 1.8085 +v 3.5452 0.3421 2.2489 +v 3.5573 0.1657 2.2228 +v 3.0016 0.6779 1.9186 +v 3.0221 0.5060 1.8542 +v 3.5035 0.6937 2.3542 +v 3.5269 0.5182 2.2927 +v 4.0603 0.5315 2.7734 +v 4.0339 0.7110 2.8321 +v 4.0808 0.3511 2.7315 +v 4.0942 0.1703 2.7064 +v 2.9783 0.8494 2.0020 +v 2.9533 1.0204 2.1046 +v 3.4469 1.0424 2.5311 +v 3.4764 0.8685 2.4336 +v 2.9280 1.1909 2.2266 +v 3.4163 1.2153 2.6467 +v 3.9321 1.2422 3.1089 +v 3.9685 1.0666 2.9998 +v 4.0028 0.8895 2.9075 +v 6.4590 1.9871 19.0103 +v 6.9887 1.9475 18.7921 +v 6.4892 1.7236 19.1905 +v 7.0284 1.6889 18.9630 +v 7.5490 1.6497 18.6584 +v 7.4996 1.9029 18.4985 +v 6.5335 1.1679 19.4706 +v 7.0870 1.1439 19.2290 +v 7.0611 1.4204 19.1087 +v 6.5139 1.4500 19.3440 +v 7.6223 1.1168 18.9080 +v 7.5898 1.3871 18.7951 +v 8.6094 1.0577 18.0605 +v 8.5636 1.3144 17.9643 +v 8.0930 1.3513 18.4109 +v 8.1322 1.0877 18.5159 +v 8.5068 1.5643 17.8488 +v 8.0441 1.6076 18.2844 +v 7.9852 1.8551 18.1370 +v 8.4386 1.8058 17.7148 +v 6.5482 0.8792 19.5699 +v 7.1066 0.8609 19.3233 +v 6.5584 0.5853 19.6413 +v 7.1201 0.5730 19.3912 +v 7.6641 0.5592 19.0609 +v 7.6470 0.8403 18.9968 +v 7.1279 0.2819 19.4323 +v 6.5642 0.2881 19.6844 +v 7.6740 0.2749 19.0997 +v 8.6836 0.2596 18.2260 +v 8.1951 0.2674 18.6949 +v 8.6691 0.5289 18.1921 +v 8.1829 0.5443 18.6584 +v 8.1620 0.8182 18.5986 +v 8.6445 0.7954 18.1367 +v 10.1613 0.2314 15.8746 +v 9.8784 0.2375 16.5174 +v 10.1386 0.4739 15.8523 +v 9.8574 0.4855 16.4920 +v 9.5138 0.4990 17.1007 +v 9.5328 0.2444 17.1291 +v 10.0476 0.9511 15.7693 +v 9.7731 0.9735 16.3964 +v 9.8223 0.7313 16.4513 +v 10.1007 0.7142 15.8168 +v 9.4371 0.9994 16.9927 +v 9.4820 0.7511 17.0549 +v 9.0869 0.7727 17.6195 +v 9.0468 1.0279 17.5501 +v 9.1152 0.5136 17.6702 +v 9.1320 0.2519 17.7013 +v 9.9796 1.1836 15.7111 +v 9.7097 1.2111 16.3285 +v 9.8965 1.4107 15.6435 +v 9.6319 1.4429 16.2488 +v 9.3076 1.4803 16.8233 +v 9.3790 1.2429 16.9151 +v 9.5399 1.6678 16.1585 +v 9.7984 1.6313 15.5677 +v 9.2227 1.7103 16.7181 +v 8.8533 1.7569 17.2394 +v 8.9302 1.5213 17.3592 +v 8.9946 1.2778 17.4630 +v 9.9914 1.6025 14.9533 +v 10.0943 1.3854 15.0150 +v 10.2278 1.3658 14.3687 +v 10.1213 1.5803 14.3204 +v 10.2535 0.9334 15.1194 +v 10.1817 1.1620 15.0708 +v 10.3931 0.9197 14.4522 +v 10.3184 1.1452 14.4130 +v 10.4832 0.9014 13.0869 +v 10.4052 1.1230 13.0659 +v 10.3921 1.1325 13.7429 +v 10.4689 0.9093 13.7729 +v 10.3108 1.3398 13.0433 +v 10.2992 1.3509 13.7097 +v 10.1903 1.5636 13.6743 +v 10.2006 1.5509 13.0202 +v 10.3096 0.7006 15.1595 +v 10.3498 0.4646 15.1897 +v 10.4936 0.4573 14.5098 +v 10.4516 0.6901 14.4848 +v 10.3741 0.2264 15.2089 +v 10.5191 0.2224 14.5258 +v 10.6159 0.2166 13.1290 +v 10.5988 0.2192 13.8306 +v 10.5890 0.4474 13.1195 +v 10.5725 0.4517 13.8179 +v 10.5291 0.6820 13.7982 +v 10.5446 0.6759 13.1051 +v 10.3160 0.2117 11.0399 +v 10.2886 0.4390 11.0398 +v 10.4445 0.4413 11.7250 +v 10.4720 0.2130 11.7282 +v 10.1821 0.8862 11.0421 +v 10.2438 0.6641 11.0403 +v 10.3374 0.8906 11.7161 +v 10.3995 0.6675 11.7207 +v 10.5006 0.6712 12.4108 +v 10.4386 0.8954 12.3995 +v 10.5455 0.4440 12.4200 +v 10.5728 0.2146 12.4263 +v 10.1042 1.1044 11.0459 +v 10.0107 1.3181 11.0522 +v 10.1643 1.3244 11.7093 +v 10.2588 1.1098 11.7121 +v 9.9021 1.5263 11.0617 +v 10.0543 1.5335 11.7086 +v 10.1545 1.5413 12.3632 +v 10.2651 1.3313 12.3748 +v 10.3600 1.1157 12.3872 +v 2.3663 2.1138 18.5245 +v 2.7994 2.1097 18.7191 +v 2.3440 1.8332 18.7179 +v 2.7797 1.8301 18.9153 +v 3.2531 1.8252 19.0913 +v 3.2688 2.1037 18.8932 +v 2.3163 1.2420 19.0251 +v 2.7553 1.2404 19.2267 +v 2.7653 1.5397 19.0850 +v 2.3276 1.5420 18.8852 +v 3.2340 1.2374 19.4049 +v 3.2417 1.5359 19.2623 +v 4.2814 1.2257 19.6546 +v 4.2825 1.5212 19.5131 +v 3.7499 1.5299 19.4080 +v 3.7451 1.2327 19.5506 +v 4.2847 1.8076 19.3428 +v 3.7571 1.8179 19.2368 +v 3.7675 2.0951 19.0380 +v 4.2885 2.0830 19.1445 +v 2.3091 0.9349 19.1362 +v 2.7490 0.9339 19.3393 +v 2.3050 0.6226 19.2173 +v 2.7456 0.6220 19.4214 +v 3.2267 0.6206 19.6004 +v 3.2292 0.9317 19.5181 +v 2.7442 0.3065 19.4717 +v 2.3033 0.3068 19.2670 +v 3.2257 0.3058 19.6508 +v 4.2819 0.3029 19.8964 +v 3.7407 0.3046 19.7954 +v 4.2815 0.6148 19.8471 +v 3.7411 0.6182 19.7454 +v 3.7424 0.9282 19.6634 +v 4.2812 0.9230 19.7662 +v 5.9905 0.2932 19.8479 +v 5.9864 0.5954 19.8028 +v 5.4114 0.6035 19.8849 +v 5.4141 0.2973 19.9317 +v 5.9689 1.1877 19.6249 +v 5.9792 0.8942 19.7283 +v 5.4005 1.2037 19.7008 +v 5.4069 0.9063 19.8078 +v 4.8385 0.9158 19.8174 +v 4.8356 1.2162 19.7077 +v 4.8407 0.6099 19.8967 +v 4.8421 0.3005 19.9449 +v 5.9552 1.4743 19.4930 +v 5.9381 1.7522 19.3331 +v 5.3823 1.7753 19.4000 +v 5.3923 1.4940 19.5647 +v 5.9172 2.0197 19.1458 +v 5.3703 2.0461 19.2073 +v 4.8251 2.0669 19.2039 +v 4.8288 1.7936 19.4002 +v 4.8323 1.5094 19.5684 +v 6.9514 1.7789 6.5172 +v 6.8564 1.9552 6.6120 +v 7.3049 1.9833 7.1488 +v 7.4091 1.8053 7.0626 +v 6.6493 2.2911 6.8320 +v 6.7556 2.1259 6.7166 +v 7.0756 2.3217 7.3496 +v 7.1936 2.1553 7.2442 +v 7.8434 2.3766 8.4018 +v 7.9827 2.2075 8.3140 +v 7.6035 2.1826 7.7761 +v 7.4745 2.3503 7.8725 +v 8.1131 2.0324 8.2357 +v 7.7247 2.0090 7.6894 +v 7.8377 1.8293 7.6114 +v 8.2343 1.8509 8.1656 +v 6.5379 2.4512 6.9589 +v 6.4220 2.6062 7.0983 +v 6.8215 2.6383 7.5944 +v 6.9515 2.4827 7.4661 +v 6.3018 2.7564 7.2510 +v 6.6862 2.7889 7.7355 +v 7.3758 2.8498 8.7307 +v 7.0449 2.8202 8.2286 +v 7.5396 2.6975 8.6091 +v 7.1949 2.6689 8.0978 +v 7.3382 2.5123 7.9794 +v 7.6956 2.5399 8.4998 +v 8.1797 2.9226 10.2948 +v 8.3794 2.7676 10.1975 +v 8.1342 2.7473 9.6583 +v 7.9454 2.9015 9.7634 +v 8.7449 2.4400 10.0410 +v 8.5679 2.6068 10.1134 +v 8.4811 2.4217 9.4848 +v 8.3129 2.5874 9.5658 +v 8.0213 2.5650 9.0283 +v 8.1798 2.4005 8.9388 +v 7.8535 2.7238 9.1290 +v 7.6767 2.8771 9.2421 +v 8.9103 2.2669 9.9792 +v 9.0638 2.0874 9.9267 +v 8.7854 2.0716 9.3524 +v 8.6387 2.2498 9.4140 +v 9.2052 1.9014 9.8821 +v 8.9209 1.8870 9.2988 +v 8.5963 1.8701 8.7274 +v 8.4676 2.0532 8.7894 +v 8.3287 2.2299 8.8595 +v 0.2392 2.1194 17.3522 +v 0.2342 1.8335 17.5196 +v 0.4741 1.8342 17.6050 +v 0.4838 2.1197 17.4355 +v 0.2280 1.2377 17.7791 +v 0.2306 1.5391 17.6620 +v 0.4618 1.2385 17.8687 +v 0.4669 1.5400 17.7496 +v 0.9705 1.2408 18.1767 +v 0.9798 1.5421 18.0510 +v 0.7147 1.5410 17.8825 +v 0.7074 1.2396 18.0046 +v 0.9929 1.8357 17.8994 +v 0.7251 1.8350 17.7348 +v 0.7392 2.1200 17.5620 +v 1.0107 2.1200 17.7227 +v 0.2263 0.9305 17.8706 +v 0.2254 0.6191 17.9363 +v 0.4567 0.6196 18.0292 +v 0.4586 0.9312 17.9620 +v 0.2250 0.3049 17.9760 +v 0.4559 0.3051 18.0698 +v 0.9598 0.3059 18.3911 +v 0.6989 0.3055 18.2118 +v 0.9613 0.6211 18.3475 +v 0.7000 0.6204 18.1698 +v 0.7027 0.9322 18.1005 +v 0.9646 0.9333 18.2758 +v 1.9105 0.3068 19.0458 +v 1.9123 0.6228 18.9973 +v 1.5614 0.6225 18.7719 +v 1.5596 0.3067 18.8190 +v 1.9242 1.2426 18.8092 +v 1.9166 0.9353 18.9179 +v 1.5731 1.2425 18.5891 +v 1.5656 0.9350 18.6949 +v 1.2503 0.9342 18.4773 +v 1.2572 1.2418 18.3749 +v 1.2464 0.6219 18.5517 +v 1.2447 0.3063 18.5971 +v 1.9360 1.5431 18.6722 +v 1.9531 1.8351 18.5082 +v 1.6013 1.8359 18.2956 +v 1.5847 1.5434 18.4556 +v 1.9762 2.1167 18.3185 +v 1.6239 2.1186 18.1101 +v 1.3038 2.1196 17.9085 +v 1.2831 1.8361 18.0895 +v 1.2678 1.5429 18.2453 +v 0.2491 1.4419 1.0355 +v 0.2493 1.6087 1.2602 +v 0.5037 1.6103 1.3022 +v 0.5035 1.4435 1.0790 +v 0.2518 1.9430 1.7739 +v 0.2502 1.7759 1.5065 +v 0.5083 1.9446 1.8130 +v 0.5053 1.7775 1.5471 +v 1.0542 1.9534 1.9866 +v 1.0502 1.7865 1.7266 +v 0.7704 1.7809 1.6193 +v 0.7742 1.9479 1.8828 +v 1.0487 1.6193 1.4878 +v 0.7685 1.6137 1.3769 +v 0.7685 1.4469 1.1563 +v 1.0496 1.4524 1.2710 +v 0.2541 2.1095 2.0615 +v 0.2571 2.2747 2.3686 +v 0.5184 2.2762 2.4054 +v 0.5127 2.1110 2.0994 +v 0.2608 2.4381 2.6945 +v 0.5254 2.4397 2.7304 +v 1.0813 2.4479 2.8878 +v 0.7977 2.4429 2.7939 +v 1.0697 2.2846 2.5679 +v 0.7879 2.2794 2.4709 +v 0.7800 2.1143 2.1669 +v 1.0607 2.1196 2.2672 +v 2.0385 2.4785 3.3794 +v 2.0309 2.3166 3.0784 +v 1.6871 2.3028 2.8686 +v 1.6979 2.4654 3.1778 +v 2.0257 1.9878 2.5354 +v 2.0266 2.1529 2.7969 +v 1.6752 1.9728 2.3095 +v 1.6796 2.1385 2.5790 +v 1.3591 2.1275 2.4035 +v 1.3530 1.9616 2.1277 +v 1.3681 2.2923 2.6994 +v 1.3801 2.4553 3.0148 +v 2.0280 1.8215 2.2943 +v 2.0335 1.6545 2.0740 +v 1.6760 1.6392 1.8329 +v 1.6741 1.8063 2.0606 +v 2.0421 1.4871 1.8749 +v 1.6811 1.4721 1.6267 +v 1.3520 1.4607 1.4266 +v 1.3495 1.6277 1.6387 +v 1.3498 1.7948 1.8726 +# 5634 vertices + +vn -0.3934 -0.8264 -0.4029 +vn -0.4196 -0.8008 -0.4274 +vn -0.4058 -0.8012 -0.4397 +vn -0.3803 -0.8260 -0.4160 +vn -0.4466 -0.7725 -0.4514 +vn -0.4323 -0.7733 -0.4638 +vn -0.4169 -0.7766 -0.4724 +vn -0.3910 -0.8034 -0.4491 +vn -0.3660 -0.8277 -0.4254 +vn -0.5022 -0.7064 -0.4988 +vn -0.4869 -0.7088 -0.5105 +vn -0.4594 -0.7427 -0.4872 +vn -0.4744 -0.7408 -0.4756 +vn -0.4708 -0.7139 -0.5184 +vn -0.4437 -0.7465 -0.4958 +vn -0.4356 -0.7300 -0.5266 +vn -0.4089 -0.7606 -0.5042 +vn -0.4268 -0.7528 -0.5010 +vn -0.4538 -0.7209 -0.5238 +vn -0.3828 -0.7886 -0.4812 +vn -0.4005 -0.7816 -0.4783 +vn -0.3335 -0.8361 -0.4356 +vn -0.3504 -0.8310 -0.4320 +vn -0.3749 -0.8078 -0.4549 +vn -0.3576 -0.8135 -0.4586 +vn -0.5299 -0.6688 -0.5215 +vn -0.5141 -0.6724 -0.5325 +vn -0.5569 -0.6289 -0.5426 +vn -0.5409 -0.6331 -0.5538 +vn -0.5245 -0.6400 -0.5615 +vn -0.4979 -0.6781 -0.5406 +vn -0.6072 -0.5424 -0.5807 +vn -0.5911 -0.5482 -0.5918 +vn -0.5666 -0.5917 -0.5734 +vn -0.5827 -0.5864 -0.5627 +vn -0.5751 -0.5562 -0.6000 +vn -0.5505 -0.5990 -0.5815 +vn -0.5420 -0.5772 -0.6108 +vn -0.5164 -0.6196 -0.5911 +vn -0.5337 -0.6086 -0.5871 +vn -0.5590 -0.5657 -0.6063 +vn -0.4897 -0.6596 -0.5702 +vn -0.5077 -0.6487 -0.5670 +vn -0.4808 -0.6864 -0.5457 +vn -0.4628 -0.6961 -0.5489 +vn -0.4583 -0.6362 -0.6207 +vn -0.4299 -0.6779 -0.5963 +vn -0.4553 -0.6619 -0.5954 +vn -0.4835 -0.6192 -0.6187 +vn -0.4016 -0.7155 -0.5716 +vn -0.4275 -0.6998 -0.5723 +vn -0.4501 -0.6854 -0.5724 +vn -0.4778 -0.6464 -0.5948 +vn -0.5048 -0.6041 -0.6166 +vn -0.3474 -0.7780 -0.5236 +vn -0.3728 -0.7646 -0.5258 +vn -0.3998 -0.7342 -0.5488 +vn -0.3740 -0.7484 -0.5477 +vn -0.3955 -0.7522 -0.5271 +vn -0.4227 -0.7203 -0.5500 +vn -0.4434 -0.7078 -0.5499 +vn -0.4164 -0.7404 -0.5277 +vn -0.4708 -0.6716 -0.5721 +vn -0.5244 -0.5898 -0.6142 +vn -0.4977 -0.6326 -0.5934 +vn -0.3217 -0.8039 -0.5003 +vn -0.3467 -0.7920 -0.5025 +vn -0.2974 -0.8270 -0.4771 +vn -0.3216 -0.8163 -0.4799 +vn -0.3436 -0.8063 -0.4816 +vn -0.3691 -0.7805 -0.5045 +vn -0.2523 -0.8657 -0.4324 +vn -0.2751 -0.8572 -0.4353 +vn -0.2978 -0.8380 -0.4572 +vn -0.2740 -0.8474 -0.4547 +vn -0.2961 -0.8494 -0.4368 +vn -0.3192 -0.8290 -0.4593 +vn -0.3391 -0.8209 -0.4596 +vn -0.3155 -0.8421 -0.4374 +vn -0.3639 -0.7968 -0.4824 +vn -0.3897 -0.7702 -0.5049 +vn -0.4839 -0.8696 0.0987 +vn -0.4627 -0.8796 0.1104 +vn -0.4876 -0.8617 0.1401 +vn -0.5079 -0.8542 0.1112 +vn -0.4328 -0.8922 0.1288 +vn -0.4561 -0.8745 0.1647 +vn -0.4892 -0.8484 0.2022 +vn -0.5219 -0.8361 0.1688 +vn -0.5458 -0.8275 0.1314 +vn -0.3624 -0.9176 0.1632 +vn -0.3818 -0.9004 0.2088 +vn -0.4218 -0.8870 0.1878 +vn -0.3990 -0.9053 0.1455 +vn -0.4082 -0.8760 0.2568 +vn -0.4507 -0.8623 0.2310 +vn -0.4732 -0.8073 0.3526 +vn -0.5225 -0.7914 0.3171 +vn -0.4854 -0.8301 0.2745 +vn -0.4388 -0.8451 0.3055 +vn -0.5656 -0.7774 0.2752 +vn -0.5260 -0.8163 0.2388 +vn -0.6288 -0.7575 0.1752 +vn -0.5856 -0.7962 0.1522 +vn -0.5599 -0.8046 0.1979 +vn -0.6013 -0.7659 0.2277 +vn -0.3225 -0.9295 0.1788 +vn -0.3393 -0.9127 0.2278 +vn -0.2820 -0.9397 0.1934 +vn -0.2939 -0.9241 0.2440 +vn -0.3115 -0.9023 0.2980 +vn -0.3609 -0.8899 0.2790 +vn -0.1903 -0.9572 0.2181 +vn -0.1917 -0.9431 0.2718 +vn -0.2458 -0.9341 0.2589 +vn -0.2383 -0.9491 0.2061 +vn -0.1966 -0.9234 0.3295 +vn -0.2567 -0.9139 0.3146 +vn -0.2150 -0.8655 0.4524 +vn -0.2899 -0.8537 0.4326 +vn -0.2722 -0.8870 0.3730 +vn -0.2041 -0.8980 0.3898 +vn -0.3576 -0.8392 0.4096 +vn -0.3324 -0.8744 0.3535 +vn -0.3882 -0.8600 0.3312 +vn -0.4179 -0.8236 0.3834 +vn -0.2723 -0.6640 0.6964 +vn -0.3761 -0.6484 0.6619 +vn -0.3546 -0.7100 0.6084 +vn -0.2570 -0.7250 0.6390 +vn -0.4652 -0.6314 0.6205 +vn -0.4393 -0.6929 0.5718 +vn -0.4119 -0.7485 0.5197 +vn -0.3323 -0.7650 0.5516 +vn -0.2421 -0.7791 0.5783 +vn -0.6077 -0.5988 0.5216 +vn -0.5769 -0.6588 0.4829 +vn -0.5128 -0.6756 0.5298 +vn -0.5421 -0.6142 0.5735 +vn -0.5432 -0.7140 0.4418 +vn -0.4818 -0.7310 0.4833 +vn -0.4498 -0.7805 0.4341 +vn -0.5084 -0.7634 0.3985 +vn -0.3841 -0.7974 0.4655 +vn -0.2274 -0.8261 0.5155 +vn -0.3108 -0.8129 0.4926 +vn -0.6647 -0.5851 0.4645 +vn -0.6318 -0.6443 0.4309 +vn -0.7126 -0.5745 0.4026 +vn -0.6794 -0.6318 0.3732 +vn -0.6432 -0.6847 0.3427 +vn -0.5972 -0.6980 0.3952 +vn -0.7864 -0.5599 0.2607 +vn -0.7507 -0.6153 0.2404 +vn -0.7186 -0.6225 0.3100 +vn -0.7535 -0.5660 0.3345 +vn -0.7126 -0.6662 0.2199 +vn -0.6821 -0.6738 0.2841 +vn -0.6428 -0.7217 0.2570 +vn -0.6723 -0.7133 0.1980 +vn -0.6055 -0.7329 0.3103 +vn -0.5603 -0.7473 0.3572 +vn -0.2315 -0.8819 -0.4108 +vn -0.2538 -0.8746 -0.4132 +vn -0.2120 -0.8965 -0.3889 +vn -0.2334 -0.8900 -0.3917 +vn -0.2533 -0.8840 -0.3930 +vn -0.2742 -0.8675 -0.4151 +vn -0.1763 -0.9216 -0.3459 +vn -0.1961 -0.9167 -0.3482 +vn -0.2143 -0.9041 -0.3698 +vn -0.1934 -0.9097 -0.3675 +vn -0.2149 -0.9120 -0.3495 +vn -0.2336 -0.8986 -0.3714 +vn -0.2501 -0.9033 -0.3485 +vn -0.2696 -0.8890 -0.3702 +vn -0.2519 -0.8936 -0.3714 +vn -0.2328 -0.9074 -0.3499 +vn -0.2896 -0.8734 -0.3915 +vn -0.2721 -0.8782 -0.3933 +vn -0.2931 -0.8613 -0.4150 +vn -0.3110 -0.8557 -0.4135 +vn -0.1603 -0.9321 -0.3247 +vn -0.1796 -0.9280 -0.3265 +vn -0.1464 -0.9415 -0.3035 +vn -0.1644 -0.9380 -0.3050 +vn -0.1818 -0.9346 -0.3058 +vn -0.1975 -0.9239 -0.3278 +vn -0.1240 -0.9570 -0.2621 +vn -0.1404 -0.9547 -0.2624 +vn -0.1516 -0.9469 -0.2836 +vn -0.1339 -0.9498 -0.2827 +vn -0.1565 -0.9522 -0.2623 +vn -0.1678 -0.9440 -0.2840 +vn -0.1888 -0.9467 -0.2608 +vn -0.2006 -0.9380 -0.2826 +vn -0.1842 -0.9411 -0.2837 +vn -0.1721 -0.9497 -0.2617 +vn -0.2152 -0.9278 -0.3047 +vn -0.1984 -0.9312 -0.3059 +vn -0.2149 -0.9200 -0.3278 +vn -0.2319 -0.9162 -0.3268 +vn -0.2460 -0.9351 -0.2549 +vn -0.2576 -0.9291 -0.2653 +vn -0.2464 -0.9298 -0.2733 +vn -0.2360 -0.9374 -0.2561 +vn -0.2733 -0.9198 -0.2815 +vn -0.2622 -0.9199 -0.2915 +vn -0.2472 -0.9220 -0.2980 +vn -0.2321 -0.9323 -0.2775 +vn -0.2207 -0.9406 -0.2580 +vn -0.3089 -0.8964 -0.3179 +vn -0.2972 -0.8958 -0.3304 +vn -0.2784 -0.9089 -0.3104 +vn -0.2909 -0.9089 -0.2988 +vn -0.2826 -0.8972 -0.3394 +vn -0.2645 -0.9102 -0.3186 +vn -0.2484 -0.9129 -0.3238 +vn -0.2670 -0.8997 -0.3454 +vn -0.2316 -0.9247 -0.3022 +vn -0.2052 -0.9437 -0.2594 +vn -0.2169 -0.9350 -0.2806 +vn -0.3288 -0.8818 -0.3380 +vn -0.3160 -0.8815 -0.3509 +vn -0.3482 -0.8662 -0.3584 +vn -0.3360 -0.8655 -0.3716 +vn -0.3216 -0.8668 -0.3811 +vn -0.3021 -0.8825 -0.3604 +vn -0.3568 -0.8476 -0.3929 +vn -0.3696 -0.8480 -0.3799 +vn -0.3430 -0.8486 -0.4028 +vn -0.3274 -0.8516 -0.4093 +vn -0.3065 -0.8693 -0.3878 +vn -0.2861 -0.8853 -0.3665 +vn -0.0808 -0.9960 -0.0372 +vn -0.0739 -0.9973 -0.0008 +vn -0.0849 -0.9964 -0.0001 +vn -0.0932 -0.9950 -0.0353 +vn -0.0646 -0.9973 0.0345 +vn -0.0755 -0.9965 0.0344 +vn -0.0884 -0.9955 0.0330 +vn -0.0988 -0.9951 -0.0000 +vn -0.1067 -0.9937 -0.0344 +vn -0.0389 -0.9936 0.1058 +vn -0.0490 -0.9935 0.1032 +vn -0.0632 -0.9957 0.0683 +vn -0.0535 -0.9961 0.0701 +vn -0.0618 -0.9931 0.0994 +vn -0.0766 -0.9949 0.0661 +vn -0.0979 -0.9911 0.0901 +vn -0.1116 -0.9920 0.0587 +vn -0.0923 -0.9938 0.0626 +vn -0.0786 -0.9923 0.0953 +vn -0.1228 -0.9920 0.0276 +vn -0.1046 -0.9940 0.0310 +vn -0.1405 -0.9894 -0.0354 +vn -0.1228 -0.9918 -0.0342 +vn -0.1143 -0.9935 -0.0012 +vn -0.1329 -0.9911 -0.0031 +vn -0.0218 -0.9894 0.1433 +vn -0.0313 -0.9898 0.1390 +vn -0.0003 -0.9832 0.1826 +vn -0.0113 -0.9840 0.1776 +vn -0.0256 -0.9848 0.1720 +vn -0.0453 -0.9899 0.1346 +vn 0.0535 -0.9606 0.2729 +vn 0.0388 -0.9631 0.2665 +vn 0.0125 -0.9755 0.2194 +vn 0.0242 -0.9739 0.2256 +vn 0.0204 -0.9652 0.2606 +vn -0.0041 -0.9769 0.2136 +vn -0.0302 -0.9680 0.2492 +vn -0.0490 -0.9783 0.2014 +vn -0.0242 -0.9779 0.2075 +vn -0.0028 -0.9670 0.2549 +vn -0.0664 -0.9848 0.1602 +vn -0.0444 -0.9851 0.1664 +vn -0.0621 -0.9897 0.1293 +vn -0.0832 -0.9888 0.1238 +vn -0.1924 -0.9665 0.1701 +vn -0.1491 -0.9724 0.1796 +vn -0.1422 -0.9632 0.2279 +vn -0.1969 -0.9718 0.1297 +vn -0.1582 -0.9776 0.1386 +vn -0.1231 -0.9815 0.1465 +vn -0.1112 -0.9759 0.1877 +vn -0.0997 -0.9666 0.2362 +vn -0.2108 -0.9755 0.0624 +vn -0.1778 -0.9815 0.0708 +vn -0.1674 -0.9805 0.1028 +vn -0.2039 -0.9744 0.0943 +vn -0.1474 -0.9860 0.0780 +vn -0.1358 -0.9845 0.1106 +vn -0.1073 -0.9873 0.1174 +vn -0.1213 -0.9890 0.0846 +vn -0.0930 -0.9837 0.1537 +vn -0.0624 -0.9680 0.2431 +vn -0.0776 -0.9777 0.1949 +vn -0.2190 -0.9752 0.0330 +vn -0.1868 -0.9815 0.0407 +vn -0.2257 -0.9742 0.0040 +vn -0.1961 -0.9805 0.0121 +vn -0.1684 -0.9855 0.0182 +vn -0.1589 -0.9861 0.0478 +vn -0.2373 -0.9699 -0.0550 +vn -0.2099 -0.9766 -0.0469 +vn -0.2032 -0.9790 -0.0172 +vn -0.2327 -0.9723 -0.0245 +vn -0.1839 -0.9821 -0.0416 +vn -0.1774 -0.9841 -0.0109 +vn -0.1534 -0.9881 -0.0066 +vn -0.1614 -0.9862 -0.0375 +vn -0.1446 -0.9892 0.0237 +vn -0.1333 -0.9896 0.0535 +vn -0.4697 -0.8662 -0.1703 +vn -0.4742 -0.8706 -0.1310 +vn -0.5138 -0.8453 -0.1463 +vn -0.5073 -0.8409 -0.1884 +vn -0.4769 -0.8739 -0.0942 +vn -0.5175 -0.8489 -0.1076 +vn -0.5613 -0.8190 -0.1192 +vn -0.5551 -0.8160 -0.1615 +vn -0.5472 -0.8113 -0.2058 +vn -0.4797 -0.8771 -0.0240 +vn -0.5224 -0.8521 -0.0321 +vn -0.5208 -0.8508 -0.0696 +vn -0.4779 -0.8764 -0.0595 +vn -0.5687 -0.8217 -0.0369 +vn -0.5654 -0.8211 -0.0787 +vn -0.6632 -0.7473 -0.0405 +vn -0.6584 -0.7472 -0.0909 +vn -0.6121 -0.7862 -0.0852 +vn -0.6159 -0.7868 -0.0402 +vn -0.6515 -0.7457 -0.1396 +vn -0.6058 -0.7849 -0.1303 +vn -0.6300 -0.7387 -0.2394 +vn -0.5881 -0.7774 -0.2232 +vn -0.5984 -0.7817 -0.1755 +vn -0.6419 -0.7430 -0.1892 +vn -0.4801 -0.8771 0.0101 +vn -0.5234 -0.8520 0.0062 +vn -0.4820 -0.8751 0.0439 +vn -0.5223 -0.8517 0.0423 +vn -0.5675 -0.8220 0.0475 +vn -0.5691 -0.8222 0.0046 +vn -0.5194 -0.8508 0.0795 +vn -0.4819 -0.8730 0.0754 +vn -0.5606 -0.8232 0.0902 +vn -0.6484 -0.7518 0.1199 +vn -0.6034 -0.7906 0.1043 +vn -0.6598 -0.7487 0.0652 +vn -0.6132 -0.7880 0.0550 +vn -0.6169 -0.7870 0.0071 +vn -0.6641 -0.7475 0.0109 +vn -0.8111 -0.5553 0.1837 +vn -0.7738 -0.6106 0.1685 +vn -0.8265 -0.5524 0.1086 +vn -0.7882 -0.6076 0.0976 +vn -0.7478 -0.6583 0.0867 +vn -0.7347 -0.6610 0.1526 +vn -0.8351 -0.5490 -0.0345 +vn -0.7955 -0.6048 -0.0369 +vn -0.7950 -0.6059 0.0292 +vn -0.8341 -0.5505 0.0355 +vn -0.7535 -0.6563 -0.0387 +vn -0.7535 -0.6570 0.0226 +vn -0.7099 -0.7041 0.0167 +vn -0.7091 -0.7040 -0.0403 +vn -0.7051 -0.7051 0.0755 +vn -0.6930 -0.7079 0.1367 +vn -0.8303 -0.5479 -0.1022 +vn -0.7910 -0.6035 -0.1003 +vn -0.8206 -0.5465 -0.1672 +vn -0.7818 -0.6021 -0.1622 +vn -0.7403 -0.6540 -0.1556 +vn -0.7487 -0.6556 -0.0981 +vn -0.7870 -0.5430 -0.2929 +vn -0.7508 -0.5973 -0.2820 +vn -0.7686 -0.5999 -0.2222 +vn -0.8060 -0.5450 -0.2309 +vn -0.7123 -0.6483 -0.2690 +vn -0.7280 -0.6517 -0.2126 +vn -0.6857 -0.6995 -0.2012 +vn -0.6715 -0.6957 -0.2551 +vn -0.6963 -0.7022 -0.1484 +vn -0.7044 -0.7034 -0.0947 +vn -0.1378 -0.9493 0.2827 +vn -0.0898 -0.9526 0.2908 +vn -0.0817 -0.9334 0.3494 +vn -0.1356 -0.9302 0.3410 +vn -0.0114 -0.9531 0.3026 +vn -0.0478 -0.9536 0.2973 +vn 0.0069 -0.9331 0.3596 +vn -0.0342 -0.9342 0.3551 +vn 0.0414 -0.8754 0.4817 +vn -0.0107 -0.8774 0.4796 +vn -0.0220 -0.9090 0.4163 +vn 0.0246 -0.9075 0.4194 +vn -0.0709 -0.8770 0.4753 +vn -0.0753 -0.9085 0.4110 +vn -0.1363 -0.9051 0.4028 +vn -0.1387 -0.8735 0.4666 +vn 0.0198 -0.9513 0.3075 +vn 0.0460 -0.9489 0.3123 +vn 0.0726 -0.9274 0.3671 +vn 0.0423 -0.9308 0.3632 +vn 0.0852 -0.9423 0.3239 +vn 0.0681 -0.9457 0.3178 +vn 0.1197 -0.9185 0.3768 +vn 0.0980 -0.9234 0.3712 +vn 0.1909 -0.8532 0.4855 +vn 0.1604 -0.8607 0.4832 +vn 0.1293 -0.8950 0.4268 +vn 0.1546 -0.8892 0.4306 +vn 0.1262 -0.8667 0.4826 +vn 0.0993 -0.9003 0.4238 +vn 0.0648 -0.9044 0.4218 +vn 0.0868 -0.8718 0.4821 +vn 0.3250 -0.6464 0.6903 +vn 0.2755 -0.6589 0.7000 +vn 0.2495 -0.7179 0.6499 +vn 0.2940 -0.7073 0.6428 +vn 0.2224 -0.6679 0.7103 +vn 0.2010 -0.7269 0.6566 +vn 0.1774 -0.7798 0.6003 +vn 0.2212 -0.7721 0.5958 +vn 0.2613 -0.7619 0.5927 +vn 0.0967 -0.6795 0.7273 +vn 0.0853 -0.7383 0.6691 +vn 0.1467 -0.7334 0.6638 +vn 0.1636 -0.6751 0.7194 +vn 0.0719 -0.7907 0.6080 +vn 0.1282 -0.7863 0.6044 +vn 0.1080 -0.8323 0.5437 +vn 0.0574 -0.8366 0.5448 +vn 0.1523 -0.8268 0.5415 +vn 0.2263 -0.8111 0.5394 +vn 0.1915 -0.8195 0.5402 +vn 0.0206 -0.6817 0.7314 +vn 0.0146 -0.7404 0.6720 +vn -0.0667 -0.6803 0.7299 +vn -0.0657 -0.7399 0.6695 +vn -0.0663 -0.7927 0.6060 +vn 0.0077 -0.7932 0.6089 +vn -0.1569 -0.7350 0.6597 +vn -0.1646 -0.6749 0.7194 +vn -0.1494 -0.7886 0.5965 +vn -0.1436 -0.8346 0.5318 +vn -0.0676 -0.8386 0.5406 +vn -0.0010 -0.8388 0.5445 +vn -0.2355 -0.9587 0.1595 +vn -0.2751 -0.9500 0.1476 +vn -0.2730 -0.9559 0.1086 +vn -0.2368 -0.9642 0.1195 +vn -0.3494 -0.9291 0.1211 +vn -0.3125 -0.9403 0.1351 +vn -0.3425 -0.9357 0.0846 +vn -0.3079 -0.9465 0.0966 +vn -0.3400 -0.9402 0.0200 +vn -0.3091 -0.9505 0.0316 +vn -0.3071 -0.9496 0.0628 +vn -0.3398 -0.9391 0.0509 +vn -0.2775 -0.9598 0.0427 +vn -0.2746 -0.9587 0.0740 +vn -0.2400 -0.9671 0.0846 +vn -0.2456 -0.9679 0.0532 +vn -0.3850 -0.9166 0.1076 +vn -0.4178 -0.9037 0.0935 +vn -0.4104 -0.9099 0.0605 +vn -0.3765 -0.9236 0.0719 +vn -0.4515 -0.8884 0.0825 +vn -0.4444 -0.8944 0.0499 +vn -0.4401 -0.8978 -0.0145 +vn -0.4423 -0.8967 0.0184 +vn -0.4049 -0.9143 -0.0034 +vn -0.4062 -0.9133 0.0281 +vn -0.3728 -0.9271 0.0394 +vn -0.3716 -0.9284 0.0081 +vn -0.4351 -0.8874 -0.1525 +vn -0.4383 -0.8914 -0.1150 +vn -0.4040 -0.9047 -0.1354 +vn -0.4058 -0.9085 -0.0995 +vn -0.4056 -0.9116 -0.0666 +vn -0.4392 -0.8948 -0.0806 +vn -0.3477 -0.9318 -0.1037 +vn -0.3473 -0.9351 -0.0703 +vn -0.3756 -0.9229 -0.0847 +vn -0.3755 -0.9192 -0.1189 +vn -0.3447 -0.9379 -0.0397 +vn -0.3745 -0.9257 -0.0528 +vn -0.3727 -0.9277 -0.0224 +vn -0.3422 -0.9396 -0.0099 +vn -0.4047 -0.9138 -0.0351 +vn -0.4397 -0.8969 -0.0474 +vn -0.3213 -0.9428 -0.0890 +vn -0.3189 -0.9461 -0.0573 +vn -0.2936 -0.9529 -0.0763 +vn -0.2911 -0.9556 -0.0448 +vn -0.2865 -0.9580 -0.0157 +vn -0.3161 -0.9484 -0.0270 +vn -0.2618 -0.9645 -0.0343 +vn -0.2664 -0.9617 -0.0643 +vn -0.2571 -0.9664 -0.0049 +vn -0.2509 -0.9677 0.0235 +vn -0.2823 -0.9592 0.0134 +vn -0.3121 -0.9501 0.0020 +vn -0.7383 0.0000 -0.6745 +vn -0.7350 -0.0909 -0.6719 +vn -0.7518 -0.0889 -0.6534 +vn -0.7552 0.0000 -0.6555 +vn -0.7256 -0.1752 -0.6654 +vn -0.7428 -0.1716 -0.6472 +vn -0.7635 -0.1682 -0.6236 +vn -0.7725 -0.0869 -0.6290 +vn -0.7756 0.0000 -0.6312 +vn -0.6944 -0.3225 -0.6433 +vn -0.7120 -0.3172 -0.6265 +vn -0.7290 -0.2477 -0.6381 +vn -0.7118 -0.2524 -0.6555 +vn -0.7329 -0.3124 -0.6043 +vn -0.7500 -0.2433 -0.6150 +vn -0.7840 -0.3047 -0.5408 +vn -0.8014 -0.2359 -0.5497 +vn -0.7742 -0.2394 -0.5859 +vn -0.7571 -0.3083 -0.5760 +vn -0.8148 -0.1620 -0.5566 +vn -0.7878 -0.1650 -0.5935 +vn -0.8267 0.0000 -0.5626 +vn -0.7999 0.0000 -0.6002 +vn -0.7965 -0.0851 -0.5986 +vn -0.8237 -0.0833 -0.5609 +vn -0.6746 -0.3859 -0.6292 +vn -0.6923 -0.3804 -0.6132 +vn -0.6531 -0.4433 -0.6139 +vn -0.6708 -0.4379 -0.5985 +vn -0.6915 -0.4338 -0.5776 +vn -0.7132 -0.3757 -0.5918 +vn -0.6245 -0.5383 -0.5659 +vn -0.6481 -0.4904 -0.5826 +vn -0.6305 -0.4951 -0.5978 +vn -0.6441 -0.5362 -0.5455 +vn -0.6683 -0.4871 -0.5623 +vn -0.6893 -0.5359 -0.4875 +vn -0.7158 -0.4840 -0.5034 +vn -0.6911 -0.4850 -0.5359 +vn -0.6657 -0.5355 -0.5198 +vn -0.7408 -0.4284 -0.5174 +vn -0.7149 -0.4306 -0.5509 +vn -0.7372 -0.3719 -0.5642 +vn -0.7636 -0.3688 -0.5300 +vn -0.8199 -0.4860 -0.3027 +vn -0.7956 -0.4849 -0.3633 +vn -0.7640 -0.5410 -0.3517 +vn -0.8498 -0.4259 -0.3107 +vn -0.8241 -0.4258 -0.3735 +vn -0.7965 -0.4261 -0.4289 +vn -0.7691 -0.4842 -0.4173 +vn -0.7393 -0.5389 -0.4037 +vn -0.8988 -0.2964 -0.3230 +vn -0.8718 -0.2976 -0.3890 +vn -0.8497 -0.3634 -0.3820 +vn -0.8761 -0.3627 -0.3176 +vn -0.8427 -0.2994 -0.4476 +vn -0.8211 -0.3646 -0.4391 +vn -0.7920 -0.3664 -0.4883 +vn -0.8129 -0.3018 -0.4981 +vn -0.7682 -0.4270 -0.4770 +vn -0.7139 -0.5372 -0.4492 +vn -0.7422 -0.4838 -0.4638 +vn -0.9173 -0.2268 -0.3272 +vn -0.8900 -0.2282 -0.3946 +vn -0.9312 -0.1541 -0.3303 +vn -0.9039 -0.1554 -0.3985 +vn -0.8742 -0.1572 -0.4594 +vn -0.8606 -0.2303 -0.4543 +vn -0.9430 0.0000 -0.3327 +vn -0.9158 -0.0000 -0.4017 +vn -0.9126 -0.0792 -0.4012 +vn -0.9401 -0.0784 -0.3319 +vn -0.8860 -0.0000 -0.4637 +vn -0.8830 -0.0804 -0.4624 +vn -0.8528 -0.0817 -0.5158 +vn -0.8560 -0.0000 -0.5169 +vn -0.8441 -0.1595 -0.5119 +vn -0.8305 -0.2328 -0.5061 +vn 0.0639 -0.9579 0.2797 +vn 0.0991 -0.9384 0.3310 +vn 0.0720 -0.9552 0.2870 +vn 0.1079 -0.9345 0.3392 +vn 0.1480 -0.9080 0.3920 +vn 0.1361 -0.9135 0.3834 +vn 0.0736 -0.9503 0.3025 +vn 0.1083 -0.9273 0.3584 +vn 0.1120 -0.9306 0.3484 +vn 0.0750 -0.9526 0.2948 +vn 0.1473 -0.8984 0.4138 +vn 0.1519 -0.9028 0.4022 +vn 0.2330 -0.8211 0.5210 +vn 0.2397 -0.8280 0.5069 +vn 0.1952 -0.8686 0.4554 +vn 0.1891 -0.8630 0.4686 +vn 0.2331 -0.8362 0.4965 +vn 0.1895 -0.8755 0.4446 +vn 0.1758 -0.8823 0.4366 +vn 0.2155 -0.8451 0.4892 +vn 0.0655 -0.9484 0.3103 +vn 0.0964 -0.9248 0.3681 +vn 0.0507 -0.9473 0.3164 +vn 0.0745 -0.9230 0.3776 +vn 0.1011 -0.8935 0.4376 +vn 0.1310 -0.8949 0.4265 +vn -0.0000 -0.9466 0.3223 +vn -0.0000 -0.9222 0.3866 +vn 0.0419 -0.9227 0.3833 +vn 0.0287 -0.9465 0.3215 +vn 0.0000 -0.8934 0.4492 +vn 0.0574 -0.8926 0.4471 +vn 0.0000 -0.8182 0.5750 +vn 0.0928 -0.8160 0.5706 +vn 0.0739 -0.8579 0.5084 +vn -0.0000 -0.8577 0.5142 +vn 0.1623 -0.8157 0.5552 +vn 0.1311 -0.8572 0.4980 +vn 0.1685 -0.8592 0.4830 +vn 0.2088 -0.8166 0.5381 +vn -0.0000 -0.6048 0.7964 +vn 0.1730 -0.5980 0.7826 +vn 0.1521 -0.6610 0.7348 +vn -0.0000 -0.6632 0.7484 +vn 0.2961 -0.5917 0.7498 +vn 0.2641 -0.6542 0.7087 +vn 0.2295 -0.7140 0.6615 +vn 0.1325 -0.7167 0.6846 +vn -0.0000 -0.7211 0.6929 +vn 0.4065 -0.5932 0.6949 +vn 0.3658 -0.6581 0.6581 +vn 0.3320 -0.6535 0.6802 +vn 0.3715 -0.5885 0.7181 +vn 0.3223 -0.7182 0.6167 +vn 0.2918 -0.7132 0.6374 +vn 0.2497 -0.7682 0.5895 +vn 0.2779 -0.7727 0.5707 +vn 0.1963 -0.7670 0.6109 +vn 0.0000 -0.7708 0.6370 +vn 0.1116 -0.7702 0.6280 +vn 0.4131 -0.6036 0.6819 +vn 0.3727 -0.6677 0.6445 +vn 0.3984 -0.6171 0.6786 +vn 0.3598 -0.6807 0.6381 +vn 0.3191 -0.7383 0.5942 +vn 0.3296 -0.7272 0.6021 +vn 0.3327 -0.6939 0.6386 +vn 0.3675 -0.6326 0.6817 +vn 0.2949 -0.7508 0.5910 +vn 0.2560 -0.8009 0.5414 +vn 0.2762 -0.7907 0.5464 +vn 0.2850 -0.7806 0.5563 +vn -0.2265 -0.8743 -0.4293 +vn -0.2072 -0.8894 -0.4074 +vn -0.1984 -0.8828 -0.4258 +vn -0.1799 -0.8969 -0.4039 +vn -0.1632 -0.9095 -0.3822 +vn -0.1883 -0.9031 -0.3858 +vn -0.1345 -0.8978 -0.4193 +vn -0.1207 -0.9099 -0.3969 +vn -0.1514 -0.9038 -0.4003 +vn -0.1670 -0.8909 -0.4224 +vn -0.1087 -0.9205 -0.3754 +vn -0.1360 -0.9155 -0.3786 +vn -0.0868 -0.9386 -0.3339 +vn -0.1095 -0.9352 -0.3367 +vn -0.1225 -0.9258 -0.3575 +vn -0.0969 -0.9301 -0.3542 +vn -0.1327 -0.9310 -0.3400 +vn -0.1470 -0.9210 -0.3609 +vn -0.1712 -0.9154 -0.3643 +vn -0.1548 -0.9265 -0.3431 +vn -0.1000 -0.9037 -0.4164 +vn -0.0901 -0.9146 -0.3943 +vn -0.0658 -0.9076 -0.4147 +vn -0.0588 -0.9181 -0.3919 +vn -0.0527 -0.9273 -0.3705 +vn -0.0803 -0.9246 -0.3724 +vn 0.0000 -0.9107 -0.4130 +vn 0.0000 -0.9207 -0.3902 +vn -0.0287 -0.9200 -0.3909 +vn -0.0319 -0.9101 -0.4131 +vn 0.0000 -0.9295 -0.3688 +vn -0.0256 -0.9291 -0.3690 +vn -0.0000 -0.9446 -0.3283 +vn -0.0202 -0.9443 -0.3284 +vn -0.0229 -0.9370 -0.3485 +vn -0.0000 -0.9375 -0.3479 +vn -0.0417 -0.9432 -0.3297 +vn -0.0468 -0.9358 -0.3495 +vn -0.0719 -0.9334 -0.3517 +vn -0.0637 -0.9414 -0.3313 +vn 0.0000 -0.9664 -0.2570 +vn -0.0130 -0.9663 -0.2571 +vn -0.0144 -0.9617 -0.2738 +vn 0.0000 -0.9618 -0.2736 +vn -0.0269 -0.9659 -0.2574 +vn -0.0295 -0.9612 -0.2743 +vn -0.0330 -0.9558 -0.2921 +vn -0.0160 -0.9565 -0.2912 +vn -0.0000 -0.9567 -0.2911 +vn -0.0570 -0.9643 -0.2586 +vn -0.0623 -0.9590 -0.2764 +vn -0.0457 -0.9603 -0.2753 +vn -0.0414 -0.9653 -0.2579 +vn -0.0694 -0.9530 -0.2950 +vn -0.0507 -0.9547 -0.2932 +vn -0.0570 -0.9484 -0.3121 +vn -0.0772 -0.9463 -0.3140 +vn -0.0369 -0.9499 -0.3104 +vn -0.0000 -0.9510 -0.3091 +vn -0.0180 -0.9507 -0.3096 +vn -0.0729 -0.9630 -0.2595 +vn -0.0800 -0.9572 -0.2780 +vn -0.0898 -0.9613 -0.2605 +vn -0.0977 -0.9551 -0.2796 +vn -0.1079 -0.9480 -0.2993 +vn -0.0882 -0.9508 -0.2970 +vn -0.1161 -0.9526 -0.2813 +vn -0.1066 -0.9593 -0.2613 +vn -0.1270 -0.9450 -0.3015 +vn -0.1404 -0.9362 -0.3222 +vn -0.1192 -0.9401 -0.3194 +vn -0.0985 -0.9434 -0.3167 +vn -0.0700 -0.9968 -0.0397 +vn -0.0636 -0.9980 -0.0027 +vn -0.0592 -0.9973 -0.0428 +vn -0.0542 -0.9985 -0.0050 +vn -0.0469 -0.9984 0.0324 +vn -0.0558 -0.9979 0.0340 +vn -0.0389 -0.9980 -0.0494 +vn -0.0358 -0.9993 -0.0109 +vn -0.0447 -0.9990 -0.0079 +vn -0.0491 -0.9977 -0.0462 +vn -0.0306 -0.9991 0.0282 +vn -0.0389 -0.9988 0.0305 +vn -0.0130 -0.9939 0.1097 +vn -0.0186 -0.9938 0.1097 +vn -0.0301 -0.9971 0.0694 +vn -0.0237 -0.9974 0.0682 +vn -0.0243 -0.9937 0.1090 +vn -0.0376 -0.9968 0.0703 +vn -0.0450 -0.9965 0.0704 +vn -0.0316 -0.9937 0.1080 +vn -0.0291 -0.9982 -0.0526 +vn -0.0265 -0.9996 -0.0137 +vn -0.0191 -0.9983 -0.0549 +vn -0.0178 -0.9997 -0.0163 +vn -0.0151 -0.9996 0.0239 +vn -0.0231 -0.9994 0.0258 +vn 0.0000 -0.9984 -0.0572 +vn 0.0000 -0.9998 -0.0187 +vn -0.0087 -0.9998 -0.0177 +vn -0.0095 -0.9983 -0.0569 +vn 0.0000 -0.9998 0.0220 +vn -0.0076 -0.9997 0.0223 +vn 0.0000 -0.9941 0.1086 +vn -0.0022 -0.9941 0.1088 +vn -0.0053 -0.9979 0.0645 +vn 0.0000 -0.9980 0.0639 +vn -0.0049 -0.9940 0.1092 +vn -0.0113 -0.9978 0.0654 +vn -0.0170 -0.9976 0.0668 +vn -0.0089 -0.9939 0.1096 +vn 0.0177 -0.9651 0.2613 +vn -0.0000 -0.9649 0.2628 +vn 0.0309 -0.9654 0.2589 +vn 0.0156 -0.9786 0.2051 +vn 0.0090 -0.9783 0.2069 +vn -0.0000 -0.9783 0.2070 +vn 0.0435 -0.9675 0.2492 +vn 0.0398 -0.9663 0.2542 +vn 0.0200 -0.9797 0.1995 +vn 0.0189 -0.9790 0.2028 +vn 0.0033 -0.9880 0.1546 +vn 0.0008 -0.9882 0.1534 +vn 0.0035 -0.9878 0.1556 +vn 0.0000 -0.9877 0.1562 +vn 0.0026 -0.9878 0.1560 +vn 0.0438 -0.9689 0.2434 +vn 0.0397 -0.9706 0.2376 +vn 0.0138 -0.9813 0.1919 +vn 0.0176 -0.9804 0.1960 +vn 0.0335 -0.9723 0.2315 +vn 0.0071 -0.9822 0.1876 +vn -0.0139 -0.9891 0.1465 +vn -0.0079 -0.9887 0.1494 +vn -0.0024 -0.9885 0.1515 +vn -0.6299 -0.0000 -0.7767 +vn -0.6060 -0.0000 -0.7954 +vn -0.6011 -0.1147 -0.7909 +vn -0.6257 -0.1104 -0.7722 +vn -0.5713 -0.0000 -0.8207 +vn -0.5668 -0.1197 -0.8151 +vn -0.5528 -0.2325 -0.8002 +vn -0.5883 -0.2224 -0.7774 +vn -0.6130 -0.2142 -0.7605 +vn -0.4568 -0.0000 -0.8896 +vn -0.4524 -0.1323 -0.8819 +vn -0.5181 -0.1257 -0.8460 +vn -0.5235 -0.0000 -0.8520 +vn -0.4384 -0.2564 -0.8614 +vn -0.5046 -0.2437 -0.8282 +vn -0.3936 -0.4637 -0.7938 +vn -0.4580 -0.4436 -0.7704 +vn -0.4834 -0.3505 -0.8022 +vn -0.4185 -0.3674 -0.8306 +vn -0.5068 -0.4250 -0.7500 +vn -0.5326 -0.3345 -0.7775 +vn -0.5707 -0.3935 -0.7208 +vn -0.5945 -0.3087 -0.7425 +vn -0.5682 -0.3208 -0.7578 +vn -0.5439 -0.4078 -0.7334 +vn -0.3695 -0.0000 -0.9292 +vn -0.3647 -0.1392 -0.9207 +vn -0.2590 -0.0000 -0.9659 +vn -0.2560 -0.1454 -0.9557 +vn -0.2462 -0.2805 -0.9277 +vn -0.3528 -0.2691 -0.8962 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -0.1515 -0.9885 +vn -0.1301 -0.1497 -0.9801 +vn -0.1322 0.0000 -0.9912 +vn -0.0000 -0.2912 -0.9567 +vn -0.1251 -0.2887 -0.9492 +vn -0.0000 -0.5150 -0.8572 +vn -0.1084 -0.5116 -0.8524 +vn -0.1174 -0.4097 -0.9046 +vn -0.0000 -0.4138 -0.9104 +vn -0.2158 -0.4999 -0.8388 +vn -0.2324 -0.3997 -0.8867 +vn -0.3344 -0.3846 -0.8604 +vn -0.3126 -0.4833 -0.8178 +vn 0.0000 -0.7554 -0.6552 +vn -0.0729 -0.7530 -0.6539 +vn -0.0811 -0.7112 -0.6982 +vn 0.0000 -0.7150 -0.6991 +vn -0.1487 -0.7440 -0.6514 +vn -0.1637 -0.7020 -0.6931 +vn -0.1808 -0.6485 -0.7394 +vn -0.0896 -0.6596 -0.7463 +vn -0.0000 -0.6627 -0.7489 +vn -0.2865 -0.7129 -0.6401 +vn -0.3119 -0.6675 -0.6761 +vn -0.2426 -0.6864 -0.6856 +vn -0.2206 -0.7306 -0.6462 +vn -0.3392 -0.6121 -0.7144 +vn -0.2652 -0.6323 -0.7280 +vn -0.2891 -0.5651 -0.7727 +vn -0.3667 -0.5447 -0.7542 +vn -0.1980 -0.5825 -0.7883 +vn -0.0000 -0.5979 -0.8016 +vn -0.0991 -0.5934 -0.7988 +vn -0.3425 -0.6934 -0.6339 +vn -0.3709 -0.6468 -0.6664 +vn -0.3896 -0.6735 -0.6281 +vn -0.4189 -0.6257 -0.6580 +vn -0.4487 -0.5696 -0.6886 +vn -0.4001 -0.5905 -0.7009 +vn -0.4873 -0.5877 -0.6458 +vn -0.4570 -0.6062 -0.6509 +vn -0.4278 -0.6539 -0.6240 +vn -0.5160 -0.5322 -0.6712 +vn -0.4870 -0.5496 -0.6788 +vn -0.5159 -0.4843 -0.7066 +vn -0.5445 -0.4674 -0.6965 +vn -0.4787 -0.5027 -0.7198 +vn -0.4294 -0.5235 -0.7359 +vn 0.0000 -0.9708 -0.2400 +vn -0.0119 -0.9707 -0.2400 +vn 0.0000 -0.9752 -0.2214 +vn -0.0111 -0.9751 -0.2214 +vn -0.0231 -0.9750 -0.2211 +vn -0.0247 -0.9704 -0.2400 +vn 0.0000 -0.9840 -0.1784 +vn -0.0102 -0.9839 -0.1783 +vn -0.0105 -0.9796 -0.2008 +vn 0.0000 -0.9796 -0.2011 +vn -0.0211 -0.9839 -0.1772 +vn -0.0218 -0.9795 -0.2004 +vn -0.0447 -0.9837 -0.1744 +vn -0.0465 -0.9790 -0.1985 +vn -0.0339 -0.9793 -0.1994 +vn -0.0326 -0.9838 -0.1761 +vn -0.0492 -0.9742 -0.2203 +vn -0.0357 -0.9747 -0.2208 +vn -0.0383 -0.9700 -0.2401 +vn -0.0525 -0.9693 -0.2403 +vn -0.0000 -0.9882 -0.1535 +vn -0.0100 -0.9882 -0.1528 +vn 0.0000 -0.9922 -0.1250 +vn -0.0099 -0.9921 -0.1248 +vn -0.0203 -0.9922 -0.1231 +vn -0.0206 -0.9882 -0.1519 +vn -0.0098 -0.9957 -0.0926 +vn 0.0000 -0.9956 -0.0936 +vn -0.0200 -0.9956 -0.0913 +vn -0.0411 -0.9955 -0.0859 +vn -0.0304 -0.9956 -0.0887 +vn -0.0423 -0.9921 -0.1184 +vn -0.0312 -0.9921 -0.1212 +vn -0.0318 -0.9882 -0.1500 +vn -0.0434 -0.9880 -0.1480 +vn -0.0865 -0.9936 -0.0728 +vn -0.0745 -0.9943 -0.0759 +vn -0.0907 -0.9902 -0.1062 +vn -0.0780 -0.9910 -0.1092 +vn -0.0657 -0.9915 -0.1123 +vn -0.0631 -0.9949 -0.0792 +vn -0.0983 -0.9812 -0.1660 +vn -0.0841 -0.9822 -0.1682 +vn -0.0810 -0.9869 -0.1399 +vn -0.0944 -0.9860 -0.1371 +vn -0.0705 -0.9828 -0.1704 +vn -0.0679 -0.9874 -0.1427 +vn -0.0555 -0.9878 -0.1454 +vn -0.0573 -0.9833 -0.1726 +vn -0.0538 -0.9918 -0.1156 +vn -0.0519 -0.9952 -0.0825 +vn -0.1028 -0.9758 -0.1928 +vn -0.0881 -0.9770 -0.1944 +vn -0.1086 -0.9700 -0.2177 +vn -0.0929 -0.9714 -0.2185 +vn -0.0779 -0.9726 -0.2192 +vn -0.0736 -0.9779 -0.1959 +vn -0.0993 -0.9655 -0.2409 +vn -0.1155 -0.9637 -0.2408 +vn -0.0830 -0.9670 -0.2407 +vn -0.0677 -0.9683 -0.2405 +vn -0.0631 -0.9735 -0.2198 +vn -0.0599 -0.9785 -0.1972 +vn -0.1316 -0.9617 -0.2404 +vn -0.1238 -0.9684 -0.2165 +vn -0.1389 -0.9666 -0.2153 +vn -0.1468 -0.9597 -0.2396 +vn -0.1126 -0.9801 -0.1636 +vn -0.1178 -0.9745 -0.1910 +vn -0.1272 -0.9787 -0.1614 +vn -0.1323 -0.9730 -0.1890 +vn -0.1592 -0.9745 -0.1582 +vn -0.1638 -0.9688 -0.1860 +vn -0.1476 -0.9711 -0.1874 +vn -0.1424 -0.9769 -0.1593 +vn -0.1706 -0.9620 -0.2130 +vn -0.1539 -0.9647 -0.2138 +vn -0.1625 -0.9574 -0.2388 +vn -0.1787 -0.9547 -0.2378 +vn -0.1083 -0.9850 -0.1345 +vn -0.1040 -0.9892 -0.1034 +vn -0.1182 -0.9878 -0.1012 +vn -0.1227 -0.9836 -0.1320 +vn -0.0991 -0.9926 -0.0704 +vn -0.1134 -0.9912 -0.0685 +vn -0.1469 -0.9868 -0.0676 +vn -0.1289 -0.9893 -0.0676 +vn -0.1513 -0.9835 -0.0990 +vn -0.1340 -0.9860 -0.0995 +vn -0.1381 -0.9818 -0.1302 +vn -0.1552 -0.9794 -0.1289 +vn -0.2416 -0.9667 -0.0849 +vn -0.2141 -0.9737 -0.0777 +vn -0.2438 -0.9630 -0.1150 +vn -0.2177 -0.9702 -0.1068 +vn -0.1930 -0.9759 -0.1023 +vn -0.1895 -0.9792 -0.0721 +vn -0.2466 -0.9537 -0.1721 +vn -0.2218 -0.9612 -0.1639 +vn -0.2198 -0.9660 -0.1360 +vn -0.2460 -0.9586 -0.1431 +vn -0.1986 -0.9669 -0.1600 +vn -0.1959 -0.9718 -0.1310 +vn -0.1743 -0.9762 -0.1293 +vn -0.1775 -0.9714 -0.1579 +vn -0.1711 -0.9802 -0.0995 +vn -0.1667 -0.9836 -0.0692 +vn -0.2473 -0.9485 -0.1980 +vn -0.2238 -0.9557 -0.1914 +vn -0.2469 -0.9433 -0.2221 +vn -0.2258 -0.9500 -0.2155 +vn -0.2062 -0.9550 -0.2133 +vn -0.2017 -0.9614 -0.1871 +vn -0.2296 -0.9436 -0.2384 +vn -0.2468 -0.9384 -0.2418 +vn -0.2121 -0.9481 -0.2370 +vn -0.1958 -0.9515 -0.2374 +vn -0.1877 -0.9590 -0.2124 +vn -0.1821 -0.9655 -0.1861 +vn -0.2639 -0.9309 -0.2525 +vn -0.2689 -0.9347 -0.2326 +vn -0.2887 -0.9249 -0.2473 +vn -0.2829 -0.9213 -0.2669 +vn -0.2724 -0.9447 -0.1827 +vn -0.2704 -0.9396 -0.2097 +vn -0.2959 -0.9346 -0.1972 +vn -0.2939 -0.9293 -0.2235 +vn -0.3409 -0.9113 -0.2309 +vn -0.3364 -0.9058 -0.2577 +vn -0.3147 -0.9183 -0.2400 +vn -0.3197 -0.9233 -0.2130 +vn -0.3285 -0.9015 -0.2817 +vn -0.3093 -0.9137 -0.2636 +vn -0.3003 -0.9107 -0.2835 +vn -0.3201 -0.8980 -0.3018 +vn -0.2718 -0.9498 -0.1548 +vn -0.2713 -0.9543 -0.1252 +vn -0.2967 -0.9448 -0.1388 +vn -0.2977 -0.9397 -0.1681 +vn -0.2687 -0.9585 -0.0957 +vn -0.2961 -0.9491 -0.1076 +vn -0.3477 -0.9275 -0.1373 +vn -0.3215 -0.9390 -0.1221 +vn -0.3461 -0.9226 -0.1703 +vn -0.3223 -0.9341 -0.1534 +vn -0.3210 -0.9290 -0.1842 +vn -0.3448 -0.9169 -0.2013 +vn -0.4628 -0.8611 -0.2104 +vn -0.4300 -0.8824 -0.1907 +vn -0.4554 -0.8552 -0.2476 +vn -0.4243 -0.8767 -0.2267 +vn -0.3963 -0.8945 -0.2068 +vn -0.4007 -0.8999 -0.1719 +vn -0.4379 -0.8426 -0.3134 +vn -0.4101 -0.8644 -0.2908 +vn -0.4176 -0.8706 -0.2601 +vn -0.4470 -0.8489 -0.2822 +vn -0.3854 -0.8825 -0.2696 +vn -0.3917 -0.8884 -0.2394 +vn -0.3673 -0.9037 -0.2199 +vn -0.3632 -0.8976 -0.2496 +vn -0.3711 -0.9094 -0.1878 +vn -0.3732 -0.9148 -0.1543 +vn -0.4279 -0.8368 -0.3415 +vn -0.4014 -0.8588 -0.3183 +vn -0.4172 -0.8320 -0.3657 +vn -0.3919 -0.8538 -0.3426 +vn -0.3694 -0.8720 -0.3211 +vn -0.3784 -0.8767 -0.2970 +vn -0.3810 -0.8503 -0.3630 +vn -0.4057 -0.8283 -0.3865 +vn -0.3597 -0.8682 -0.3417 +vn -0.3393 -0.8841 -0.3214 +vn -0.3493 -0.8874 -0.3010 +vn -0.3566 -0.8923 -0.2769 +vn -0.6145 -0.5017 -0.6089 +vn -0.6373 -0.4499 -0.6256 +vn -0.6221 -0.4579 -0.6350 +vn -0.5989 -0.5096 -0.6177 +vn -0.6793 -0.3285 -0.6562 +vn -0.6591 -0.3925 -0.6415 +vn -0.6651 -0.3352 -0.6673 +vn -0.6445 -0.3999 -0.6516 +vn -0.6379 -0.3507 -0.6857 +vn -0.6159 -0.4178 -0.6679 +vn -0.6301 -0.4084 -0.6604 +vn -0.6516 -0.3425 -0.6768 +vn -0.5919 -0.4775 -0.6493 +vn -0.6073 -0.4670 -0.6427 +vn -0.5832 -0.5193 -0.6246 +vn -0.5673 -0.5302 -0.6301 +vn -0.6970 -0.2574 -0.6693 +vn -0.7113 -0.1789 -0.6797 +vn -0.6980 -0.1828 -0.6924 +vn -0.6834 -0.2629 -0.6810 +vn -0.7243 -0.0000 -0.6894 +vn -0.7207 -0.0929 -0.6870 +vn -0.7113 0.0000 -0.7029 +vn -0.7079 -0.0949 -0.6999 +vn -0.6873 0.0000 -0.7263 +vn -0.6837 -0.0991 -0.7230 +vn -0.6955 -0.0970 -0.7119 +vn -0.6993 0.0000 -0.7148 +vn -0.6731 -0.1912 -0.7144 +vn -0.6856 -0.1868 -0.7036 +vn -0.6703 -0.2688 -0.6917 +vn -0.6576 -0.2751 -0.7014 +vn -0.6434 -0.1070 -0.7580 +vn -0.6479 -0.0000 -0.7617 +vn -0.6319 -0.2071 -0.7469 +vn -0.6470 -0.2013 -0.7355 +vn -0.6584 -0.1040 -0.7454 +vn -0.6623 -0.0000 -0.7492 +vn -0.5917 -0.3806 -0.7107 +vn -0.6137 -0.2988 -0.7308 +vn -0.6086 -0.3696 -0.7021 +vn -0.6301 -0.2899 -0.7204 +vn -0.6442 -0.2822 -0.7109 +vn -0.6240 -0.3595 -0.6938 +vn -0.6607 -0.1960 -0.7247 +vn -0.6754 -0.0000 -0.7375 +vn -0.6713 -0.1015 -0.7342 +vn -0.5661 -0.4531 -0.6886 +vn -0.5393 -0.5161 -0.6654 +vn -0.5586 -0.5021 -0.6602 +vn -0.5847 -0.4399 -0.6816 +vn -0.5112 -0.5715 -0.6419 +vn -0.5321 -0.5562 -0.6384 +vn -0.5502 -0.5428 -0.6346 +vn -0.5761 -0.4890 -0.6549 +vn -0.6007 -0.4284 -0.6750 +vn -0.2866 -0.5969 0.7494 +vn -0.3957 -0.5813 0.7110 +vn -0.2999 -0.5244 0.7969 +vn -0.4134 -0.5090 0.7550 +vn -0.5093 -0.4935 0.7050 +vn -0.4889 -0.5644 0.6652 +vn -0.3222 -0.3643 0.8738 +vn -0.4416 -0.3515 0.8255 +vn -0.4286 -0.4325 0.7932 +vn -0.3119 -0.4465 0.8387 +vn -0.5415 -0.3398 0.7690 +vn -0.5271 -0.4182 0.7398 +vn -0.6969 -0.3212 0.6412 +vn -0.6803 -0.3951 0.6173 +vn -0.6098 -0.4058 0.6808 +vn -0.6257 -0.3293 0.7072 +vn -0.6597 -0.4664 0.5893 +vn -0.5908 -0.4787 0.6495 +vn -0.5679 -0.5486 0.6136 +vn -0.6358 -0.5341 0.5572 +vn -0.3307 -0.2775 0.9020 +vn -0.4516 -0.2676 0.8511 +vn -0.3369 -0.1877 0.9227 +vn -0.4591 -0.1803 0.8699 +vn -0.5610 -0.1740 0.8093 +vn -0.5529 -0.2580 0.7923 +vn -0.3421 0.0000 0.9397 +vn -0.4651 0.0000 0.8853 +vn -0.4636 -0.0910 0.8814 +vn -0.3409 -0.0947 0.9353 +vn -0.5676 0.0000 0.8233 +vn -0.5659 -0.0876 0.8198 +vn -0.7270 0.0000 0.6866 +vn -0.7250 -0.0832 0.6837 +vn -0.6520 -0.0851 0.7535 +vn -0.6535 0.0000 0.7569 +vn -0.7195 -0.1648 0.6747 +vn -0.6466 -0.1686 0.7440 +vn -0.6379 -0.2503 0.7283 +vn -0.7100 -0.2442 0.6605 +vn -0.9350 0.0000 0.3545 +vn -0.9322 -0.0801 0.3529 +vn -0.8914 -0.0808 0.4460 +vn -0.8937 0.0000 0.4487 +vn -0.9245 -0.1576 0.3471 +vn -0.8839 -0.1591 0.4397 +vn -0.8367 -0.1604 0.5237 +vn -0.8432 -0.0813 0.5314 +vn -0.8457 -0.0000 0.5337 +vn -0.8948 -0.3039 0.3271 +vn -0.8562 -0.3070 0.4154 +vn -0.8723 -0.2345 0.4291 +vn -0.9118 -0.2324 0.3386 +vn -0.8108 -0.3103 0.4963 +vn -0.8257 -0.2368 0.5120 +vn -0.7720 -0.2399 0.5886 +vn -0.7581 -0.3148 0.5711 +vn -0.7820 -0.1622 0.6018 +vn -0.7901 -0.0000 0.6129 +vn -0.7883 -0.0821 0.6098 +vn -0.8735 -0.3725 0.3133 +vn -0.8363 -0.3763 0.3988 +vn -0.8484 -0.4379 0.2975 +vn -0.8125 -0.4425 0.3795 +vn -0.7693 -0.4485 0.4550 +vn -0.7921 -0.3808 0.4771 +vn -0.7847 -0.5059 0.3582 +vn -0.8194 -0.5003 0.2797 +vn -0.7431 -0.5128 0.4298 +vn -0.6934 -0.5224 0.4962 +vn -0.7190 -0.4561 0.5245 +vn -0.7403 -0.3871 0.5497 +vn -0.8452 -0.4961 0.1987 +vn -0.8755 -0.4341 0.2122 +vn -0.8930 -0.4312 0.1289 +vn -0.8617 -0.4933 0.1189 +vn -0.9241 -0.3011 0.2354 +vn -0.9019 -0.3690 0.2246 +vn -0.9432 -0.2987 0.1456 +vn -0.9202 -0.3665 0.1378 +vn -0.9549 -0.2959 -0.0239 +vn -0.9312 -0.3634 -0.0265 +vn -0.9296 -0.3646 0.0539 +vn -0.9530 -0.2971 0.0592 +vn -0.9033 -0.4281 -0.0293 +vn -0.9018 -0.4294 0.0481 +vn -0.8700 -0.4913 0.0420 +vn -0.8711 -0.4900 -0.0321 +vn -0.9421 -0.2300 0.2442 +vn -0.9553 -0.1561 0.2512 +vn -0.9754 -0.1546 0.1571 +vn -0.9616 -0.2281 0.1523 +vn -0.9664 0.0000 0.2571 +vn -0.9636 -0.0792 0.2552 +vn -0.9869 -0.0000 0.1615 +vn -0.9839 -0.0785 0.1606 +vn -0.9998 -0.0000 -0.0181 +vn -0.9968 -0.0774 -0.0182 +vn -0.9946 -0.0778 0.0689 +vn -0.9975 -0.0000 0.0700 +vn -0.9881 -0.1527 -0.0197 +vn -0.9859 -0.1535 0.0670 +vn -0.9719 -0.2266 0.0634 +vn -0.9740 -0.2257 -0.0214 +vn -0.9629 -0.0777 -0.2582 +vn -0.9661 0.0000 -0.2583 +vn -0.9542 -0.1532 -0.2569 +vn -0.9715 -0.1526 -0.1813 +vn -0.9803 -0.0774 -0.1815 +vn -0.9833 0.0000 -0.1818 +vn -0.9214 -0.2956 -0.2523 +vn -0.9402 -0.2258 -0.2552 +vn -0.9385 -0.2952 -0.1793 +vn -0.9574 -0.2253 -0.1804 +vn -0.9689 -0.2252 -0.1028 +vn -0.9498 -0.2954 -0.1032 +vn -0.9830 -0.1525 -0.1021 +vn -0.9948 -0.0000 -0.1015 +vn -0.9918 -0.0773 -0.1020 +vn -0.8983 -0.3624 -0.2486 +vn -0.8711 -0.4262 -0.2439 +vn -0.8874 -0.4266 -0.1749 +vn -0.9150 -0.3624 -0.1774 +vn -0.8404 -0.4870 -0.2379 +vn -0.8558 -0.4881 -0.1717 +vn -0.8662 -0.4889 -0.1031 +vn -0.8982 -0.4273 -0.1036 +vn -0.9262 -0.3627 -0.1035 +vn 0.3529 -0.5816 0.7329 +vn 0.2992 -0.5940 0.7468 +vn 0.3784 -0.5109 0.7719 +vn 0.3203 -0.5247 0.7888 +vn 0.2587 -0.5341 0.8049 +vn 0.2417 -0.6041 0.7594 +vn 0.4195 -0.3568 0.8347 +vn 0.3546 -0.3695 0.8589 +vn 0.3389 -0.4492 0.8267 +vn 0.4005 -0.4366 0.8056 +vn 0.2858 -0.3777 0.8807 +vn 0.2735 -0.4591 0.8453 +vn 0.1262 -0.3858 0.9139 +vn 0.1212 -0.4685 0.8751 +vn 0.2016 -0.4650 0.8620 +vn 0.2105 -0.3835 0.8992 +vn 0.1145 -0.5448 0.8307 +vn 0.1910 -0.5411 0.8190 +vn 0.1781 -0.6108 0.7715 +vn 0.1066 -0.6153 0.7810 +vn 0.4350 -0.2737 0.8578 +vn 0.3673 -0.2837 0.8858 +vn 0.4463 -0.1857 0.8754 +vn 0.3769 -0.1937 0.9058 +vn 0.3031 -0.1987 0.9320 +vn 0.2958 -0.2913 0.9098 +vn 0.4558 -0.0000 0.8901 +vn 0.3848 -0.0000 0.9230 +vn 0.3827 -0.0986 0.9186 +vn 0.4537 -0.0946 0.8861 +vn 0.3092 -0.0000 0.9510 +vn 0.3076 -0.1016 0.9461 +vn 0.1344 0.0000 0.9909 +vn 0.1337 -0.1036 0.9856 +vn 0.2255 -0.1031 0.9688 +vn 0.2263 -0.0000 0.9741 +vn 0.1325 -0.2029 0.9702 +vn 0.2224 -0.2020 0.9538 +vn 0.2175 -0.2954 0.9303 +vn 0.1299 -0.2974 0.9459 +vn -0.2087 -0.0984 0.9730 +vn -0.2100 0.0000 0.9777 +vn -0.2059 -0.1942 0.9591 +vn -0.0818 -0.1992 0.9765 +vn -0.0838 -0.1012 0.9913 +vn -0.0840 0.0000 0.9965 +vn -0.1952 -0.3747 0.9064 +vn -0.2011 -0.2867 0.9367 +vn -0.0764 -0.3818 0.9211 +vn -0.0794 -0.2929 0.9528 +vn 0.0313 -0.2965 0.9545 +vn 0.0309 -0.3855 0.9222 +vn 0.0311 -0.2021 0.9789 +vn 0.0306 0.0000 0.9995 +vn 0.0311 -0.1029 0.9942 +vn -0.1883 -0.4581 0.8687 +vn -0.1806 -0.5360 0.8247 +vn -0.0707 -0.5430 0.8368 +vn -0.0734 -0.4653 0.8821 +vn -0.1728 -0.6084 0.7746 +vn -0.0681 -0.6147 0.7858 +vn 0.0247 -0.6166 0.7869 +vn 0.0280 -0.5457 0.8375 +vn 0.0298 -0.4685 0.8829 +vn -0.5997 -0.5836 -0.5475 +vn -0.5733 -0.6268 -0.5277 +vn -0.5911 -0.6271 -0.5072 +vn -0.6184 -0.5826 -0.5275 +vn -0.5175 -0.7061 -0.4833 +vn -0.5458 -0.6680 -0.5059 +vn -0.5332 -0.7083 -0.4627 +vn -0.5625 -0.6690 -0.4858 +vn -0.5658 -0.7168 -0.4075 +vn -0.5984 -0.6761 -0.4299 +vn -0.5802 -0.6720 -0.4602 +vn -0.5492 -0.7119 -0.4377 +vn -0.6303 -0.6321 -0.4507 +vn -0.6101 -0.6289 -0.4819 +vn -0.6389 -0.5833 -0.5016 +vn -0.6606 -0.5852 -0.4703 +vn -0.4889 -0.7416 -0.4594 +vn -0.4605 -0.7736 -0.4354 +vn -0.4740 -0.7768 -0.4146 +vn -0.5035 -0.7441 -0.4391 +vn -0.4325 -0.8026 -0.4107 +vn -0.4451 -0.8060 -0.3903 +vn -0.4684 -0.8167 -0.3372 +vn -0.4570 -0.8109 -0.3655 +vn -0.5002 -0.7872 -0.3608 +vn -0.4872 -0.7814 -0.3900 +vn -0.5182 -0.7485 -0.4139 +vn -0.5328 -0.7538 -0.3846 +vn -0.4989 -0.8355 -0.2302 +vn -0.5365 -0.8060 -0.2503 +vn -0.5251 -0.7998 -0.2908 +vn -0.4893 -0.8295 -0.2694 +vn -0.6150 -0.7338 -0.2886 +vn -0.5756 -0.7720 -0.2695 +vn -0.5992 -0.7282 -0.3329 +vn -0.5617 -0.7661 -0.3123 +vn -0.5475 -0.7599 -0.3504 +vn -0.5824 -0.7224 -0.3728 +vn -0.5128 -0.7934 -0.3280 +vn -0.4792 -0.8230 -0.3049 +vn -0.6546 -0.6911 -0.3063 +vn -0.6930 -0.6445 -0.3232 +vn -0.6725 -0.6402 -0.3714 +vn -0.6361 -0.6861 -0.3530 +vn -0.7298 -0.5942 -0.3381 +vn -0.7069 -0.5910 -0.3886 +vn -0.6837 -0.5879 -0.4324 +vn -0.6511 -0.6360 -0.4142 +vn -0.6173 -0.6810 -0.3939 +vn 0.0000 -0.5384 0.8427 +vn 0.1916 -0.5342 0.8233 +vn 0.0000 -0.4721 0.8815 +vn 0.2105 -0.4637 0.8606 +vn 0.3557 -0.4545 0.8166 +vn 0.3280 -0.5237 0.7862 +vn 0.0000 -0.3249 0.9458 +vn 0.2411 -0.3168 0.9173 +vn 0.2263 -0.3930 0.8913 +vn 0.0000 -0.3982 0.9173 +vn 0.4027 -0.3075 0.8622 +vn 0.3818 -0.3810 0.8420 +vn 0.5320 -0.3049 0.7899 +vn 0.5079 -0.3795 0.7733 +vn 0.4687 -0.3766 0.7991 +vn 0.4933 -0.3020 0.8157 +vn 0.4781 -0.4530 0.7525 +vn 0.4406 -0.4492 0.7773 +vn 0.4072 -0.5206 0.7504 +vn 0.4446 -0.5245 0.7262 +vn -0.0000 -0.2453 0.9694 +vn 0.2521 -0.2409 0.9372 +vn -0.0000 -0.1662 0.9861 +vn 0.2612 -0.1612 0.9517 +vn 0.4327 -0.1552 0.8881 +vn 0.4206 -0.2312 0.8773 +vn 0.0000 0.0000 1.0000 +vn 0.2683 0.0000 0.9633 +vn 0.2661 -0.0815 0.9605 +vn 0.0000 -0.0832 0.9965 +vn 0.4431 -0.0000 0.8964 +vn 0.4411 -0.0777 0.8941 +vn 0.5771 -0.0000 0.8167 +vn 0.5748 -0.0769 0.8147 +vn 0.5342 -0.0762 0.8419 +vn 0.5378 -0.0000 0.8431 +vn 0.5655 -0.1534 0.8103 +vn 0.5264 -0.1517 0.8366 +vn 0.5118 -0.2274 0.8284 +vn 0.5520 -0.2293 0.8017 +vn 0.5142 -0.0893 0.8530 +vn 0.5174 0.0000 0.8558 +vn 0.5065 -0.1765 0.8440 +vn 0.5484 -0.1668 0.8194 +vn 0.5574 -0.0842 0.8260 +vn 0.5597 0.0000 0.8287 +vn 0.4760 -0.3424 0.8101 +vn 0.4933 -0.2606 0.8299 +vn 0.5161 -0.3269 0.7916 +vn 0.5351 -0.2480 0.8076 +vn 0.5559 -0.2368 0.7968 +vn 0.5370 -0.3139 0.7830 +vn 0.5704 -0.1587 0.8059 +vn 0.5820 -0.0000 0.8132 +vn 0.5785 -0.0798 0.8118 +vn 0.4543 -0.4202 0.7855 +vn 0.4288 -0.4953 0.7555 +vn 0.4653 -0.4782 0.7449 +vn 0.4930 -0.4042 0.7705 +vn 0.4000 -0.5656 0.7212 +vn 0.4336 -0.5499 0.7139 +vn 0.4503 -0.5349 0.7149 +vn 0.4837 -0.4636 0.7424 +vn 0.5125 -0.3895 0.7653 +vn 0.0000 -0.7887 -0.6148 +vn -0.0660 -0.7858 -0.6149 +vn 0.0000 -0.8152 -0.5791 +vn -0.0593 -0.8135 -0.5786 +vn -0.1218 -0.8067 -0.5783 +vn -0.1342 -0.7787 -0.6129 +vn 0.0000 -0.8567 -0.5158 +vn -0.0483 -0.8555 -0.5156 +vn -0.0537 -0.8359 -0.5462 +vn 0.0000 -0.8380 -0.5457 +vn -0.0996 -0.8505 -0.5164 +vn -0.1097 -0.8307 -0.5458 +vn -0.1991 -0.8320 -0.5177 +vn -0.2181 -0.8092 -0.5455 +vn -0.1660 -0.8212 -0.5459 +vn -0.1501 -0.8429 -0.5167 +vn -0.2397 -0.7821 -0.5751 +vn -0.1824 -0.7964 -0.5767 +vn -0.2012 -0.7662 -0.6103 +vn -0.2619 -0.7506 -0.6066 +vn 0.0000 -0.8732 -0.4873 +vn -0.0438 -0.8718 -0.4880 +vn 0.0000 -0.8872 -0.4613 +vn -0.0394 -0.8863 -0.4614 +vn -0.0812 -0.8828 -0.4627 +vn -0.0896 -0.8680 -0.4884 +vn -0.0356 -0.8988 -0.4370 +vn 0.0000 -0.8998 -0.4363 +vn -0.0729 -0.8961 -0.4378 +vn -0.1484 -0.8846 -0.4421 +vn -0.1114 -0.8911 -0.4399 +vn -0.1643 -0.8692 -0.4663 +vn -0.1229 -0.8773 -0.4640 +vn -0.1364 -0.8611 -0.4899 +vn -0.1805 -0.8521 -0.4912 +vn -0.2476 -0.8573 -0.4514 +vn -0.2695 -0.8381 -0.4744 +vn -0.2382 -0.8492 -0.4714 +vn -0.2172 -0.8671 -0.4483 +vn -0.3177 -0.7917 -0.5218 +vn -0.2932 -0.8164 -0.4976 +vn -0.2834 -0.8058 -0.5200 +vn -0.2597 -0.8289 -0.4954 +vn -0.2226 -0.8410 -0.4932 +vn -0.2433 -0.8196 -0.5187 +vn -0.2024 -0.8599 -0.4686 +vn -0.1845 -0.8762 -0.4451 +vn -0.3439 -0.7638 -0.5463 +vn -0.3709 -0.7318 -0.5718 +vn -0.3341 -0.7490 -0.5721 +vn -0.3078 -0.7794 -0.5458 +vn -0.3990 -0.6957 -0.5974 +vn -0.3612 -0.7139 -0.5999 +vn -0.3159 -0.7327 -0.6028 +vn -0.2900 -0.7661 -0.5735 +vn -0.2663 -0.7947 -0.5454 +vn 0.3858 -0.8283 -0.4062 +vn 0.3744 -0.8276 -0.4182 +vn 0.4008 -0.8023 -0.4424 +vn 0.4133 -0.8019 -0.4314 +vn 0.3615 -0.8290 -0.4268 +vn 0.3871 -0.8043 -0.4508 +vn 0.4137 -0.7771 -0.4743 +vn 0.4282 -0.7737 -0.4669 +vn 0.4417 -0.7727 -0.4558 +vn 0.3314 -0.8367 -0.4361 +vn 0.3556 -0.8140 -0.4592 +vn 0.3720 -0.8085 -0.4560 +vn 0.3472 -0.8319 -0.4329 +vn 0.3811 -0.7890 -0.4819 +vn 0.3980 -0.7821 -0.4795 +vn 0.4344 -0.7302 -0.5273 +vn 0.4521 -0.7209 -0.5252 +vn 0.4248 -0.7531 -0.5024 +vn 0.4075 -0.7609 -0.5050 +vn 0.4687 -0.7137 -0.5205 +vn 0.4410 -0.7467 -0.4979 +vn 0.4994 -0.7052 -0.5033 +vn 0.4706 -0.7403 -0.4802 +vn 0.4562 -0.7425 -0.4904 +vn 0.4844 -0.7082 -0.5136 +vn 0.3142 -0.8425 -0.4376 +vn 0.3379 -0.8212 -0.4599 +vn 0.2955 -0.8496 -0.4369 +vn 0.3186 -0.8291 -0.4594 +vn 0.3431 -0.8064 -0.4817 +vn 0.3628 -0.7970 -0.4828 +vn 0.2523 -0.8657 -0.4324 +vn 0.2740 -0.8474 -0.4547 +vn 0.2976 -0.8381 -0.4572 +vn 0.2749 -0.8573 -0.4353 +vn 0.2974 -0.8270 -0.4771 +vn 0.3214 -0.8163 -0.4799 +vn 0.3474 -0.7780 -0.5236 +vn 0.3727 -0.7646 -0.5258 +vn 0.3466 -0.7921 -0.5025 +vn 0.3217 -0.8039 -0.5003 +vn 0.3951 -0.7523 -0.5272 +vn 0.3687 -0.7807 -0.5046 +vn 0.3888 -0.7704 -0.5053 +vn 0.4156 -0.7405 -0.5281 +vn 0.4583 -0.6362 -0.6207 +vn 0.4835 -0.6192 -0.6187 +vn 0.4553 -0.6619 -0.5955 +vn 0.4299 -0.6779 -0.5963 +vn 0.5047 -0.6041 -0.6167 +vn 0.4776 -0.6465 -0.5950 +vn 0.4498 -0.6854 -0.5726 +vn 0.4274 -0.6998 -0.5724 +vn 0.4016 -0.7155 -0.5716 +vn 0.5416 -0.5770 -0.6114 +vn 0.5158 -0.6195 -0.5917 +vn 0.4973 -0.6326 -0.5937 +vn 0.5241 -0.5897 -0.6145 +vn 0.4889 -0.6595 -0.5710 +vn 0.4703 -0.6717 -0.5724 +vn 0.4428 -0.7079 -0.5503 +vn 0.4618 -0.6962 -0.5496 +vn 0.4224 -0.7204 -0.5502 +vn 0.3740 -0.7484 -0.5477 +vn 0.3997 -0.7342 -0.5488 +vn 0.5584 -0.5652 -0.6072 +vn 0.5330 -0.6082 -0.5882 +vn 0.5744 -0.5553 -0.6014 +vn 0.5496 -0.5982 -0.5832 +vn 0.5234 -0.6393 -0.5634 +vn 0.5067 -0.6484 -0.5682 +vn 0.6065 -0.5400 -0.5836 +vn 0.5818 -0.5840 -0.5660 +vn 0.5657 -0.5902 -0.5758 +vn 0.5904 -0.5466 -0.5938 +vn 0.5555 -0.6267 -0.5465 +vn 0.5396 -0.6318 -0.5565 +vn 0.5123 -0.6714 -0.5355 +vn 0.5279 -0.6670 -0.5258 +vn 0.4963 -0.6777 -0.5426 +vn 0.4795 -0.6862 -0.5470 +vn 0.4836 -0.8683 0.1105 +vn 0.5080 -0.8526 0.1227 +vn 0.4872 -0.8603 0.1504 +vn 0.4620 -0.8785 0.1219 +vn 0.5461 -0.8256 0.1418 +vn 0.5216 -0.8344 0.1780 +vn 0.4885 -0.8469 0.2099 +vn 0.4553 -0.8732 0.1740 +vn 0.4313 -0.8914 0.1392 +vn 0.6290 -0.7555 0.1832 +vn 0.6007 -0.7644 0.2342 +vn 0.5595 -0.8029 0.2057 +vn 0.5859 -0.7941 0.1616 +vn 0.5648 -0.7762 0.2802 +vn 0.5253 -0.8148 0.2452 +vn 0.4724 -0.8065 0.3554 +vn 0.4381 -0.8441 0.3093 +vn 0.4846 -0.8289 0.2795 +vn 0.5217 -0.7905 0.3209 +vn 0.4072 -0.8750 0.2619 +vn 0.4498 -0.8610 0.2375 +vn 0.3600 -0.9171 0.1710 +vn 0.3970 -0.9046 0.1549 +vn 0.4205 -0.8860 0.1956 +vn 0.3804 -0.8994 0.2153 +vn 0.6723 -0.7114 0.2048 +vn 0.6421 -0.7203 0.2622 +vn 0.7125 -0.6644 0.2254 +vn 0.6814 -0.6727 0.2883 +vn 0.6423 -0.6840 0.3457 +vn 0.6046 -0.7320 0.3142 +vn 0.7865 -0.5582 0.2643 +vn 0.7531 -0.5650 0.3371 +vn 0.7181 -0.6214 0.3134 +vn 0.7506 -0.6136 0.2449 +vn 0.7120 -0.5740 0.4045 +vn 0.6786 -0.6312 0.3756 +vn 0.6072 -0.5988 0.5223 +vn 0.5762 -0.6587 0.4839 +vn 0.6310 -0.6440 0.4325 +vn 0.6640 -0.5849 0.4658 +vn 0.5425 -0.7137 0.4431 +vn 0.5963 -0.6976 0.3973 +vn 0.5594 -0.7466 0.3600 +vn 0.5076 -0.7629 0.4004 +vn 0.2723 -0.6640 0.6964 +vn 0.2570 -0.7250 0.6391 +vn 0.3546 -0.7100 0.6085 +vn 0.3760 -0.6484 0.6620 +vn 0.2421 -0.7790 0.5784 +vn 0.3323 -0.7649 0.5519 +vn 0.4117 -0.7483 0.5202 +vn 0.4391 -0.6928 0.5720 +vn 0.4650 -0.6314 0.6206 +vn 0.2149 -0.8652 0.4530 +vn 0.2898 -0.8533 0.4335 +vn 0.3107 -0.8126 0.4931 +vn 0.2274 -0.8260 0.5158 +vn 0.3573 -0.8387 0.4110 +vn 0.3838 -0.7970 0.4663 +vn 0.4493 -0.7801 0.4354 +vn 0.4174 -0.8230 0.3854 +vn 0.4813 -0.7308 0.4841 +vn 0.5418 -0.6142 0.5738 +vn 0.5123 -0.6755 0.5303 +vn 0.2037 -0.8976 0.3908 +vn 0.2718 -0.8865 0.3745 +vn 0.1958 -0.9231 0.3310 +vn 0.2560 -0.9133 0.3167 +vn 0.3106 -0.9016 0.3009 +vn 0.3320 -0.8737 0.3556 +vn 0.1880 -0.9571 0.2207 +vn 0.2358 -0.9489 0.2098 +vn 0.2443 -0.9337 0.2618 +vn 0.1903 -0.9428 0.2738 +vn 0.2794 -0.9395 0.1983 +vn 0.2924 -0.9236 0.2480 +vn 0.3378 -0.9119 0.2330 +vn 0.3200 -0.9291 0.1852 +vn 0.3600 -0.8890 0.2830 +vn 0.3876 -0.8592 0.3341 +vn 0.2536 -0.8746 -0.4132 +vn 0.2315 -0.8819 -0.4108 +vn 0.2735 -0.8677 -0.4151 +vn 0.2527 -0.8841 -0.3930 +vn 0.2332 -0.8901 -0.3917 +vn 0.2120 -0.8965 -0.3889 +vn 0.3087 -0.8564 -0.4138 +vn 0.2918 -0.8617 -0.4151 +vn 0.2872 -0.8741 -0.3917 +vn 0.2707 -0.8786 -0.3934 +vn 0.2478 -0.9040 -0.3484 +vn 0.2316 -0.9077 -0.3498 +vn 0.2506 -0.8940 -0.3715 +vn 0.2672 -0.8897 -0.3702 +vn 0.2144 -0.9121 -0.3495 +vn 0.2330 -0.8988 -0.3714 +vn 0.1763 -0.9216 -0.3459 +vn 0.1934 -0.9097 -0.3675 +vn 0.2141 -0.9041 -0.3698 +vn 0.1960 -0.9167 -0.3482 +vn 0.3239 -0.8527 -0.4099 +vn 0.3380 -0.8501 -0.4038 +vn 0.3164 -0.8684 -0.3817 +vn 0.3028 -0.8704 -0.3882 +vn 0.3609 -0.8506 -0.3824 +vn 0.3501 -0.8496 -0.3945 +vn 0.3387 -0.8693 -0.3600 +vn 0.3288 -0.8678 -0.3726 +vn 0.2991 -0.8996 -0.3183 +vn 0.2899 -0.8982 -0.3305 +vn 0.3086 -0.8839 -0.3514 +vn 0.3190 -0.8850 -0.3390 +vn 0.2773 -0.8989 -0.3393 +vn 0.2968 -0.8842 -0.3606 +vn 0.2824 -0.8865 -0.3666 +vn 0.2634 -0.9007 -0.3453 +vn 0.2390 -0.9370 -0.2549 +vn 0.2306 -0.9388 -0.2560 +vn 0.2405 -0.9315 -0.2729 +vn 0.2499 -0.9313 -0.2650 +vn 0.2166 -0.9416 -0.2579 +vn 0.2278 -0.9334 -0.2772 +vn 0.2425 -0.9234 -0.2977 +vn 0.2557 -0.9219 -0.2911 +vn 0.2644 -0.9225 -0.2812 +vn 0.1871 -0.9471 -0.2607 +vn 0.1988 -0.9384 -0.2825 +vn 0.2140 -0.9357 -0.2804 +vn 0.2025 -0.9443 -0.2593 +vn 0.2132 -0.9283 -0.3045 +vn 0.2285 -0.9255 -0.3019 +vn 0.2450 -0.9139 -0.3236 +vn 0.2298 -0.9168 -0.3267 +vn 0.2595 -0.9118 -0.3183 +vn 0.2815 -0.9119 -0.2987 +vn 0.2714 -0.9111 -0.3102 +vn 0.1712 -0.9499 -0.2616 +vn 0.1832 -0.9413 -0.2836 +vn 0.1561 -0.9523 -0.2623 +vn 0.1674 -0.9441 -0.2839 +vn 0.1814 -0.9347 -0.3058 +vn 0.1973 -0.9314 -0.3058 +vn 0.1240 -0.9570 -0.2621 +vn 0.1339 -0.9498 -0.2827 +vn 0.1515 -0.9469 -0.2836 +vn 0.1403 -0.9547 -0.2624 +vn 0.1464 -0.9415 -0.3035 +vn 0.1643 -0.9381 -0.3050 +vn 0.1795 -0.9280 -0.3265 +vn 0.1603 -0.9321 -0.3247 +vn 0.1969 -0.9240 -0.3277 +vn 0.2137 -0.9203 -0.3278 +vn 0.0808 -0.9960 -0.0372 +vn 0.0930 -0.9950 -0.0353 +vn 0.0848 -0.9964 -0.0001 +vn 0.0739 -0.9973 -0.0008 +vn 0.1059 -0.9938 -0.0343 +vn 0.0980 -0.9952 0.0000 +vn 0.0877 -0.9956 0.0330 +vn 0.0754 -0.9966 0.0344 +vn 0.0646 -0.9973 0.0345 +vn 0.1373 -0.9899 -0.0352 +vn 0.1299 -0.9915 -0.0029 +vn 0.1125 -0.9936 -0.0011 +vn 0.1211 -0.9921 -0.0341 +vn 0.1200 -0.9924 0.0279 +vn 0.1030 -0.9942 0.0311 +vn 0.0957 -0.9913 0.0904 +vn 0.0773 -0.9924 0.0954 +vn 0.0908 -0.9939 0.0627 +vn 0.1091 -0.9923 0.0589 +vn 0.0613 -0.9932 0.0994 +vn 0.0760 -0.9949 0.0661 +vn 0.0389 -0.9936 0.1058 +vn 0.0535 -0.9961 0.0701 +vn 0.0631 -0.9957 0.0683 +vn 0.0489 -0.9935 0.1032 +vn 0.1563 -0.9870 -0.0371 +vn 0.1486 -0.9889 -0.0061 +vn 0.1767 -0.9834 -0.0410 +vn 0.1704 -0.9853 -0.0101 +vn 0.1620 -0.9866 0.0192 +vn 0.1401 -0.9898 0.0242 +vn 0.2242 -0.9731 -0.0532 +vn 0.2202 -0.9752 -0.0224 +vn 0.1937 -0.9809 -0.0158 +vn 0.1999 -0.9787 -0.0458 +vn 0.2144 -0.9767 0.0065 +vn 0.1873 -0.9822 0.0136 +vn 0.2025 -0.9771 0.0654 +vn 0.1711 -0.9826 0.0727 +vn 0.1791 -0.9829 0.0425 +vn 0.2089 -0.9773 0.0356 +vn 0.1425 -0.9866 0.0791 +vn 0.1532 -0.9870 0.0488 +vn 0.1293 -0.9901 0.0541 +vn 0.1179 -0.9894 0.0852 +vn 0.1403 -0.9631 0.2295 +vn 0.1462 -0.9725 0.1815 +vn 0.1888 -0.9667 0.1730 +vn 0.0981 -0.9665 0.2372 +vn 0.1089 -0.9760 0.1888 +vn 0.1200 -0.9817 0.1477 +vn 0.1540 -0.9780 0.1405 +vn 0.1919 -0.9724 0.1328 +vn 0.0294 -0.9679 0.2495 +vn 0.0479 -0.9783 0.2017 +vn 0.0760 -0.9778 0.1955 +vn 0.0613 -0.9679 0.2436 +vn 0.0650 -0.9849 0.1605 +vn 0.0908 -0.9838 0.1544 +vn 0.1045 -0.9875 0.1181 +vn 0.0814 -0.9889 0.1240 +vn 0.1318 -0.9850 0.1118 +vn 0.1971 -0.9755 0.0973 +vn 0.1621 -0.9812 0.1048 +vn 0.0024 -0.9669 0.2550 +vn 0.0236 -0.9779 0.2077 +vn -0.0205 -0.9652 0.2606 +vn 0.0039 -0.9769 0.2136 +vn 0.0253 -0.9848 0.1720 +vn 0.0436 -0.9851 0.1665 +vn -0.0535 -0.9606 0.2729 +vn -0.0242 -0.9739 0.2256 +vn -0.0125 -0.9755 0.2195 +vn -0.0388 -0.9631 0.2665 +vn 0.0003 -0.9832 0.1826 +vn 0.0112 -0.9840 0.1776 +vn 0.0312 -0.9898 0.1390 +vn 0.0218 -0.9894 0.1433 +vn 0.0448 -0.9899 0.1346 +vn 0.0611 -0.9897 0.1294 +vn 0.4637 -0.8698 -0.1685 +vn 0.5055 -0.8421 -0.1878 +vn 0.5133 -0.8463 -0.1424 +vn 0.4696 -0.8738 -0.1261 +vn 0.5488 -0.8101 -0.2064 +vn 0.5579 -0.8146 -0.1587 +vn 0.5645 -0.8176 -0.1135 +vn 0.5179 -0.8495 -0.1009 +vn 0.4736 -0.8765 -0.0869 +vn 0.6360 -0.7330 -0.2413 +vn 0.6487 -0.7374 -0.1880 +vn 0.6036 -0.7781 -0.1736 +vn 0.5924 -0.7737 -0.2246 +vn 0.6583 -0.7405 -0.1356 +vn 0.6112 -0.7815 -0.1254 +vn 0.6685 -0.7430 -0.0326 +vn 0.6204 -0.7837 -0.0312 +vn 0.6172 -0.7829 -0.0780 +vn 0.6646 -0.7424 -0.0845 +vn 0.5718 -0.8199 -0.0272 +vn 0.5687 -0.8195 -0.0706 +vn 0.4780 -0.8782 -0.0135 +vn 0.4755 -0.8783 -0.0502 +vn 0.5216 -0.8510 -0.0608 +vn 0.5234 -0.8518 -0.0218 +vn 0.6784 -0.6881 -0.2574 +vn 0.6932 -0.6922 -0.2006 +vn 0.7192 -0.6396 -0.2713 +vn 0.7355 -0.6433 -0.2124 +vn 0.7476 -0.6463 -0.1531 +vn 0.7037 -0.6955 -0.1452 +vn 0.7925 -0.5339 -0.2948 +vn 0.8119 -0.5361 -0.2310 +vn 0.7755 -0.5910 -0.2222 +vn 0.7574 -0.5879 -0.2842 +vn 0.8263 -0.5383 -0.1657 +vn 0.7885 -0.5938 -0.1602 +vn 0.8392 -0.5429 -0.0307 +vn 0.8004 -0.5986 -0.0321 +vn 0.7970 -0.5962 -0.0968 +vn 0.8354 -0.5406 -0.0994 +vn 0.7589 -0.6504 -0.0328 +vn 0.7552 -0.6487 -0.0937 +vn 0.7111 -0.6974 -0.0894 +vn 0.7146 -0.6987 -0.0333 +vn 0.7747 -0.6079 0.1739 +vn 0.8119 -0.5527 0.1880 +vn 0.7356 -0.6584 0.1592 +vn 0.7502 -0.6546 0.0937 +vn 0.7904 -0.6039 0.1033 +vn 0.8284 -0.5486 0.1132 +vn 0.6496 -0.7492 0.1291 +vn 0.6941 -0.7053 0.1446 +vn 0.6624 -0.7454 0.0746 +vn 0.7077 -0.7016 0.0838 +vn 0.7140 -0.6997 0.0246 +vn 0.6682 -0.7437 0.0201 +vn 0.7575 -0.6522 0.0294 +vn 0.8371 -0.5455 0.0399 +vn 0.7986 -0.6009 0.0347 +vn 0.6047 -0.7882 0.1147 +vn 0.5617 -0.8211 0.1016 +vn 0.5695 -0.8199 0.0589 +vn 0.6157 -0.7852 0.0656 +vn 0.4816 -0.8720 0.0877 +vn 0.5200 -0.8493 0.0914 +vn 0.4813 -0.8748 0.0558 +vn 0.5233 -0.8504 0.0542 +vn 0.5245 -0.8512 0.0174 +vn 0.4790 -0.8775 0.0216 +vn 0.5717 -0.8203 0.0155 +vn 0.6205 -0.7840 0.0171 +vn 0.1365 -0.9491 0.2840 +vn 0.1349 -0.9300 0.3419 +vn 0.0811 -0.9332 0.3500 +vn 0.0888 -0.9524 0.2915 +vn 0.1385 -0.8734 0.4670 +vn 0.1359 -0.9048 0.4035 +vn 0.0707 -0.8768 0.4755 +vn 0.0749 -0.9084 0.4114 +vn -0.0415 -0.8753 0.4818 +vn -0.0247 -0.9074 0.4195 +vn 0.0217 -0.9089 0.4165 +vn 0.0106 -0.8773 0.4797 +vn -0.0072 -0.9330 0.3598 +vn 0.0338 -0.9341 0.3554 +vn 0.0471 -0.9535 0.2977 +vn 0.0110 -0.9530 0.3028 +vn 0.1435 -0.8345 0.5320 +vn 0.1494 -0.7885 0.5966 +vn 0.0662 -0.7926 0.6061 +vn 0.0675 -0.8385 0.5407 +vn 0.1646 -0.6749 0.7194 +vn 0.1569 -0.7350 0.6597 +vn 0.0667 -0.6803 0.7299 +vn 0.0657 -0.7399 0.6696 +vn -0.0967 -0.6795 0.7273 +vn -0.0853 -0.7383 0.6691 +vn -0.0146 -0.7404 0.6720 +vn -0.0206 -0.6817 0.7314 +vn -0.0719 -0.7907 0.6080 +vn -0.0077 -0.7932 0.6089 +vn 0.0010 -0.8387 0.5446 +vn -0.0574 -0.8366 0.5448 +vn -0.3250 -0.6464 0.6903 +vn -0.2940 -0.7073 0.6428 +vn -0.2495 -0.7179 0.6499 +vn -0.2755 -0.6589 0.7000 +vn -0.2613 -0.7619 0.5927 +vn -0.2212 -0.7721 0.5958 +vn -0.1774 -0.7798 0.6003 +vn -0.2010 -0.7269 0.6566 +vn -0.2224 -0.6679 0.7103 +vn -0.1909 -0.8532 0.4855 +vn -0.1604 -0.8607 0.4832 +vn -0.1915 -0.8195 0.5402 +vn -0.2263 -0.8111 0.5394 +vn -0.1262 -0.8667 0.4826 +vn -0.1523 -0.8268 0.5415 +vn -0.1080 -0.8323 0.5437 +vn -0.0868 -0.8718 0.4821 +vn -0.1282 -0.7863 0.6044 +vn -0.1636 -0.6751 0.7194 +vn -0.1467 -0.7334 0.6638 +vn -0.1546 -0.8892 0.4306 +vn -0.1294 -0.8950 0.4268 +vn -0.1197 -0.9185 0.3768 +vn -0.0981 -0.9234 0.3712 +vn -0.0727 -0.9273 0.3671 +vn -0.0994 -0.9003 0.4238 +vn -0.0681 -0.9457 0.3178 +vn -0.0852 -0.9423 0.3239 +vn -0.0461 -0.9489 0.3123 +vn -0.0200 -0.9513 0.3076 +vn -0.0424 -0.9307 0.3632 +vn -0.0648 -0.9043 0.4219 +vn 0.2316 -0.9589 0.1638 +vn 0.2310 -0.9650 0.1239 +vn 0.2670 -0.9569 0.1146 +vn 0.2710 -0.9503 0.1533 +vn 0.2357 -0.9701 0.0574 +vn 0.2323 -0.9686 0.0890 +vn 0.2671 -0.9625 0.0484 +vn 0.2663 -0.9606 0.0800 +vn 0.3302 -0.9435 0.0284 +vn 0.3321 -0.9414 0.0599 +vn 0.2989 -0.9517 0.0703 +vn 0.2986 -0.9536 0.0388 +vn 0.3369 -0.9369 0.0936 +vn 0.3019 -0.9476 0.1042 +vn 0.3085 -0.9405 0.1423 +vn 0.3456 -0.9293 0.1299 +vn 0.2391 -0.9706 0.0274 +vn 0.2435 -0.9699 -0.0015 +vn 0.2718 -0.9623 -0.0110 +vn 0.2695 -0.9628 0.0186 +vn 0.2505 -0.9661 -0.0619 +vn 0.2469 -0.9685 -0.0313 +vn 0.2761 -0.9583 -0.0732 +vn 0.2747 -0.9607 -0.0409 +vn 0.3301 -0.9386 -0.0998 +vn 0.3311 -0.9414 -0.0648 +vn 0.3021 -0.9518 -0.0525 +vn 0.3030 -0.9491 -0.0854 +vn 0.3306 -0.9432 -0.0330 +vn 0.3011 -0.9534 -0.0212 +vn 0.2993 -0.9541 0.0086 +vn 0.3301 -0.9439 -0.0021 +vn 0.4297 -0.8963 -0.1094 +vn 0.4248 -0.8929 -0.1496 +vn 0.4321 -0.8989 -0.0727 +vn 0.3954 -0.9166 -0.0588 +vn 0.3938 -0.9144 -0.0936 +vn 0.3903 -0.9112 -0.1318 +vn 0.4356 -0.9001 -0.0039 +vn 0.4340 -0.9001 -0.0380 +vn 0.3981 -0.9173 0.0068 +vn 0.3962 -0.9178 -0.0258 +vn 0.3620 -0.9321 -0.0138 +vn 0.3629 -0.9316 0.0176 +vn 0.3619 -0.9311 -0.0453 +vn 0.3592 -0.9261 -0.1149 +vn 0.3612 -0.9292 -0.0789 +vn 0.4389 -0.8980 0.0297 +vn 0.4420 -0.8949 0.0617 +vn 0.4065 -0.9108 0.0717 +vn 0.4009 -0.9153 0.0390 +vn 0.4499 -0.8881 0.0943 +vn 0.4153 -0.9036 0.1048 +vn 0.3817 -0.9168 0.1177 +vn 0.3715 -0.9248 0.0823 +vn 0.3660 -0.9293 0.0495 +vn 0.7383 0.0000 -0.6745 +vn 0.7552 0.0000 -0.6555 +vn 0.7517 -0.0884 -0.6535 +vn 0.7350 -0.0905 -0.6720 +vn 0.7756 0.0000 -0.6312 +vn 0.7725 -0.0864 -0.6291 +vn 0.7634 -0.1669 -0.6240 +vn 0.7427 -0.1706 -0.6475 +vn 0.7255 -0.1744 -0.6657 +vn 0.8267 0.0000 -0.5626 +vn 0.8237 -0.0825 -0.5610 +vn 0.7965 -0.0843 -0.5988 +vn 0.7999 0.0000 -0.6002 +vn 0.8149 -0.1602 -0.5571 +vn 0.7878 -0.1634 -0.5939 +vn 0.7845 -0.3007 -0.5423 +vn 0.7574 -0.3049 -0.5774 +vn 0.7743 -0.2369 -0.5868 +vn 0.8016 -0.2330 -0.5506 +vn 0.7330 -0.3097 -0.6057 +vn 0.7500 -0.2413 -0.6158 +vn 0.6943 -0.3210 -0.6442 +vn 0.7117 -0.2513 -0.6560 +vn 0.7290 -0.2461 -0.6388 +vn 0.7119 -0.3151 -0.6276 +vn 0.8560 0.0000 -0.5169 +vn 0.8528 -0.0808 -0.5160 +vn 0.8860 0.0000 -0.4637 +vn 0.8831 -0.0794 -0.4625 +vn 0.8744 -0.1550 -0.4598 +vn 0.8443 -0.1574 -0.5123 +vn 0.9430 0.0000 -0.3327 +vn 0.9401 -0.0773 -0.3319 +vn 0.9126 -0.0782 -0.4013 +vn 0.9158 0.0001 -0.4017 +vn 0.9316 -0.1517 -0.3304 +vn 0.9042 -0.1531 -0.3988 +vn 0.9003 -0.2912 -0.3235 +vn 0.8731 -0.2925 -0.3900 +vn 0.8907 -0.2245 -0.3952 +vn 0.9182 -0.2231 -0.3275 +vn 0.8437 -0.2945 -0.4488 +vn 0.8611 -0.2267 -0.4550 +vn 0.8309 -0.2295 -0.5069 +vn 0.8137 -0.2973 -0.4995 +vn 0.7688 -0.5318 -0.3551 +vn 0.7994 -0.4765 -0.3659 +vn 0.8244 -0.4774 -0.3042 +vn 0.7431 -0.5303 -0.4081 +vn 0.7722 -0.4761 -0.4208 +vn 0.7989 -0.4189 -0.4316 +vn 0.8271 -0.4182 -0.3755 +vn 0.8531 -0.4183 -0.3118 +vn 0.6910 -0.5290 -0.4927 +vn 0.7172 -0.4775 -0.5075 +vn 0.7445 -0.4764 -0.4678 +vn 0.7167 -0.5292 -0.4542 +vn 0.7419 -0.4226 -0.5205 +vn 0.7700 -0.4204 -0.4800 +vn 0.7932 -0.3608 -0.4905 +vn 0.7644 -0.3639 -0.5322 +vn 0.8228 -0.3585 -0.4410 +vn 0.8785 -0.3562 -0.3184 +vn 0.8518 -0.3570 -0.3834 +vn 0.6665 -0.5296 -0.5247 +vn 0.6918 -0.4796 -0.5398 +vn 0.6442 -0.5316 -0.5499 +vn 0.6685 -0.4827 -0.5658 +vn 0.6917 -0.4299 -0.5803 +vn 0.7155 -0.4258 -0.5539 +vn 0.6301 -0.4929 -0.6001 +vn 0.6479 -0.4872 -0.5856 +vn 0.6241 -0.5349 -0.5696 +vn 0.6528 -0.4412 -0.6157 +vn 0.6707 -0.4350 -0.6008 +vn 0.6922 -0.3779 -0.6149 +vn 0.6744 -0.3841 -0.6305 +vn 0.7133 -0.3724 -0.5937 +vn 0.7376 -0.3677 -0.5664 +vn -0.0991 -0.9384 0.3310 +vn -0.0639 -0.9579 0.2797 +vn -0.1361 -0.9135 0.3834 +vn -0.1480 -0.9080 0.3920 +vn -0.1079 -0.9345 0.3392 +vn -0.0720 -0.9552 0.2870 +vn -0.2155 -0.8451 0.4892 +vn -0.1758 -0.8823 0.4366 +vn -0.2331 -0.8362 0.4965 +vn -0.1895 -0.8755 0.4446 +vn -0.2330 -0.8211 0.5210 +vn -0.1891 -0.8630 0.4686 +vn -0.1952 -0.8686 0.4554 +vn -0.2397 -0.8280 0.5069 +vn -0.1473 -0.8984 0.4138 +vn -0.1519 -0.9028 0.4022 +vn -0.0736 -0.9503 0.3025 +vn -0.0750 -0.9526 0.2948 +vn -0.1120 -0.9306 0.3484 +vn -0.1083 -0.9273 0.3584 +vn -0.2560 -0.8009 0.5414 +vn -0.2949 -0.7508 0.5910 +vn -0.3191 -0.7383 0.5942 +vn -0.2762 -0.7907 0.5464 +vn -0.3675 -0.6326 0.6817 +vn -0.3327 -0.6939 0.6386 +vn -0.3984 -0.6171 0.6786 +vn -0.3598 -0.6807 0.6381 +vn -0.4065 -0.5932 0.6949 +vn -0.3658 -0.6581 0.6581 +vn -0.3727 -0.6677 0.6445 +vn -0.4131 -0.6036 0.6819 +vn -0.3223 -0.7182 0.6167 +vn -0.3296 -0.7272 0.6021 +vn -0.2850 -0.7806 0.5562 +vn -0.2779 -0.7727 0.5707 +vn -0.1521 -0.6610 0.7348 +vn -0.1730 -0.5980 0.7826 +vn -0.1325 -0.7167 0.6846 +vn -0.2295 -0.7140 0.6615 +vn -0.2641 -0.6542 0.7087 +vn -0.2961 -0.5917 0.7498 +vn -0.0928 -0.8160 0.5706 +vn -0.1116 -0.7702 0.6280 +vn -0.1623 -0.8157 0.5552 +vn -0.1963 -0.7670 0.6109 +vn -0.2497 -0.7682 0.5895 +vn -0.2088 -0.8166 0.5381 +vn -0.2918 -0.7132 0.6374 +vn -0.3715 -0.5885 0.7181 +vn -0.3320 -0.6535 0.6802 +vn -0.0739 -0.8579 0.5084 +vn -0.0574 -0.8926 0.4471 +vn -0.1011 -0.8935 0.4376 +vn -0.1311 -0.8572 0.4980 +vn -0.0287 -0.9465 0.3215 +vn -0.0419 -0.9227 0.3833 +vn -0.0507 -0.9473 0.3164 +vn -0.0745 -0.9230 0.3776 +vn -0.0964 -0.9248 0.3681 +vn -0.0655 -0.9484 0.3103 +vn -0.1310 -0.8949 0.4265 +vn -0.1685 -0.8592 0.4830 +vn 0.2072 -0.8894 -0.4074 +vn 0.2265 -0.8743 -0.4293 +vn 0.1883 -0.9031 -0.3858 +vn 0.1632 -0.9095 -0.3822 +vn 0.1799 -0.8969 -0.4039 +vn 0.1984 -0.8828 -0.4258 +vn 0.1548 -0.9265 -0.3431 +vn 0.1712 -0.9154 -0.3643 +vn 0.1327 -0.9310 -0.3400 +vn 0.1470 -0.9210 -0.3609 +vn 0.0868 -0.9386 -0.3339 +vn 0.0969 -0.9301 -0.3542 +vn 0.1225 -0.9258 -0.3575 +vn 0.1095 -0.9352 -0.3367 +vn 0.1087 -0.9205 -0.3754 +vn 0.1360 -0.9155 -0.3786 +vn 0.1345 -0.8978 -0.4193 +vn 0.1670 -0.8909 -0.4224 +vn 0.1514 -0.9038 -0.4003 +vn 0.1207 -0.9099 -0.3969 +vn 0.1404 -0.9362 -0.3221 +vn 0.1270 -0.9450 -0.3015 +vn 0.1079 -0.9480 -0.2993 +vn 0.1192 -0.9401 -0.3194 +vn 0.1066 -0.9593 -0.2613 +vn 0.1161 -0.9526 -0.2813 +vn 0.0898 -0.9613 -0.2605 +vn 0.0977 -0.9551 -0.2796 +vn 0.0570 -0.9643 -0.2586 +vn 0.0623 -0.9590 -0.2764 +vn 0.0800 -0.9572 -0.2780 +vn 0.0729 -0.9630 -0.2595 +vn 0.0694 -0.9530 -0.2950 +vn 0.0882 -0.9508 -0.2970 +vn 0.0985 -0.9434 -0.3167 +vn 0.0772 -0.9463 -0.3140 +vn 0.0144 -0.9617 -0.2738 +vn 0.0130 -0.9663 -0.2571 +vn 0.0160 -0.9565 -0.2912 +vn 0.0330 -0.9558 -0.2921 +vn 0.0295 -0.9612 -0.2743 +vn 0.0269 -0.9659 -0.2574 +vn 0.0202 -0.9443 -0.3284 +vn 0.0180 -0.9507 -0.3096 +vn 0.0417 -0.9432 -0.3297 +vn 0.0369 -0.9499 -0.3104 +vn 0.0570 -0.9484 -0.3121 +vn 0.0637 -0.9414 -0.3313 +vn 0.0507 -0.9547 -0.2932 +vn 0.0414 -0.9653 -0.2579 +vn 0.0457 -0.9603 -0.2753 +vn 0.0229 -0.9370 -0.3485 +vn 0.0256 -0.9291 -0.3690 +vn 0.0527 -0.9273 -0.3705 +vn 0.0468 -0.9358 -0.3495 +vn 0.0319 -0.9101 -0.4131 +vn 0.0287 -0.9200 -0.3909 +vn 0.0658 -0.9076 -0.4147 +vn 0.0588 -0.9181 -0.3919 +vn 0.0901 -0.9146 -0.3943 +vn 0.1000 -0.9037 -0.4164 +vn 0.0803 -0.9246 -0.3724 +vn 0.0719 -0.9334 -0.3517 +vn 0.0636 -0.9980 -0.0027 +vn 0.0700 -0.9968 -0.0397 +vn 0.0558 -0.9979 0.0340 +vn 0.0469 -0.9984 0.0324 +vn 0.0542 -0.9985 -0.0050 +vn 0.0592 -0.9973 -0.0428 +vn 0.0316 -0.9937 0.1080 +vn 0.0450 -0.9965 0.0704 +vn 0.0243 -0.9937 0.1090 +vn 0.0376 -0.9968 0.0703 +vn 0.0130 -0.9939 0.1097 +vn 0.0237 -0.9974 0.0682 +vn 0.0301 -0.9971 0.0694 +vn 0.0186 -0.9938 0.1097 +vn 0.0306 -0.9991 0.0282 +vn 0.0389 -0.9988 0.0305 +vn 0.0389 -0.9980 -0.0494 +vn 0.0491 -0.9977 -0.0462 +vn 0.0447 -0.9990 -0.0079 +vn 0.0358 -0.9993 -0.0109 +vn 0.0139 -0.9891 0.1465 +vn -0.0071 -0.9822 0.1876 +vn -0.0138 -0.9813 0.1919 +vn 0.0079 -0.9887 0.1494 +vn -0.0335 -0.9723 0.2315 +vn -0.0397 -0.9706 0.2376 +vn -0.0435 -0.9675 0.2492 +vn -0.0438 -0.9689 0.2434 +vn -0.0200 -0.9797 0.1995 +vn -0.0176 -0.9804 0.1960 +vn 0.0024 -0.9885 0.1515 +vn -0.0008 -0.9882 0.1534 +vn -0.0177 -0.9651 0.2613 +vn -0.0090 -0.9783 0.2069 +vn -0.0156 -0.9786 0.2051 +vn -0.0309 -0.9654 0.2589 +vn 0.0022 -0.9941 0.1088 +vn -0.0026 -0.9878 0.1560 +vn 0.0049 -0.9940 0.1092 +vn -0.0035 -0.9878 0.1556 +vn -0.0033 -0.9880 0.1546 +vn 0.0089 -0.9939 0.1096 +vn -0.0189 -0.9790 0.2028 +vn -0.0398 -0.9663 0.2542 +vn 0.0053 -0.9979 0.0645 +vn 0.0076 -0.9997 0.0223 +vn 0.0151 -0.9996 0.0239 +vn 0.0113 -0.9978 0.0654 +vn 0.0095 -0.9983 -0.0569 +vn 0.0087 -0.9998 -0.0177 +vn 0.0191 -0.9983 -0.0549 +vn 0.0178 -0.9997 -0.0163 +vn 0.0265 -0.9996 -0.0137 +vn 0.0291 -0.9982 -0.0526 +vn 0.0231 -0.9994 0.0258 +vn 0.0170 -0.9976 0.0668 +vn 0.6299 0.0000 -0.7767 +vn 0.6257 -0.1104 -0.7722 +vn 0.6011 -0.1147 -0.7909 +vn 0.6060 0.0000 -0.7954 +vn 0.6130 -0.2142 -0.7605 +vn 0.5883 -0.2224 -0.7774 +vn 0.5528 -0.2325 -0.8002 +vn 0.5668 -0.1197 -0.8151 +vn 0.5713 0.0000 -0.8207 +vn 0.5707 -0.3935 -0.7208 +vn 0.5439 -0.4078 -0.7334 +vn 0.5682 -0.3208 -0.7578 +vn 0.5945 -0.3087 -0.7425 +vn 0.5068 -0.4250 -0.7500 +vn 0.5326 -0.3345 -0.7775 +vn 0.3936 -0.4637 -0.7938 +vn 0.4185 -0.3674 -0.8306 +vn 0.4834 -0.3505 -0.8022 +vn 0.4580 -0.4436 -0.7704 +vn 0.4384 -0.2564 -0.8614 +vn 0.5046 -0.2437 -0.8282 +vn 0.4568 0.0000 -0.8896 +vn 0.5235 0.0000 -0.8520 +vn 0.5181 -0.1257 -0.8460 +vn 0.4524 -0.1323 -0.8819 +vn 0.5445 -0.4674 -0.6965 +vn 0.5159 -0.4843 -0.7066 +vn 0.5160 -0.5322 -0.6712 +vn 0.4870 -0.5496 -0.6788 +vn 0.4487 -0.5696 -0.6886 +vn 0.4787 -0.5027 -0.7198 +vn 0.4278 -0.6539 -0.6240 +vn 0.4570 -0.6062 -0.6509 +vn 0.4873 -0.5877 -0.6458 +vn 0.3896 -0.6735 -0.6281 +vn 0.4189 -0.6257 -0.6580 +vn 0.2865 -0.7129 -0.6401 +vn 0.3119 -0.6675 -0.6761 +vn 0.3709 -0.6468 -0.6664 +vn 0.3425 -0.6934 -0.6339 +vn 0.3392 -0.6121 -0.7144 +vn 0.4001 -0.5905 -0.7009 +vn 0.4294 -0.5235 -0.7359 +vn 0.3667 -0.5447 -0.7542 +vn 0.0811 -0.7112 -0.6982 +vn 0.0729 -0.7530 -0.6539 +vn 0.0896 -0.6596 -0.7463 +vn 0.1808 -0.6485 -0.7394 +vn 0.1637 -0.7020 -0.6931 +vn 0.1487 -0.7440 -0.6514 +vn 0.1084 -0.5116 -0.8524 +vn 0.0991 -0.5934 -0.7988 +vn 0.2158 -0.4999 -0.8388 +vn 0.1980 -0.5825 -0.7883 +vn 0.2891 -0.5651 -0.7727 +vn 0.3126 -0.4833 -0.8178 +vn 0.2652 -0.6323 -0.7280 +vn 0.2206 -0.7306 -0.6462 +vn 0.2426 -0.6864 -0.6856 +vn 0.1174 -0.4097 -0.9046 +vn 0.1251 -0.2887 -0.9492 +vn 0.2462 -0.2805 -0.9277 +vn 0.2324 -0.3997 -0.8867 +vn 0.1322 0.0000 -0.9912 +vn 0.1301 -0.1497 -0.9801 +vn 0.2590 0.0000 -0.9659 +vn 0.2560 -0.1454 -0.9557 +vn 0.3647 -0.1392 -0.9207 +vn 0.3695 0.0000 -0.9292 +vn 0.3528 -0.2691 -0.8962 +vn 0.3344 -0.3846 -0.8604 +vn 0.0119 -0.9707 -0.2400 +vn 0.0247 -0.9704 -0.2400 +vn 0.0231 -0.9750 -0.2211 +vn 0.0111 -0.9751 -0.2214 +vn 0.0525 -0.9693 -0.2403 +vn 0.0383 -0.9700 -0.2401 +vn 0.0492 -0.9742 -0.2203 +vn 0.0357 -0.9747 -0.2208 +vn 0.0447 -0.9837 -0.1744 +vn 0.0326 -0.9838 -0.1761 +vn 0.0339 -0.9793 -0.1994 +vn 0.0465 -0.9790 -0.1985 +vn 0.0211 -0.9839 -0.1772 +vn 0.0218 -0.9795 -0.2004 +vn 0.0105 -0.9796 -0.2008 +vn 0.0102 -0.9839 -0.1783 +vn 0.0677 -0.9683 -0.2405 +vn 0.0830 -0.9670 -0.2407 +vn 0.0779 -0.9726 -0.2192 +vn 0.0631 -0.9735 -0.2198 +vn 0.1155 -0.9637 -0.2408 +vn 0.0993 -0.9655 -0.2409 +vn 0.1086 -0.9700 -0.2177 +vn 0.0929 -0.9714 -0.2185 +vn 0.0983 -0.9812 -0.1660 +vn 0.0841 -0.9822 -0.1682 +vn 0.0881 -0.9770 -0.1944 +vn 0.1028 -0.9758 -0.1928 +vn 0.0705 -0.9828 -0.1704 +vn 0.0736 -0.9779 -0.1959 +vn 0.0599 -0.9785 -0.1972 +vn 0.0573 -0.9833 -0.1726 +vn 0.0745 -0.9943 -0.0759 +vn 0.0865 -0.9936 -0.0728 +vn 0.0631 -0.9949 -0.0792 +vn 0.0657 -0.9915 -0.1123 +vn 0.0780 -0.9910 -0.1092 +vn 0.0907 -0.9902 -0.1062 +vn 0.0411 -0.9955 -0.0859 +vn 0.0519 -0.9952 -0.0825 +vn 0.0423 -0.9921 -0.1184 +vn 0.0538 -0.9918 -0.1156 +vn 0.0555 -0.9878 -0.1454 +vn 0.0434 -0.9880 -0.1479 +vn 0.0679 -0.9874 -0.1427 +vn 0.0944 -0.9860 -0.1371 +vn 0.0810 -0.9869 -0.1399 +vn 0.0304 -0.9956 -0.0887 +vn 0.0200 -0.9956 -0.0913 +vn 0.0203 -0.9922 -0.1231 +vn 0.0312 -0.9921 -0.1212 +vn 0.0098 -0.9957 -0.0926 +vn 0.0099 -0.9921 -0.1248 +vn 0.0100 -0.9882 -0.1528 +vn 0.0206 -0.9882 -0.1519 +vn 0.0318 -0.9882 -0.1500 +vn 0.1315 -0.9617 -0.2404 +vn 0.1463 -0.9598 -0.2396 +vn 0.1385 -0.9667 -0.2152 +vn 0.1237 -0.9684 -0.2165 +vn 0.1770 -0.9550 -0.2378 +vn 0.1615 -0.9575 -0.2388 +vn 0.1687 -0.9624 -0.2130 +vn 0.1529 -0.9649 -0.2138 +vn 0.1566 -0.9749 -0.1582 +vn 0.1410 -0.9771 -0.1593 +vn 0.1464 -0.9713 -0.1874 +vn 0.1616 -0.9692 -0.1860 +vn 0.1266 -0.9787 -0.1613 +vn 0.1317 -0.9731 -0.1890 +vn 0.1176 -0.9745 -0.1910 +vn 0.1124 -0.9801 -0.1636 +vn 0.1930 -0.9520 -0.2375 +vn 0.2080 -0.9489 -0.2371 +vn 0.2015 -0.9559 -0.2135 +vn 0.1846 -0.9596 -0.2124 +vn 0.2392 -0.9403 -0.2419 +vn 0.2238 -0.9450 -0.2385 +vn 0.2379 -0.9455 -0.2223 +vn 0.2194 -0.9515 -0.2157 +vn 0.2353 -0.9566 -0.1718 +vn 0.2134 -0.9631 -0.1637 +vn 0.2164 -0.9573 -0.1915 +vn 0.2373 -0.9511 -0.1980 +vn 0.1927 -0.9681 -0.1600 +vn 0.1965 -0.9625 -0.1872 +vn 0.1785 -0.9662 -0.1861 +vn 0.1735 -0.9721 -0.1578 +vn 0.2041 -0.9759 -0.0769 +vn 0.2283 -0.9700 -0.0836 +vn 0.1822 -0.9806 -0.0716 +vn 0.1860 -0.9772 -0.1020 +vn 0.2079 -0.9724 -0.1062 +vn 0.2309 -0.9663 -0.1141 +vn 0.1438 -0.9873 -0.0674 +vn 0.1617 -0.9844 -0.0689 +vn 0.1483 -0.9840 -0.0988 +vn 0.1663 -0.9811 -0.0993 +vn 0.1699 -0.9770 -0.1292 +vn 0.1524 -0.9799 -0.1288 +vn 0.1893 -0.9732 -0.1308 +vn 0.2338 -0.9618 -0.1425 +vn 0.2107 -0.9681 -0.1357 +vn 0.1272 -0.9896 -0.0675 +vn 0.1126 -0.9913 -0.0685 +vn 0.1175 -0.9879 -0.1011 +vn 0.1323 -0.9862 -0.0994 +vn 0.0989 -0.9926 -0.0704 +vn 0.1039 -0.9892 -0.1034 +vn 0.1081 -0.9850 -0.1345 +vn 0.1220 -0.9837 -0.1320 +vn 0.1366 -0.9820 -0.1301 +vn 0.2541 -0.9337 -0.2524 +vn 0.2718 -0.9246 -0.2668 +vn 0.2756 -0.9289 -0.2473 +vn 0.2577 -0.9378 -0.2326 +vn 0.3077 -0.9021 -0.3025 +vn 0.2883 -0.9146 -0.2837 +vn 0.3141 -0.9064 -0.2826 +vn 0.2953 -0.9182 -0.2639 +vn 0.3234 -0.9176 -0.2314 +vn 0.3024 -0.9291 -0.2130 +vn 0.2988 -0.9236 -0.2402 +vn 0.3202 -0.9114 -0.2586 +vn 0.2798 -0.9397 -0.1969 +vn 0.2793 -0.9338 -0.2234 +vn 0.2576 -0.9433 -0.2096 +vn 0.2584 -0.9487 -0.1823 +vn 0.3271 -0.8881 -0.3229 +vn 0.3480 -0.8721 -0.3441 +vn 0.3560 -0.8766 -0.3238 +vn 0.3351 -0.8922 -0.3027 +vn 0.3966 -0.8306 -0.3909 +vn 0.3704 -0.8536 -0.3663 +vn 0.4073 -0.8346 -0.3709 +vn 0.3799 -0.8577 -0.3465 +vn 0.4277 -0.8458 -0.3189 +vn 0.3968 -0.8693 -0.2947 +vn 0.3885 -0.8632 -0.3224 +vn 0.4176 -0.8397 -0.3471 +vn 0.3698 -0.8884 -0.2720 +vn 0.3637 -0.8820 -0.2998 +vn 0.3408 -0.8979 -0.2786 +vn 0.3463 -0.9039 -0.2510 +vn 0.4183 -0.8881 -0.1905 +vn 0.4552 -0.8649 -0.2116 +vn 0.3856 -0.9067 -0.1707 +vn 0.3806 -0.9012 -0.2073 +vn 0.4115 -0.8823 -0.2284 +vn 0.4465 -0.8588 -0.2510 +vn 0.3290 -0.9346 -0.1350 +vn 0.3559 -0.9220 -0.1524 +vn 0.3273 -0.9296 -0.1692 +vn 0.3533 -0.9166 -0.1874 +vn 0.3497 -0.9105 -0.2205 +vn 0.3264 -0.9236 -0.2011 +vn 0.3757 -0.8948 -0.2411 +vn 0.4372 -0.8523 -0.2870 +vn 0.4043 -0.8759 -0.2632 +vn 0.3027 -0.9455 -0.1198 +vn 0.2780 -0.9548 -0.1054 +vn 0.2788 -0.9505 -0.1374 +vn 0.3034 -0.9406 -0.1520 +vn 0.2525 -0.9630 -0.0939 +vn 0.2554 -0.9589 -0.1239 +vn 0.2567 -0.9541 -0.1541 +vn 0.2806 -0.9451 -0.1673 +vn 0.3028 -0.9352 -0.1836 +vn 0.6140 -0.5002 -0.6106 +vn 0.5985 -0.5087 -0.6189 +vn 0.6218 -0.4570 -0.6359 +vn 0.6370 -0.4485 -0.6269 +vn 0.5670 -0.5300 -0.6306 +vn 0.5828 -0.5188 -0.6254 +vn 0.5917 -0.4773 -0.6497 +vn 0.6070 -0.4665 -0.6434 +vn 0.6378 -0.3505 -0.6859 +vn 0.6515 -0.3421 -0.6771 +vn 0.6300 -0.4080 -0.6608 +vn 0.6157 -0.4176 -0.6682 +vn 0.6650 -0.3345 -0.6677 +vn 0.6443 -0.3991 -0.6523 +vn 0.6589 -0.3913 -0.6425 +vn 0.6792 -0.3275 -0.6568 +vn 0.5500 -0.5427 -0.6348 +vn 0.5320 -0.5562 -0.6385 +vn 0.5585 -0.5021 -0.6603 +vn 0.5760 -0.4889 -0.6551 +vn 0.5112 -0.5716 -0.6419 +vn 0.5393 -0.5161 -0.6654 +vn 0.5916 -0.3806 -0.7107 +vn 0.5661 -0.4531 -0.6887 +vn 0.6086 -0.3696 -0.7022 +vn 0.5846 -0.4399 -0.6817 +vn 0.6006 -0.4283 -0.6751 +vn 0.6239 -0.3594 -0.6939 +vn 0.6479 0.0000 -0.7617 +vn 0.6434 -0.1070 -0.7580 +vn 0.6623 0.0000 -0.7492 +vn 0.6584 -0.1040 -0.7454 +vn 0.6469 -0.2013 -0.7355 +vn 0.6319 -0.2071 -0.7469 +vn 0.6873 0.0000 -0.7263 +vn 0.6837 -0.0991 -0.7230 +vn 0.6713 -0.1015 -0.7342 +vn 0.6754 0.0000 -0.7375 +vn 0.6731 -0.1911 -0.7145 +vn 0.6606 -0.1959 -0.7247 +vn 0.6441 -0.2822 -0.7110 +vn 0.6575 -0.2750 -0.7015 +vn 0.6301 -0.2899 -0.7204 +vn 0.6137 -0.2988 -0.7308 +vn 0.6993 0.0000 -0.7148 +vn 0.6955 -0.0969 -0.7120 +vn 0.7113 0.0000 -0.7029 +vn 0.7079 -0.0947 -0.7000 +vn 0.6979 -0.1824 -0.6926 +vn 0.6855 -0.1867 -0.7037 +vn 0.7207 -0.0926 -0.6870 +vn 0.7243 0.0000 -0.6894 +vn 0.7113 -0.1784 -0.6799 +vn 0.6969 -0.2567 -0.6697 +vn 0.6834 -0.2624 -0.6813 +vn 0.6702 -0.2685 -0.6919 +vn 0.3956 -0.5813 0.7110 +vn 0.2866 -0.5969 0.7494 +vn 0.4887 -0.5644 0.6653 +vn 0.5092 -0.4935 0.7051 +vn 0.4134 -0.5090 0.7550 +vn 0.2999 -0.5244 0.7969 +vn 0.6354 -0.5340 0.5577 +vn 0.5676 -0.5486 0.6139 +vn 0.6594 -0.4663 0.5897 +vn 0.5906 -0.4787 0.6497 +vn 0.6968 -0.3210 0.6414 +vn 0.6256 -0.3292 0.7073 +vn 0.6097 -0.4057 0.6809 +vn 0.6801 -0.3950 0.6176 +vn 0.5414 -0.3398 0.7690 +vn 0.5270 -0.4182 0.7399 +vn 0.3222 -0.3643 0.8738 +vn 0.3119 -0.4465 0.8387 +vn 0.4286 -0.4325 0.7932 +vn 0.4415 -0.3515 0.8255 +vn 0.6930 -0.5221 0.4971 +vn 0.7427 -0.5122 0.4313 +vn 0.7690 -0.4479 0.4561 +vn 0.7186 -0.4558 0.5252 +vn 0.8195 -0.4987 0.2824 +vn 0.7845 -0.5048 0.3603 +vn 0.8485 -0.4363 0.2996 +vn 0.8123 -0.4415 0.3810 +vn 0.8948 -0.3028 0.3281 +vn 0.8562 -0.3063 0.4161 +vn 0.8362 -0.3754 0.3999 +vn 0.8736 -0.3711 0.3147 +vn 0.8107 -0.3099 0.4968 +vn 0.7919 -0.3803 0.4778 +vn 0.7401 -0.3868 0.5502 +vn 0.7579 -0.3146 0.5715 +vn 0.9350 0.0000 0.3545 +vn 0.8937 0.0000 0.4487 +vn 0.8914 -0.0806 0.4461 +vn 0.9322 -0.0799 0.3530 +vn 0.8457 0.0000 0.5337 +vn 0.8432 -0.0812 0.5315 +vn 0.8366 -0.1602 0.5238 +vn 0.8839 -0.1588 0.4399 +vn 0.9245 -0.1571 0.3474 +vn 0.7270 0.0000 0.6866 +vn 0.7249 -0.0832 0.6838 +vn 0.7883 -0.0820 0.6098 +vn 0.7901 0.0000 0.6129 +vn 0.7194 -0.1648 0.6748 +vn 0.7820 -0.1620 0.6019 +vn 0.7719 -0.2397 0.5888 +vn 0.7099 -0.2441 0.6606 +vn 0.8256 -0.2365 0.5123 +vn 0.9118 -0.2316 0.3392 +vn 0.8722 -0.2340 0.4295 +vn 0.6535 0.0000 0.7569 +vn 0.6519 -0.0851 0.7535 +vn 0.5676 0.0000 0.8233 +vn 0.5659 -0.0876 0.8198 +vn 0.5610 -0.1740 0.8093 +vn 0.6466 -0.1686 0.7440 +vn 0.3421 -0.0000 0.9397 +vn 0.3409 -0.0947 0.9353 +vn 0.4636 -0.0910 0.8814 +vn 0.4651 -0.0000 0.8853 +vn 0.3369 -0.1877 0.9227 +vn 0.4591 -0.1803 0.8699 +vn 0.4516 -0.2676 0.8511 +vn 0.3307 -0.2775 0.9020 +vn 0.5529 -0.2580 0.7923 +vn 0.6378 -0.2503 0.7284 +vn 0.8459 -0.4936 0.2020 +vn 0.8632 -0.4897 0.1224 +vn 0.8942 -0.4280 0.1315 +vn 0.8761 -0.4318 0.2146 +vn 0.8744 -0.4842 -0.0292 +vn 0.8724 -0.4866 0.0455 +vn 0.9058 -0.4229 -0.0271 +vn 0.9037 -0.4252 0.0507 +vn 0.9560 -0.2923 -0.0229 +vn 0.9539 -0.2941 0.0603 +vn 0.9309 -0.3610 0.0557 +vn 0.9330 -0.3590 -0.0250 +vn 0.9437 -0.2964 0.1469 +vn 0.9210 -0.3637 0.1396 +vn 0.9023 -0.3670 0.2263 +vn 0.9243 -0.2995 0.2365 +vn 0.8703 -0.4822 -0.1009 +vn 0.8603 -0.4804 -0.1706 +vn 0.8908 -0.4198 -0.1741 +vn 0.9012 -0.4212 -0.1020 +vn 0.8451 -0.4788 -0.2380 +vn 0.8747 -0.4189 -0.2440 +vn 0.9230 -0.2907 -0.2523 +vn 0.9007 -0.3562 -0.2486 +vn 0.9400 -0.2906 -0.1789 +vn 0.9174 -0.3566 -0.1769 +vn 0.9283 -0.3575 -0.1024 +vn 0.9512 -0.2912 -0.1024 +vn 0.9661 0.0000 -0.2583 +vn 0.9630 -0.0767 -0.2582 +vn 0.9833 0.0000 -0.1818 +vn 0.9804 -0.0764 -0.1814 +vn 0.9719 -0.1505 -0.1812 +vn 0.9546 -0.1509 -0.2569 +vn 0.9998 0.0000 -0.0180 +vn 0.9969 -0.0767 -0.0181 +vn 0.9919 -0.0764 -0.1019 +vn 0.9948 0.0000 -0.1015 +vn 0.9883 -0.1511 -0.0194 +vn 0.9833 -0.1506 -0.1019 +vn 0.9696 -0.2222 -0.1023 +vn 0.9746 -0.2231 -0.0208 +vn 0.9583 -0.2220 -0.1802 +vn 0.9410 -0.2222 -0.2552 +vn 0.9975 0.0000 0.0700 +vn 0.9946 -0.0772 0.0691 +vn 0.9869 0.0000 0.1615 +vn 0.9839 -0.0780 0.1608 +vn 0.9755 -0.1535 0.1575 +vn 0.9861 -0.1522 0.0673 +vn 0.9636 -0.0789 0.2554 +vn 0.9664 0.0000 0.2571 +vn 0.9553 -0.1553 0.2515 +vn 0.9422 -0.2288 0.2449 +vn 0.9619 -0.2265 0.1530 +vn 0.9724 -0.2244 0.0641 +vn -0.2992 -0.5940 0.7468 +vn -0.3529 -0.5816 0.7329 +vn -0.2417 -0.6041 0.7594 +vn -0.2587 -0.5341 0.8049 +vn -0.3203 -0.5247 0.7888 +vn -0.3784 -0.5109 0.7719 +vn -0.1066 -0.6153 0.7810 +vn -0.1781 -0.6108 0.7715 +vn -0.1145 -0.5448 0.8307 +vn -0.1910 -0.5411 0.8190 +vn -0.1262 -0.3858 0.9139 +vn -0.2105 -0.3835 0.8992 +vn -0.2016 -0.4650 0.8620 +vn -0.1212 -0.4685 0.8751 +vn -0.2858 -0.3777 0.8807 +vn -0.2735 -0.4591 0.8453 +vn -0.4195 -0.3568 0.8347 +vn -0.4005 -0.4366 0.8056 +vn -0.3389 -0.4492 0.8267 +vn -0.3546 -0.3695 0.8589 +vn -0.0247 -0.6166 0.7869 +vn 0.0681 -0.6147 0.7858 +vn 0.0707 -0.5430 0.8368 +vn -0.0280 -0.5457 0.8375 +vn 0.1728 -0.6084 0.7746 +vn 0.1806 -0.5360 0.8247 +vn 0.1952 -0.3747 0.9064 +vn 0.1883 -0.4581 0.8687 +vn 0.0764 -0.3818 0.9211 +vn 0.0734 -0.4653 0.8821 +vn -0.0298 -0.4685 0.8829 +vn -0.0309 -0.3855 0.9222 +vn 0.2100 -0.0000 0.9777 +vn 0.2087 -0.0984 0.9730 +vn 0.0840 -0.0000 0.9965 +vn 0.0838 -0.1012 0.9913 +vn 0.0818 -0.1992 0.9765 +vn 0.2059 -0.1942 0.9591 +vn -0.1344 -0.0000 0.9909 +vn -0.1337 -0.1036 0.9856 +vn -0.0311 -0.1029 0.9942 +vn -0.0306 -0.0000 0.9995 +vn -0.1325 -0.2029 0.9702 +vn -0.0311 -0.2021 0.9789 +vn -0.0313 -0.2965 0.9545 +vn -0.1299 -0.2974 0.9459 +vn 0.0794 -0.2929 0.9528 +vn 0.2011 -0.2867 0.9367 +vn -0.2263 0.0000 0.9741 +vn -0.2255 -0.1031 0.9688 +vn -0.3092 0.0000 0.9510 +vn -0.3076 -0.1016 0.9461 +vn -0.3031 -0.1987 0.9320 +vn -0.2224 -0.2020 0.9538 +vn -0.4558 0.0000 0.8901 +vn -0.4537 -0.0946 0.8861 +vn -0.3827 -0.0986 0.9186 +vn -0.3848 0.0000 0.9230 +vn -0.4463 -0.1857 0.8754 +vn -0.3769 -0.1937 0.9058 +vn -0.3673 -0.2837 0.8858 +vn -0.4350 -0.2737 0.8578 +vn -0.2958 -0.2913 0.9098 +vn -0.2175 -0.2954 0.9303 +vn 0.5990 -0.5801 -0.5519 +vn 0.6182 -0.5779 -0.5328 +vn 0.5906 -0.6227 -0.5133 +vn 0.5721 -0.6236 -0.5327 +vn 0.6624 -0.5780 -0.4765 +vn 0.6396 -0.5773 -0.5075 +vn 0.6319 -0.6253 -0.4579 +vn 0.6104 -0.6233 -0.4888 +vn 0.5656 -0.7122 -0.4158 +vn 0.5478 -0.7080 -0.4457 +vn 0.5798 -0.6671 -0.4678 +vn 0.5993 -0.6701 -0.4379 +vn 0.5308 -0.7053 -0.4699 +vn 0.5612 -0.6652 -0.4926 +vn 0.5439 -0.6652 -0.5115 +vn 0.5146 -0.7041 -0.4893 +vn 0.6868 -0.5798 -0.4385 +vn 0.7113 -0.5821 -0.3940 +vn 0.6769 -0.6319 -0.3775 +vn 0.6541 -0.6283 -0.4212 +vn 0.7354 -0.5849 -0.3422 +vn 0.6989 -0.6357 -0.3278 +vn 0.6197 -0.7279 -0.2935 +vn 0.6603 -0.6835 -0.3112 +vn 0.6022 -0.7225 -0.3397 +vn 0.6402 -0.6788 -0.3597 +vn 0.6198 -0.6742 -0.4015 +vn 0.5838 -0.7171 -0.3808 +vn 0.4955 -0.8368 -0.2328 +vn 0.4845 -0.8307 -0.2743 +vn 0.5237 -0.7986 -0.2967 +vn 0.5366 -0.8047 -0.2540 +vn 0.4614 -0.8177 -0.3442 +vn 0.4732 -0.8242 -0.3111 +vn 0.4961 -0.7861 -0.3686 +vn 0.5099 -0.7922 -0.3353 +vn 0.5471 -0.7565 -0.3583 +vn 0.5309 -0.7508 -0.3929 +vn 0.5629 -0.7625 -0.3190 +vn 0.5784 -0.7683 -0.2740 +vn 0.4495 -0.8119 -0.3724 +vn 0.4374 -0.8071 -0.3966 +vn 0.4684 -0.7764 -0.4216 +vn 0.4821 -0.7806 -0.3977 +vn 0.4254 -0.8038 -0.4160 +vn 0.4549 -0.7736 -0.4412 +vn 0.4848 -0.7405 -0.4655 +vn 0.4997 -0.7423 -0.4464 +vn 0.5151 -0.7460 -0.4219 +vn -0.1916 -0.5342 0.8233 +vn -0.3280 -0.5237 0.7862 +vn -0.3557 -0.4545 0.8166 +vn -0.2105 -0.4637 0.8606 +vn -0.4446 -0.5245 0.7262 +vn -0.4072 -0.5206 0.7504 +vn -0.4781 -0.4530 0.7525 +vn -0.4406 -0.4492 0.7773 +vn -0.5320 -0.3049 0.7899 +vn -0.4933 -0.3020 0.8157 +vn -0.4687 -0.3766 0.7991 +vn -0.5079 -0.3795 0.7733 +vn -0.4027 -0.3075 0.8622 +vn -0.3818 -0.3810 0.8420 +vn -0.2263 -0.3930 0.8913 +vn -0.2411 -0.3168 0.9173 +vn -0.4503 -0.5349 0.7149 +vn -0.4336 -0.5499 0.7139 +vn -0.4653 -0.4782 0.7449 +vn -0.4837 -0.4636 0.7424 +vn -0.4000 -0.5656 0.7212 +vn -0.4288 -0.4953 0.7555 +vn -0.4760 -0.3424 0.8101 +vn -0.4543 -0.4202 0.7855 +vn -0.5161 -0.3269 0.7916 +vn -0.4930 -0.4042 0.7705 +vn -0.5124 -0.3895 0.7653 +vn -0.5370 -0.3139 0.7830 +vn -0.5174 -0.0000 0.8558 +vn -0.5142 -0.0893 0.8530 +vn -0.5597 -0.0000 0.8287 +vn -0.5573 -0.0842 0.8260 +vn -0.5484 -0.1668 0.8194 +vn -0.5065 -0.1764 0.8440 +vn -0.5771 0.0000 0.8167 +vn -0.5748 -0.0769 0.8147 +vn -0.5785 -0.0798 0.8118 +vn -0.5820 0.0000 0.8132 +vn -0.5655 -0.1534 0.8103 +vn -0.5704 -0.1587 0.8059 +vn -0.5559 -0.2368 0.7968 +vn -0.5520 -0.2293 0.8017 +vn -0.5351 -0.2480 0.8076 +vn -0.4933 -0.2606 0.8299 +vn -0.5378 0.0000 0.8431 +vn -0.5342 -0.0762 0.8419 +vn -0.4431 0.0000 0.8964 +vn -0.4411 -0.0777 0.8941 +vn -0.4327 -0.1552 0.8881 +vn -0.5264 -0.1517 0.8366 +vn -0.2661 -0.0815 0.9605 +vn -0.2683 0.0000 0.9633 +vn -0.2612 -0.1612 0.9517 +vn -0.2521 -0.2409 0.9372 +vn -0.4206 -0.2312 0.8773 +vn -0.5118 -0.2274 0.8284 +vn 0.0660 -0.7858 -0.6149 +vn 0.1342 -0.7787 -0.6129 +vn 0.1218 -0.8067 -0.5783 +vn 0.0593 -0.8135 -0.5786 +vn 0.2619 -0.7506 -0.6066 +vn 0.2012 -0.7662 -0.6103 +vn 0.2397 -0.7821 -0.5751 +vn 0.1824 -0.7964 -0.5767 +vn 0.1991 -0.8320 -0.5177 +vn 0.1501 -0.8429 -0.5167 +vn 0.1660 -0.8212 -0.5459 +vn 0.2181 -0.8092 -0.5455 +vn 0.0996 -0.8505 -0.5164 +vn 0.1097 -0.8307 -0.5458 +vn 0.0537 -0.8359 -0.5462 +vn 0.0483 -0.8555 -0.5156 +vn 0.3159 -0.7327 -0.6028 +vn 0.3612 -0.7139 -0.5999 +vn 0.3341 -0.7490 -0.5721 +vn 0.2900 -0.7661 -0.5735 +vn 0.3990 -0.6957 -0.5974 +vn 0.3709 -0.7318 -0.5718 +vn 0.3177 -0.7917 -0.5218 +vn 0.3439 -0.7638 -0.5463 +vn 0.2834 -0.8058 -0.5200 +vn 0.3078 -0.7794 -0.5458 +vn 0.2663 -0.7947 -0.5454 +vn 0.2433 -0.8196 -0.5187 +vn 0.2476 -0.8573 -0.4514 +vn 0.2172 -0.8671 -0.4483 +vn 0.2382 -0.8492 -0.4714 +vn 0.2695 -0.8381 -0.4744 +vn 0.1484 -0.8846 -0.4421 +vn 0.1845 -0.8762 -0.4451 +vn 0.1643 -0.8692 -0.4663 +vn 0.2024 -0.8599 -0.4686 +vn 0.2226 -0.8410 -0.4932 +vn 0.1805 -0.8521 -0.4912 +vn 0.2597 -0.8289 -0.4954 +vn 0.2932 -0.8164 -0.4976 +vn 0.1114 -0.8911 -0.4399 +vn 0.0729 -0.8961 -0.4378 +vn 0.0812 -0.8828 -0.4627 +vn 0.1229 -0.8773 -0.4640 +vn 0.0356 -0.8988 -0.4370 +vn 0.0394 -0.8863 -0.4614 +vn 0.0438 -0.8718 -0.4880 +vn 0.0896 -0.8680 -0.4884 +vn 0.1364 -0.8611 -0.4899 +vn -0.3937 0.8258 -0.4038 +vn -0.3805 0.8256 -0.4167 +vn -0.4059 0.8009 -0.4402 +vn -0.4199 0.8003 -0.4280 +vn -0.3660 0.8275 -0.4258 +vn -0.3910 0.8032 -0.4494 +vn -0.4170 0.7764 -0.4726 +vn -0.4325 0.7730 -0.4641 +vn -0.4469 0.7721 -0.4519 +vn -0.3335 0.8360 -0.4357 +vn -0.3576 0.8135 -0.4587 +vn -0.3749 0.8077 -0.4551 +vn -0.3504 0.8309 -0.4323 +vn -0.3828 0.7886 -0.4813 +vn -0.4005 0.7815 -0.4784 +vn -0.4356 0.7300 -0.5266 +vn -0.4538 0.7208 -0.5239 +vn -0.4269 0.7528 -0.5011 +vn -0.4089 0.7606 -0.5042 +vn -0.4708 0.7138 -0.5185 +vn -0.4438 0.7464 -0.4959 +vn -0.5024 0.7062 -0.4990 +vn -0.4746 0.7405 -0.4759 +vn -0.4595 0.7425 -0.4874 +vn -0.4870 0.7086 -0.5106 +vn -0.3154 0.8421 -0.4374 +vn -0.3390 0.8209 -0.4596 +vn -0.2960 0.8494 -0.4368 +vn -0.3192 0.8290 -0.4593 +vn -0.3436 0.8063 -0.4816 +vn -0.3639 0.7968 -0.4825 +vn -0.2523 0.8657 -0.4324 +vn -0.2740 0.8474 -0.4547 +vn -0.2978 0.8380 -0.4572 +vn -0.2751 0.8572 -0.4353 +vn -0.2974 0.8270 -0.4771 +vn -0.3216 0.8163 -0.4799 +vn -0.3474 0.7780 -0.5236 +vn -0.3728 0.7646 -0.5258 +vn -0.3467 0.7920 -0.5025 +vn -0.3217 0.8039 -0.5003 +vn -0.3955 0.7522 -0.5271 +vn -0.3691 0.7805 -0.5045 +vn -0.3897 0.7702 -0.5049 +vn -0.4164 0.7403 -0.5277 +vn -0.4583 0.6362 -0.6207 +vn -0.4835 0.6192 -0.6187 +vn -0.4553 0.6619 -0.5954 +vn -0.4299 0.6779 -0.5963 +vn -0.5048 0.6041 -0.6166 +vn -0.4778 0.6464 -0.5948 +vn -0.4501 0.6854 -0.5724 +vn -0.4275 0.6998 -0.5723 +vn -0.4016 0.7155 -0.5716 +vn -0.5420 0.5772 -0.6108 +vn -0.5164 0.6196 -0.5911 +vn -0.4977 0.6326 -0.5934 +vn -0.5244 0.5898 -0.6142 +vn -0.4897 0.6596 -0.5702 +vn -0.4708 0.6716 -0.5721 +vn -0.4434 0.7078 -0.5499 +vn -0.4628 0.6961 -0.5489 +vn -0.4227 0.7203 -0.5500 +vn -0.3740 0.7484 -0.5477 +vn -0.3998 0.7342 -0.5488 +vn -0.5590 0.5657 -0.6063 +vn -0.5337 0.6086 -0.5871 +vn -0.5751 0.5562 -0.6000 +vn -0.5505 0.5990 -0.5815 +vn -0.5246 0.6399 -0.5615 +vn -0.5077 0.6486 -0.5670 +vn -0.6072 0.5424 -0.5807 +vn -0.5828 0.5864 -0.5627 +vn -0.5666 0.5917 -0.5734 +vn -0.5911 0.5482 -0.5918 +vn -0.5569 0.6288 -0.5427 +vn -0.5409 0.6330 -0.5538 +vn -0.5142 0.6723 -0.5325 +vn -0.5300 0.6686 -0.5216 +vn -0.4979 0.6781 -0.5406 +vn -0.4808 0.6863 -0.5457 +vn -0.4856 0.8685 0.0995 +vn -0.5092 0.8534 0.1118 +vn -0.4890 0.8608 0.1408 +vn -0.4645 0.8786 0.1112 +vn -0.5467 0.8269 0.1318 +vn -0.5229 0.8354 0.1693 +vn -0.4903 0.8476 0.2028 +vn -0.4576 0.8736 0.1656 +vn -0.4349 0.8910 0.1300 +vn -0.6292 0.7572 0.1754 +vn -0.6016 0.7656 0.2279 +vn -0.5605 0.8041 0.1982 +vn -0.5862 0.7957 0.1525 +vn -0.5660 0.7770 0.2754 +vn -0.5267 0.8157 0.2392 +vn -0.4736 0.8069 0.3531 +vn -0.4396 0.8444 0.3061 +vn -0.4861 0.8295 0.2751 +vn -0.5229 0.7910 0.3175 +vn -0.4093 0.8752 0.2578 +vn -0.4518 0.8615 0.2318 +vn -0.3647 0.9164 0.1650 +vn -0.4013 0.9041 0.1470 +vn -0.4234 0.8860 0.1889 +vn -0.3835 0.8993 0.2102 +vn -0.6725 0.7131 0.1981 +vn -0.6429 0.7215 0.2571 +vn -0.7127 0.6662 0.2199 +vn -0.6821 0.6738 0.2841 +vn -0.6433 0.6846 0.3427 +vn -0.6057 0.7327 0.3104 +vn -0.7864 0.5599 0.2607 +vn -0.7535 0.5660 0.3345 +vn -0.7186 0.6225 0.3100 +vn -0.7507 0.6153 0.2404 +vn -0.7126 0.5745 0.4026 +vn -0.6794 0.6318 0.3732 +vn -0.6077 0.5988 0.5216 +vn -0.5769 0.6587 0.4829 +vn -0.6319 0.6443 0.4309 +vn -0.6647 0.5851 0.4645 +vn -0.5433 0.7139 0.4419 +vn -0.5973 0.6979 0.3952 +vn -0.5605 0.7471 0.3574 +vn -0.5086 0.7631 0.3987 +vn -0.2723 0.6640 0.6964 +vn -0.2570 0.7249 0.6391 +vn -0.3546 0.7100 0.6084 +vn -0.3761 0.6484 0.6619 +vn -0.2422 0.7789 0.5785 +vn -0.3324 0.7649 0.5518 +vn -0.4120 0.7483 0.5199 +vn -0.4393 0.6928 0.5718 +vn -0.4652 0.6314 0.6205 +vn -0.2153 0.8650 0.4532 +vn -0.2903 0.8532 0.4334 +vn -0.3110 0.8126 0.4930 +vn -0.2276 0.8258 0.5160 +vn -0.3580 0.8388 0.4103 +vn -0.3842 0.7971 0.4658 +vn -0.4501 0.7802 0.4344 +vn -0.4183 0.8232 0.3839 +vn -0.4819 0.7308 0.4834 +vn -0.5421 0.6142 0.5735 +vn -0.5128 0.6755 0.5298 +vn -0.2045 0.8973 0.3912 +vn -0.2728 0.8863 0.3742 +vn -0.1972 0.9226 0.3315 +vn -0.2576 0.9130 0.3163 +vn -0.3125 0.9015 0.2995 +vn -0.3331 0.8737 0.3545 +vn -0.1916 0.9561 0.2215 +vn -0.2401 0.9479 0.2092 +vn -0.2470 0.9331 0.2613 +vn -0.1926 0.9421 0.2745 +vn -0.2841 0.9385 0.1961 +vn -0.2954 0.9231 0.2461 +vn -0.3409 0.9116 0.2295 +vn -0.3247 0.9283 0.1810 +vn -0.3620 0.8890 0.2802 +vn -0.3889 0.8593 0.3321 +vn -0.2538 0.8745 -0.4133 +vn -0.2315 0.8818 -0.4109 +vn -0.2742 0.8675 -0.4151 +vn -0.2535 0.8838 -0.3933 +vn -0.2336 0.8898 -0.3919 +vn -0.2122 0.8964 -0.3892 +vn -0.3110 0.8557 -0.4137 +vn -0.2931 0.8613 -0.4151 +vn -0.2897 0.8732 -0.3920 +vn -0.2722 0.8780 -0.3937 +vn -0.2506 0.9027 -0.3498 +vn -0.2335 0.9068 -0.3511 +vn -0.2522 0.8933 -0.3721 +vn -0.2698 0.8886 -0.3710 +vn -0.2156 0.9114 -0.3506 +vn -0.2339 0.8982 -0.3721 +vn -0.1770 0.9210 -0.3470 +vn -0.1938 0.9094 -0.3681 +vn -0.2147 0.9037 -0.3704 +vn -0.1968 0.9161 -0.3493 +vn -0.3274 0.8514 -0.4097 +vn -0.3430 0.8483 -0.4034 +vn -0.3217 0.8664 -0.3820 +vn -0.3065 0.8690 -0.3885 +vn -0.3700 0.8473 -0.3811 +vn -0.3569 0.8471 -0.3938 +vn -0.3486 0.8654 -0.3600 +vn -0.3362 0.8649 -0.3728 +vn -0.3096 0.8952 -0.3207 +vn -0.2976 0.8949 -0.3326 +vn -0.3163 0.8807 -0.3525 +vn -0.3293 0.8808 -0.3402 +vn -0.2830 0.8964 -0.3412 +vn -0.3023 0.8819 -0.3617 +vn -0.2863 0.8849 -0.3675 +vn -0.2675 0.8989 -0.3469 +vn -0.2476 0.9333 -0.2600 +vn -0.2377 0.9356 -0.2611 +vn -0.2478 0.9282 -0.2775 +vn -0.2589 0.9274 -0.2699 +vn -0.2225 0.9388 -0.2629 +vn -0.2335 0.9307 -0.2815 +vn -0.2482 0.9207 -0.3012 +vn -0.2632 0.9185 -0.2950 +vn -0.2744 0.9182 -0.2856 +vn -0.1910 0.9450 -0.2655 +vn -0.2024 0.9365 -0.2863 +vn -0.2185 0.9335 -0.2844 +vn -0.2072 0.9419 -0.2642 +vn -0.2165 0.9266 -0.3074 +vn -0.2328 0.9234 -0.3051 +vn -0.2492 0.9119 -0.3259 +vn -0.2328 0.9153 -0.3288 +vn -0.2652 0.9092 -0.3210 +vn -0.2917 0.9075 -0.3022 +vn -0.2792 0.9077 -0.3133 +vn -0.1744 0.9480 -0.2662 +vn -0.1861 0.9396 -0.2872 +vn -0.1588 0.9506 -0.2667 +vn -0.1697 0.9427 -0.2874 +vn -0.1833 0.9335 -0.3083 +vn -0.1998 0.9300 -0.3085 +vn -0.1260 0.9556 -0.2663 +vn -0.1356 0.9486 -0.2859 +vn -0.1534 0.9456 -0.2869 +vn -0.1426 0.9532 -0.2667 +vn -0.1478 0.9405 -0.3059 +vn -0.1659 0.9370 -0.3075 +vn -0.1807 0.9272 -0.3282 +vn -0.1613 0.9314 -0.3264 +vn -0.1985 0.9230 -0.3295 +vn -0.2159 0.9191 -0.3297 +vn -0.0808 0.9960 -0.0372 +vn -0.0932 0.9950 -0.0353 +vn -0.0845 0.9964 0.0016 +vn -0.0734 0.9973 0.0009 +vn -0.1069 0.9937 -0.0344 +vn -0.0986 0.9951 0.0017 +vn -0.0878 0.9955 0.0360 +vn -0.0747 0.9965 0.0375 +vn -0.0637 0.9973 0.0376 +vn -0.1415 0.9893 -0.0355 +vn -0.1335 0.9910 -0.0015 +vn -0.1144 0.9934 0.0005 +vn -0.1234 0.9918 -0.0343 +vn -0.1231 0.9919 0.0306 +vn -0.1044 0.9940 0.0340 +vn -0.0977 0.9907 0.0947 +vn -0.0779 0.9919 0.1000 +vn -0.0918 0.9936 0.0666 +vn -0.1117 0.9918 0.0627 +vn -0.0607 0.9927 0.1041 +vn -0.0757 0.9947 0.0701 +vn -0.0374 0.9932 0.1105 +vn -0.0523 0.9959 0.0742 +vn -0.0621 0.9954 0.0724 +vn -0.0476 0.9930 0.1079 +vn -0.1629 0.9859 -0.0377 +vn -0.1546 0.9880 -0.0050 +vn -0.1861 0.9816 -0.0418 +vn -0.1794 0.9837 -0.0094 +vn -0.1702 0.9852 0.0210 +vn -0.1455 0.9890 0.0266 +vn -0.2412 0.9689 -0.0555 +vn -0.2366 0.9713 -0.0233 +vn -0.2061 0.9784 -0.0159 +vn -0.2129 0.9759 -0.0472 +vn -0.2294 0.9733 0.0063 +vn -0.1988 0.9799 0.0147 +vn -0.2139 0.9746 0.0662 +vn -0.1799 0.9808 0.0750 +vn -0.1892 0.9809 0.0442 +vn -0.2224 0.9743 0.0362 +vn -0.1486 0.9855 0.0824 +vn -0.1604 0.9857 0.0516 +vn -0.1340 0.9893 0.0574 +vn -0.1218 0.9885 0.0891 +vn -0.1430 0.9622 0.2316 +vn -0.1502 0.9714 0.1839 +vn -0.1942 0.9654 0.1741 +vn -0.0999 0.9656 0.2400 +vn -0.1117 0.9750 0.1922 +vn -0.1238 0.9807 0.1513 +vn -0.1596 0.9768 0.1431 +vn -0.1991 0.9708 0.1339 +vn -0.0296 0.9670 0.2532 +vn -0.0484 0.9773 0.2061 +vn -0.0775 0.9768 0.1995 +vn -0.0622 0.9670 0.2470 +vn -0.0659 0.9841 0.1652 +vn -0.0931 0.9829 0.1586 +vn -0.1075 0.9867 0.1222 +vn -0.0829 0.9882 0.1287 +vn -0.1368 0.9839 0.1153 +vn -0.2065 0.9735 0.0985 +vn -0.1692 0.9797 0.1073 +vn -0.0019 0.9659 0.2589 +vn -0.0232 0.9769 0.2122 +vn 0.0216 0.9641 0.2646 +vn -0.0028 0.9759 0.2183 +vn -0.0242 0.9839 0.1770 +vn -0.0434 0.9842 0.1714 +vn 0.0552 0.9593 0.2769 +vn 0.0260 0.9728 0.2303 +vn 0.0141 0.9744 0.2242 +vn 0.0402 0.9619 0.2705 +vn 0.0016 0.9822 0.1878 +vn -0.0097 0.9831 0.1827 +vn -0.0297 0.9891 0.1441 +vn -0.0200 0.9887 0.1484 +vn -0.0440 0.9892 0.1396 +vn -0.0612 0.9891 0.1343 +vn -0.4733 0.8641 -0.1714 +vn -0.5099 0.8391 -0.1892 +vn -0.5165 0.8436 -0.1468 +vn -0.4778 0.8686 -0.1316 +vn -0.5490 0.8099 -0.2064 +vn -0.5570 0.8146 -0.1619 +vn -0.5631 0.8177 -0.1193 +vn -0.5201 0.8473 -0.1077 +vn -0.4804 0.8719 -0.0944 +vn -0.6308 0.7380 -0.2396 +vn -0.6427 0.7424 -0.1893 +vn -0.5997 0.7807 -0.1758 +vn -0.5893 0.7763 -0.2236 +vn -0.6522 0.7450 -0.1397 +vn -0.6070 0.7839 -0.1305 +vn -0.6638 0.7468 -0.0405 +vn -0.6169 0.7860 -0.0401 +vn -0.6132 0.7853 -0.0852 +vn -0.6590 0.7466 -0.0909 +vn -0.5703 0.8206 -0.0367 +vn -0.5671 0.8199 -0.0787 +vn -0.4827 0.8755 -0.0235 +vn -0.4812 0.8746 -0.0594 +vn -0.5232 0.8494 -0.0695 +vn -0.5245 0.8508 -0.0318 +vn -0.6719 0.6953 -0.2552 +vn -0.6861 0.6991 -0.2013 +vn -0.7124 0.6481 -0.2690 +vn -0.7282 0.6516 -0.2127 +vn -0.7404 0.6539 -0.1556 +vn -0.6967 0.7019 -0.1484 +vn -0.7870 0.5430 -0.2929 +vn -0.8060 0.5450 -0.2309 +vn -0.7686 0.5999 -0.2222 +vn -0.7509 0.5972 -0.2820 +vn -0.8206 0.5465 -0.1672 +vn -0.7818 0.6020 -0.1622 +vn -0.8351 0.5490 -0.0345 +vn -0.7956 0.6047 -0.0369 +vn -0.7910 0.6035 -0.1003 +vn -0.8303 0.5479 -0.1022 +vn -0.7536 0.6562 -0.0387 +vn -0.7488 0.6555 -0.0981 +vn -0.7047 0.7031 -0.0947 +vn -0.7094 0.7037 -0.0403 +vn -0.7738 0.6106 0.1685 +vn -0.8111 0.5554 0.1837 +vn -0.7347 0.6610 0.1526 +vn -0.7479 0.6582 0.0868 +vn -0.7882 0.6076 0.0976 +vn -0.8265 0.5524 0.1086 +vn -0.6488 0.7514 0.1201 +vn -0.6932 0.7077 0.1368 +vn -0.6602 0.7483 0.0653 +vn -0.7053 0.7048 0.0756 +vn -0.7102 0.7038 0.0167 +vn -0.6646 0.7471 0.0110 +vn -0.7536 0.6569 0.0226 +vn -0.8341 0.5505 0.0355 +vn -0.7951 0.6058 0.0292 +vn -0.6040 0.7901 0.1046 +vn -0.5616 0.8225 0.0906 +vn -0.5687 0.8212 0.0479 +vn -0.6140 0.7874 0.0552 +vn -0.4837 0.8719 0.0762 +vn -0.5208 0.8499 0.0801 +vn -0.4842 0.8738 0.0447 +vn -0.5239 0.8507 0.0428 +vn -0.5254 0.8509 0.0067 +vn -0.4827 0.8757 0.0108 +vn -0.5704 0.8213 0.0049 +vn -0.6178 0.7863 0.0073 +vn -0.1383 0.9483 0.2855 +vn -0.1360 0.9294 0.3431 +vn -0.0818 0.9326 0.3516 +vn -0.0899 0.9516 0.2938 +vn -0.1388 0.8730 0.4675 +vn -0.1365 0.9044 0.4043 +vn -0.0709 0.8764 0.4763 +vn -0.0753 0.9078 0.4125 +vn 0.0416 0.8748 0.4827 +vn 0.0249 0.9067 0.4210 +vn -0.0219 0.9082 0.4179 +vn -0.0106 0.8769 0.4806 +vn 0.0073 0.9322 0.3619 +vn -0.0341 0.9333 0.3574 +vn -0.0476 0.9526 0.3004 +vn -0.0109 0.9521 0.3057 +vn -0.1437 0.8343 0.5323 +vn -0.1495 0.7884 0.5967 +vn -0.0663 0.7925 0.6063 +vn -0.0676 0.8382 0.5411 +vn -0.1646 0.6749 0.7194 +vn -0.1570 0.7349 0.6597 +vn -0.0667 0.6803 0.7299 +vn -0.0657 0.7398 0.6696 +vn 0.0967 0.6795 0.7273 +vn 0.0853 0.7382 0.6691 +vn 0.0146 0.7404 0.6720 +vn 0.0206 0.6817 0.7314 +vn 0.0720 0.7905 0.6082 +vn 0.0077 0.7930 0.6091 +vn -0.0010 0.8384 0.5450 +vn 0.0575 0.8363 0.5453 +vn 0.3250 0.6464 0.6903 +vn 0.2941 0.7073 0.6429 +vn 0.2496 0.7179 0.6499 +vn 0.2755 0.6589 0.7000 +vn 0.2614 0.7617 0.5929 +vn 0.2213 0.7719 0.5960 +vn 0.1775 0.7797 0.6005 +vn 0.2010 0.7269 0.6567 +vn 0.2224 0.6679 0.7103 +vn 0.1913 0.8525 0.4864 +vn 0.1608 0.8601 0.4841 +vn 0.1917 0.8191 0.5407 +vn 0.2265 0.8107 0.5399 +vn 0.1265 0.8661 0.4836 +vn 0.1525 0.8264 0.5420 +vn 0.1081 0.8320 0.5442 +vn 0.0870 0.8712 0.4831 +vn 0.1283 0.7861 0.6046 +vn 0.1636 0.6751 0.7194 +vn 0.1467 0.7334 0.6638 +vn 0.1553 0.8883 0.4321 +vn 0.1300 0.8942 0.4284 +vn 0.1207 0.9175 0.3790 +vn 0.0989 0.9223 0.3735 +vn 0.0734 0.9264 0.3694 +vn 0.0999 0.8995 0.4254 +vn 0.0692 0.9446 0.3209 +vn 0.0865 0.9411 0.3269 +vn 0.0470 0.9478 0.3154 +vn 0.0205 0.9503 0.3106 +vn 0.0429 0.9298 0.3655 +vn 0.0652 0.9036 0.4234 +vn -0.2379 0.9575 0.1631 +vn -0.2397 0.9630 0.1233 +vn -0.2764 0.9545 0.1119 +vn -0.2779 0.9487 0.1507 +vn -0.2495 0.9667 0.0566 +vn -0.2435 0.9659 0.0883 +vn -0.2821 0.9583 0.0457 +vn -0.2785 0.9573 0.0773 +vn -0.3449 0.9384 0.0219 +vn -0.3441 0.9374 0.0531 +vn -0.3113 0.9480 0.0655 +vn -0.3140 0.9488 0.0341 +vn -0.3462 0.9341 0.0869 +vn -0.3115 0.9450 0.0994 +vn -0.3154 0.9389 0.1378 +vn -0.3524 0.9277 0.1233 +vn -0.2552 0.9665 0.0263 +vn -0.2619 0.9651 -0.0029 +vn -0.2918 0.9564 -0.0141 +vn -0.2874 0.9577 0.0158 +vn -0.2712 0.9603 -0.0650 +vn -0.2666 0.9632 -0.0335 +vn -0.2989 0.9511 -0.0772 +vn -0.2966 0.9540 -0.0443 +vn -0.3534 0.9296 -0.1049 +vn -0.3532 0.9329 -0.0704 +vn -0.3247 0.9441 -0.0571 +vn -0.3270 0.9407 -0.0901 +vn -0.3504 0.9358 -0.0390 +vn -0.3218 0.9465 -0.0258 +vn -0.3174 0.9483 0.0039 +vn -0.3476 0.9376 -0.0084 +vn -0.4429 0.8891 -0.1156 +vn -0.4396 0.8850 -0.1537 +vn -0.4436 0.8926 -0.0806 +vn -0.4107 0.9094 -0.0665 +vn -0.4110 0.9061 -0.1001 +vn -0.4091 0.9022 -0.1367 +vn -0.4438 0.8960 -0.0138 +vn -0.4439 0.8949 -0.0470 +vn -0.4093 0.9124 -0.0023 +vn -0.4094 0.9117 -0.0344 +vn -0.3778 0.9256 -0.0214 +vn -0.3763 0.9264 0.0096 +vn -0.3800 0.9235 -0.0524 +vn -0.3810 0.9167 -0.1202 +vn -0.3813 0.9205 -0.0851 +vn -0.4456 0.8950 0.0194 +vn -0.4472 0.8930 0.0510 +vn -0.4137 0.9083 0.0620 +vn -0.4101 0.9116 0.0295 +vn -0.4539 0.8871 0.0836 +vn -0.4205 0.9023 0.0948 +vn -0.3879 0.9152 0.1094 +vn -0.3801 0.9220 0.0737 +vn -0.3770 0.9253 0.0412 +vn -0.7518 0.0889 -0.6534 +vn -0.7350 0.0909 -0.6719 +vn -0.7725 0.0869 -0.6290 +vn -0.7635 0.1682 -0.6236 +vn -0.7428 0.1716 -0.6472 +vn -0.7256 0.1752 -0.6654 +vn -0.8237 0.0833 -0.5609 +vn -0.7965 0.0851 -0.5986 +vn -0.8148 0.1620 -0.5566 +vn -0.7878 0.1650 -0.5935 +vn -0.7840 0.3047 -0.5408 +vn -0.7571 0.3083 -0.5760 +vn -0.7742 0.2394 -0.5859 +vn -0.8014 0.2359 -0.5497 +vn -0.7329 0.3124 -0.6043 +vn -0.7500 0.2433 -0.6150 +vn -0.6944 0.3225 -0.6433 +vn -0.7118 0.2524 -0.6555 +vn -0.7290 0.2477 -0.6381 +vn -0.7120 0.3172 -0.6265 +vn -0.8528 0.0817 -0.5158 +vn -0.8830 0.0804 -0.4624 +vn -0.8742 0.1572 -0.4594 +vn -0.8441 0.1595 -0.5119 +vn -0.9401 0.0784 -0.3319 +vn -0.9126 0.0792 -0.4012 +vn -0.9312 0.1541 -0.3303 +vn -0.9039 0.1554 -0.3985 +vn -0.8988 0.2964 -0.3230 +vn -0.8718 0.2976 -0.3890 +vn -0.8900 0.2282 -0.3946 +vn -0.9173 0.2268 -0.3272 +vn -0.8427 0.2994 -0.4476 +vn -0.8606 0.2303 -0.4543 +vn -0.8305 0.2328 -0.5061 +vn -0.8129 0.3018 -0.4981 +vn -0.7640 0.5410 -0.3517 +vn -0.7956 0.4849 -0.3633 +vn -0.8199 0.4860 -0.3027 +vn -0.7393 0.5389 -0.4037 +vn -0.7691 0.4842 -0.4173 +vn -0.7965 0.4261 -0.4289 +vn -0.8241 0.4258 -0.3735 +vn -0.8498 0.4259 -0.3107 +vn -0.6893 0.5359 -0.4875 +vn -0.7158 0.4840 -0.5034 +vn -0.7422 0.4838 -0.4638 +vn -0.7139 0.5372 -0.4492 +vn -0.7408 0.4284 -0.5174 +vn -0.7682 0.4270 -0.4770 +vn -0.7920 0.3664 -0.4883 +vn -0.7636 0.3688 -0.5300 +vn -0.8211 0.3646 -0.4391 +vn -0.8761 0.3627 -0.3176 +vn -0.8497 0.3634 -0.3820 +vn -0.6657 0.5355 -0.5198 +vn -0.6911 0.4850 -0.5359 +vn -0.6441 0.5362 -0.5455 +vn -0.6683 0.4871 -0.5623 +vn -0.6915 0.4338 -0.5776 +vn -0.7149 0.4306 -0.5509 +vn -0.6305 0.4951 -0.5978 +vn -0.6481 0.4904 -0.5826 +vn -0.6245 0.5383 -0.5659 +vn -0.6531 0.4433 -0.6139 +vn -0.6708 0.4379 -0.5985 +vn -0.6923 0.3804 -0.6132 +vn -0.6746 0.3859 -0.6292 +vn -0.7132 0.3757 -0.5918 +vn -0.7372 0.3719 -0.5642 +vn 0.1006 0.9372 0.3341 +vn 0.0657 0.9566 0.2838 +vn 0.1372 0.9124 0.3856 +vn 0.1491 0.9068 0.3942 +vn 0.1094 0.9332 0.3423 +vn 0.0738 0.9539 0.2911 +vn 0.2160 0.8445 0.4901 +vn 0.1765 0.8814 0.4381 +vn 0.2335 0.8355 0.4974 +vn 0.1903 0.8745 0.4461 +vn 0.2334 0.8204 0.5219 +vn 0.1898 0.8620 0.4701 +vn 0.1960 0.8677 0.4569 +vn 0.2401 0.8273 0.5078 +vn 0.1483 0.8971 0.4161 +vn 0.1531 0.9017 0.4045 +vn 0.0753 0.9488 0.3067 +vn 0.0768 0.9512 0.2989 +vn 0.1134 0.9293 0.3515 +vn 0.1097 0.9259 0.3616 +vn 0.2563 0.8005 0.5419 +vn 0.2950 0.7506 0.5912 +vn 0.3192 0.7381 0.5943 +vn 0.2764 0.7903 0.5468 +vn 0.3675 0.6326 0.6817 +vn 0.3327 0.6939 0.6386 +vn 0.3984 0.6171 0.6786 +vn 0.3598 0.6807 0.6381 +vn 0.4065 0.5932 0.6949 +vn 0.3658 0.6580 0.6582 +vn 0.3727 0.6676 0.6445 +vn 0.4131 0.6036 0.6819 +vn 0.3224 0.7180 0.6169 +vn 0.3297 0.7270 0.6023 +vn 0.2853 0.7802 0.5567 +vn 0.2781 0.7723 0.5712 +vn 0.0000 0.6048 0.7964 +vn 0.0000 0.6631 0.7485 +vn 0.1521 0.6609 0.7349 +vn 0.1730 0.5980 0.7826 +vn -0.0000 0.7209 0.6931 +vn 0.1325 0.7165 0.6848 +vn 0.2295 0.7138 0.6617 +vn 0.2642 0.6541 0.7088 +vn 0.2961 0.5917 0.7498 +vn -0.0000 0.8175 0.5759 +vn 0.0930 0.8153 0.5715 +vn 0.1117 0.7698 0.6285 +vn -0.0000 0.7704 0.6375 +vn 0.1626 0.8150 0.5561 +vn 0.1964 0.7665 0.6114 +vn 0.2499 0.7678 0.5900 +vn 0.2092 0.8159 0.5390 +vn 0.2919 0.7130 0.6376 +vn 0.3715 0.5885 0.7181 +vn 0.3320 0.6534 0.6803 +vn -0.0000 0.8567 0.5158 +vn 0.0742 0.8570 0.5100 +vn 0.0000 0.8922 0.4517 +vn 0.0578 0.8914 0.4496 +vn 0.1018 0.8922 0.4399 +vn 0.1316 0.8562 0.4996 +vn 0.0000 0.9451 0.3268 +vn 0.0293 0.9449 0.3260 +vn 0.0424 0.9212 0.3867 +vn 0.0000 0.9208 0.3900 +vn 0.0518 0.9457 0.3208 +vn 0.0754 0.9215 0.3809 +vn 0.0976 0.9233 0.3714 +vn 0.0670 0.9469 0.3146 +vn 0.1320 0.8937 0.4288 +vn 0.1692 0.8583 0.4845 +vn -0.2072 0.8894 -0.4075 +vn -0.2265 0.8743 -0.4293 +vn -0.1885 0.9030 -0.3861 +vn -0.1634 0.9094 -0.3825 +vn -0.1800 0.8969 -0.4039 +vn -0.1984 0.8828 -0.4258 +vn -0.1554 0.9260 -0.3442 +vn -0.1715 0.9151 -0.3649 +vn -0.1332 0.9306 -0.3410 +vn -0.1473 0.9207 -0.3615 +vn -0.0871 0.9382 -0.3350 +vn -0.0971 0.9299 -0.3548 +vn -0.1228 0.9256 -0.3581 +vn -0.1099 0.9348 -0.3378 +vn -0.1088 0.9204 -0.3757 +vn -0.1362 0.9154 -0.3788 +vn -0.1345 0.8978 -0.4193 +vn -0.1670 0.8909 -0.4224 +vn -0.1514 0.9037 -0.4004 +vn -0.1208 0.9099 -0.3969 +vn -0.1412 0.9355 -0.3238 +vn -0.1282 0.9440 -0.3039 +vn -0.1089 0.9472 -0.3017 +vn -0.1200 0.9394 -0.3210 +vn -0.1083 0.9580 -0.2655 +vn -0.1175 0.9515 -0.2845 +vn -0.0913 0.9600 -0.2645 +vn -0.0989 0.9541 -0.2827 +vn -0.0581 0.9632 -0.2626 +vn -0.0632 0.9581 -0.2795 +vn -0.0811 0.9562 -0.2811 +vn -0.0742 0.9618 -0.2635 +vn -0.0701 0.9522 -0.2973 +vn -0.0890 0.9500 -0.2993 +vn -0.0991 0.9428 -0.3183 +vn -0.0777 0.9457 -0.3157 +vn -0.0000 0.9654 -0.2609 +vn -0.0000 0.9610 -0.2766 +vn -0.0146 0.9608 -0.2769 +vn -0.0132 0.9653 -0.2609 +vn -0.0000 0.9560 -0.2934 +vn -0.0161 0.9558 -0.2935 +vn -0.0334 0.9551 -0.2944 +vn -0.0299 0.9603 -0.2774 +vn -0.0274 0.9649 -0.2613 +vn 0.0000 0.9442 -0.3293 +vn -0.0203 0.9439 -0.3295 +vn -0.0181 0.9502 -0.3112 +vn 0.0000 0.9505 -0.3107 +vn -0.0419 0.9428 -0.3308 +vn -0.0372 0.9494 -0.3120 +vn -0.0573 0.9478 -0.3137 +vn -0.0640 0.9410 -0.3324 +vn -0.0512 0.9540 -0.2955 +vn -0.0422 0.9642 -0.2618 +vn -0.0464 0.9594 -0.2784 +vn 0.0000 0.9373 -0.3485 +vn -0.0229 0.9368 -0.3491 +vn -0.0000 0.9294 -0.3691 +vn -0.0256 0.9290 -0.3693 +vn -0.0528 0.9272 -0.3708 +vn -0.0469 0.9355 -0.3501 +vn -0.0000 0.9107 -0.4130 +vn -0.0319 0.9101 -0.4131 +vn -0.0287 0.9200 -0.3909 +vn -0.0000 0.9207 -0.3903 +vn -0.0658 0.9076 -0.4147 +vn -0.0588 0.9181 -0.3920 +vn -0.0901 0.9145 -0.3943 +vn -0.1000 0.9037 -0.4164 +vn -0.0804 0.9245 -0.3727 +vn -0.0720 0.9331 -0.3523 +vn -0.0631 0.9980 -0.0009 +vn -0.0700 0.9968 -0.0397 +vn -0.0549 0.9978 0.0371 +vn -0.0460 0.9983 0.0355 +vn -0.0538 0.9985 -0.0033 +vn -0.0592 0.9973 -0.0428 +vn -0.0300 0.9932 0.1128 +vn -0.0437 0.9963 0.0746 +vn -0.0227 0.9932 0.1139 +vn -0.0363 0.9966 0.0745 +vn -0.0116 0.9933 0.1148 +vn -0.0226 0.9971 0.0725 +vn -0.0289 0.9969 0.0737 +vn -0.0171 0.9933 0.1147 +vn -0.0299 0.9991 0.0314 +vn -0.0381 0.9987 0.0336 +vn -0.0389 0.9980 -0.0494 +vn -0.0491 0.9977 -0.0462 +vn -0.0442 0.9990 -0.0061 +vn -0.0354 0.9993 -0.0092 +vn -0.0120 0.9884 0.1517 +vn 0.0091 0.9812 0.1928 +vn 0.0159 0.9803 0.1971 +vn -0.0060 0.9879 0.1547 +vn 0.0355 0.9710 0.2363 +vn 0.0417 0.9693 0.2424 +vn 0.0454 0.9661 0.2543 +vn 0.0459 0.9676 0.2483 +vn 0.0218 0.9785 0.2050 +vn 0.0196 0.9793 0.2014 +vn -0.0006 0.9876 0.1569 +vn 0.0025 0.9873 0.1589 +vn -0.0000 0.9634 0.2682 +vn 0.0183 0.9636 0.2666 +vn -0.0000 0.9771 0.2128 +vn 0.0097 0.9771 0.2126 +vn 0.0168 0.9774 0.2107 +vn 0.0322 0.9640 0.2641 +vn -0.0000 0.9935 0.1139 +vn -0.0017 0.9935 0.1141 +vn 0.0032 0.9868 0.1617 +vn 0.0000 0.9868 0.1619 +vn -0.0040 0.9934 0.1144 +vn 0.0046 0.9869 0.1613 +vn 0.0047 0.9871 0.1602 +vn -0.0077 0.9934 0.1147 +vn 0.0205 0.9778 0.2084 +vn 0.0414 0.9649 0.2594 +vn -0.0000 0.9977 0.0684 +vn -0.0050 0.9976 0.0690 +vn -0.0000 0.9997 0.0253 +vn -0.0073 0.9996 0.0256 +vn -0.0146 0.9995 0.0272 +vn -0.0106 0.9975 0.0699 +vn -0.0000 0.9984 -0.0572 +vn -0.0095 0.9983 -0.0570 +vn -0.0086 0.9998 -0.0159 +vn -0.0000 0.9999 -0.0169 +vn -0.0191 0.9983 -0.0549 +vn -0.0175 0.9997 -0.0145 +vn -0.0262 0.9996 -0.0119 +vn -0.0291 0.9982 -0.0526 +vn -0.0225 0.9993 0.0291 +vn -0.0161 0.9973 0.0712 +vn -0.6257 0.1104 -0.7722 +vn -0.6011 0.1147 -0.7909 +vn -0.6130 0.2142 -0.7605 +vn -0.5883 0.2224 -0.7774 +vn -0.5528 0.2325 -0.8002 +vn -0.5668 0.1197 -0.8151 +vn -0.5707 0.3935 -0.7208 +vn -0.5439 0.4078 -0.7334 +vn -0.5682 0.3208 -0.7578 +vn -0.5945 0.3087 -0.7425 +vn -0.5068 0.4250 -0.7500 +vn -0.5326 0.3345 -0.7775 +vn -0.3936 0.4637 -0.7938 +vn -0.4185 0.3674 -0.8306 +vn -0.4834 0.3505 -0.8022 +vn -0.4580 0.4436 -0.7704 +vn -0.4384 0.2564 -0.8614 +vn -0.5046 0.2437 -0.8282 +vn -0.5181 0.1257 -0.8460 +vn -0.4524 0.1323 -0.8819 +vn -0.5445 0.4674 -0.6965 +vn -0.5159 0.4843 -0.7066 +vn -0.5160 0.5322 -0.6712 +vn -0.4870 0.5496 -0.6788 +vn -0.4487 0.5696 -0.6886 +vn -0.4787 0.5027 -0.7198 +vn -0.4278 0.6539 -0.6240 +vn -0.4570 0.6062 -0.6509 +vn -0.4873 0.5877 -0.6458 +vn -0.3896 0.6735 -0.6281 +vn -0.4189 0.6257 -0.6580 +vn -0.2865 0.7129 -0.6401 +vn -0.3119 0.6675 -0.6761 +vn -0.3709 0.6468 -0.6664 +vn -0.3425 0.6934 -0.6339 +vn -0.3392 0.6121 -0.7144 +vn -0.4001 0.5905 -0.7009 +vn -0.4294 0.5235 -0.7359 +vn -0.3667 0.5447 -0.7542 +vn -0.0000 0.7554 -0.6552 +vn -0.0000 0.7150 -0.6991 +vn -0.0811 0.7112 -0.6982 +vn -0.0729 0.7530 -0.6539 +vn 0.0000 0.6627 -0.7489 +vn -0.0896 0.6596 -0.7463 +vn -0.1808 0.6485 -0.7394 +vn -0.1637 0.7020 -0.6931 +vn -0.1487 0.7440 -0.6514 +vn 0.0000 0.5150 -0.8572 +vn -0.1084 0.5116 -0.8524 +vn -0.0991 0.5934 -0.7988 +vn 0.0000 0.5978 -0.8016 +vn -0.2158 0.4999 -0.8388 +vn -0.1980 0.5825 -0.7883 +vn -0.2891 0.5651 -0.7727 +vn -0.3126 0.4833 -0.8178 +vn -0.2652 0.6323 -0.7280 +vn -0.2206 0.7306 -0.6462 +vn -0.2426 0.6864 -0.6856 +vn 0.0000 0.4138 -0.9104 +vn -0.1174 0.4097 -0.9046 +vn 0.0000 0.2912 -0.9567 +vn -0.1251 0.2887 -0.9492 +vn -0.2462 0.2805 -0.9277 +vn -0.2324 0.3997 -0.8867 +vn -0.1301 0.1497 -0.9801 +vn 0.0000 0.1515 -0.9885 +vn -0.2560 0.1454 -0.9557 +vn -0.3647 0.1392 -0.9207 +vn -0.3528 0.2691 -0.8962 +vn -0.3344 0.3846 -0.8604 +vn -0.0122 0.9696 -0.2446 +vn -0.0000 0.9696 -0.2446 +vn -0.0252 0.9693 -0.2447 +vn -0.0237 0.9738 -0.2260 +vn -0.0114 0.9740 -0.2263 +vn 0.0000 0.9741 -0.2263 +vn -0.0536 0.9680 -0.2450 +vn -0.0392 0.9688 -0.2448 +vn -0.0504 0.9730 -0.2253 +vn -0.0366 0.9735 -0.2258 +vn -0.0457 0.9828 -0.1791 +vn -0.0333 0.9830 -0.1808 +vn -0.0347 0.9783 -0.2045 +vn -0.0476 0.9779 -0.2035 +vn -0.0216 0.9831 -0.1819 +vn -0.0224 0.9784 -0.2053 +vn 0.0000 0.9831 -0.1830 +vn 0.0000 0.9785 -0.2061 +vn -0.0108 0.9785 -0.2057 +vn -0.0104 0.9831 -0.1829 +vn -0.0691 0.9670 -0.2452 +vn -0.0847 0.9657 -0.2455 +vn -0.0796 0.9712 -0.2244 +vn -0.0645 0.9722 -0.2249 +vn -0.1176 0.9622 -0.2458 +vn -0.1012 0.9640 -0.2457 +vn -0.1108 0.9685 -0.2231 +vn -0.0948 0.9700 -0.2238 +vn -0.1000 0.9802 -0.1710 +vn -0.0856 0.9812 -0.1731 +vn -0.0899 0.9757 -0.1996 +vn -0.1048 0.9746 -0.1981 +vn -0.0719 0.9819 -0.1753 +vn -0.0752 0.9767 -0.2010 +vn -0.0612 0.9774 -0.2023 +vn -0.0585 0.9824 -0.1773 +vn -0.0750 0.9942 -0.0776 +vn -0.0870 0.9934 -0.0746 +vn -0.0635 0.9947 -0.0809 +vn -0.0665 0.9911 -0.1155 +vn -0.0788 0.9905 -0.1123 +vn -0.0916 0.9898 -0.1094 +vn -0.0414 0.9953 -0.0877 +vn -0.0523 0.9951 -0.0843 +vn -0.0429 0.9917 -0.1215 +vn -0.0545 0.9914 -0.1187 +vn -0.0565 0.9872 -0.1495 +vn -0.0442 0.9874 -0.1520 +vn -0.0690 0.9867 -0.1469 +vn -0.0957 0.9853 -0.1414 +vn -0.0822 0.9861 -0.1441 +vn -0.0306 0.9954 -0.0904 +vn -0.0202 0.9955 -0.0931 +vn -0.0207 0.9918 -0.1262 +vn -0.0316 0.9917 -0.1243 +vn 0.0000 0.9954 -0.0954 +vn -0.0099 0.9955 -0.0944 +vn -0.0000 0.9918 -0.1281 +vn -0.0101 0.9917 -0.1279 +vn -0.0102 0.9876 -0.1568 +vn 0.0000 0.9875 -0.1575 +vn -0.0210 0.9875 -0.1559 +vn -0.0324 0.9875 -0.1540 +vn -0.1340 0.9601 -0.2456 +vn -0.1493 0.9580 -0.2449 +vn -0.1415 0.9650 -0.2209 +vn -0.1262 0.9668 -0.2221 +vn -0.1812 0.9529 -0.2434 +vn -0.1651 0.9556 -0.2442 +vn -0.1731 0.9603 -0.2189 +vn -0.1565 0.9630 -0.2196 +vn -0.1614 0.9732 -0.1636 +vn -0.1445 0.9757 -0.1647 +vn -0.1500 0.9696 -0.1931 +vn -0.1663 0.9672 -0.1918 +vn -0.1292 0.9775 -0.1666 +vn -0.1346 0.9716 -0.1947 +vn -0.1199 0.9731 -0.1965 +vn -0.1144 0.9790 -0.1687 +vn -0.1981 0.9496 -0.2430 +vn -0.2142 0.9462 -0.2426 +vn -0.2084 0.9532 -0.2191 +vn -0.1901 0.9572 -0.2183 +vn -0.2485 0.9366 -0.2471 +vn -0.2315 0.9418 -0.2439 +vn -0.2489 0.9414 -0.2276 +vn -0.2279 0.9482 -0.2212 +vn -0.2494 0.9521 -0.1771 +vn -0.2244 0.9597 -0.1691 +vn -0.2261 0.9540 -0.1970 +vn -0.2497 0.9467 -0.2033 +vn -0.2010 0.9655 -0.1653 +vn -0.2041 0.9598 -0.1929 +vn -0.1845 0.9639 -0.1919 +vn -0.1799 0.9701 -0.1632 +vn -0.2170 0.9729 -0.0798 +vn -0.2454 0.9655 -0.0870 +vn -0.1918 0.9786 -0.0741 +vn -0.1954 0.9750 -0.1057 +vn -0.2206 0.9691 -0.1102 +vn -0.2473 0.9617 -0.1185 +vn -0.1483 0.9865 -0.0695 +vn -0.1685 0.9831 -0.0711 +vn -0.1530 0.9829 -0.1023 +vn -0.1731 0.9795 -0.1029 +vn -0.1765 0.9752 -0.1338 +vn -0.1572 0.9785 -0.1335 +vn -0.1983 0.9707 -0.1356 +vn -0.2492 0.9571 -0.1476 +vn -0.2226 0.9647 -0.1405 +vn -0.1299 0.9891 -0.0695 +vn -0.1141 0.9910 -0.0703 +vn -0.1194 0.9873 -0.1044 +vn -0.1354 0.9854 -0.1028 +vn -0.0997 0.9924 -0.0722 +vn -0.1051 0.9887 -0.1066 +vn -0.1097 0.9842 -0.1388 +vn -0.1243 0.9828 -0.1365 +vn -0.1399 0.9810 -0.1346 +vn -0.2655 0.9291 -0.2575 +vn -0.2843 0.9195 -0.2714 +vn -0.2907 0.9230 -0.2520 +vn -0.2709 0.9328 -0.2377 +vn -0.3211 0.8966 -0.3051 +vn -0.3015 0.9091 -0.2874 +vn -0.3302 0.8997 -0.2854 +vn -0.3111 0.9118 -0.2678 +vn -0.3440 0.9092 -0.2348 +vn -0.3228 0.9212 -0.2173 +vn -0.3172 0.9163 -0.2444 +vn -0.3387 0.9038 -0.2617 +vn -0.2991 0.9326 -0.2018 +vn -0.2964 0.9274 -0.2283 +vn -0.2729 0.9378 -0.2148 +vn -0.2755 0.9428 -0.1876 +vn -0.3402 0.8827 -0.3241 +vn -0.3605 0.8671 -0.3438 +vn -0.3707 0.8705 -0.3236 +vn -0.3508 0.8857 -0.3041 +vn -0.4063 0.8274 -0.3877 +vn -0.3817 0.8493 -0.3647 +vn -0.4182 0.8308 -0.3673 +vn -0.3931 0.8525 -0.3446 +vn -0.4399 0.8409 -0.3153 +vn -0.4126 0.8624 -0.2932 +vn -0.4032 0.8571 -0.3206 +vn -0.4295 0.8353 -0.3433 +vn -0.3881 0.8804 -0.2725 +vn -0.3804 0.8749 -0.2998 +vn -0.3588 0.8903 -0.2803 +vn -0.3662 0.8955 -0.2531 +vn -0.4341 0.8800 -0.1925 +vn -0.4662 0.8590 -0.2119 +vn -0.4054 0.8974 -0.1740 +vn -0.4005 0.8921 -0.2094 +vn -0.4279 0.8744 -0.2289 +vn -0.4583 0.8531 -0.2494 +vn -0.3529 0.9252 -0.1397 +vn -0.3783 0.9123 -0.1565 +vn -0.3507 0.9203 -0.1734 +vn -0.3756 0.9070 -0.1907 +vn -0.3710 0.9014 -0.2232 +vn -0.3487 0.9146 -0.2049 +vn -0.3952 0.8861 -0.2423 +vn -0.4495 0.8469 -0.2841 +vn -0.4206 0.8684 -0.2625 +vn -0.3267 0.9369 -0.1245 +vn -0.3010 0.9473 -0.1099 +vn -0.3011 0.9429 -0.1422 +vn -0.3269 0.9320 -0.1567 +vn -0.2731 0.9570 -0.0980 +vn -0.2754 0.9527 -0.1286 +vn -0.2754 0.9481 -0.1592 +vn -0.3016 0.9378 -0.1723 +vn -0.3249 0.9268 -0.1882 +vn -0.6145 0.5017 -0.6089 +vn -0.5989 0.5096 -0.6177 +vn -0.6221 0.4579 -0.6350 +vn -0.6373 0.4499 -0.6256 +vn -0.5673 0.5302 -0.6301 +vn -0.5832 0.5193 -0.6246 +vn -0.5919 0.4775 -0.6493 +vn -0.6073 0.4670 -0.6427 +vn -0.6379 0.3507 -0.6857 +vn -0.6516 0.3425 -0.6768 +vn -0.6301 0.4084 -0.6604 +vn -0.6159 0.4178 -0.6679 +vn -0.6651 0.3352 -0.6673 +vn -0.6445 0.3999 -0.6516 +vn -0.6591 0.3925 -0.6415 +vn -0.6793 0.3285 -0.6562 +vn -0.5502 0.5428 -0.6346 +vn -0.5321 0.5562 -0.6384 +vn -0.5586 0.5021 -0.6602 +vn -0.5761 0.4890 -0.6549 +vn -0.5112 0.5715 -0.6419 +vn -0.5393 0.5161 -0.6654 +vn -0.5917 0.3806 -0.7107 +vn -0.5661 0.4531 -0.6886 +vn -0.6086 0.3696 -0.7021 +vn -0.5847 0.4399 -0.6816 +vn -0.6007 0.4284 -0.6750 +vn -0.6240 0.3595 -0.6938 +vn -0.6434 0.1070 -0.7580 +vn -0.6584 0.1040 -0.7454 +vn -0.6470 0.2013 -0.7355 +vn -0.6319 0.2071 -0.7469 +vn -0.6837 0.0991 -0.7230 +vn -0.6713 0.1015 -0.7342 +vn -0.6731 0.1912 -0.7144 +vn -0.6607 0.1960 -0.7247 +vn -0.6442 0.2822 -0.7109 +vn -0.6576 0.2751 -0.7014 +vn -0.6301 0.2899 -0.7204 +vn -0.6137 0.2988 -0.7308 +vn -0.6955 0.0970 -0.7119 +vn -0.7079 0.0949 -0.6999 +vn -0.6980 0.1828 -0.6924 +vn -0.6856 0.1868 -0.7036 +vn -0.7207 0.0929 -0.6870 +vn -0.7113 0.1789 -0.6797 +vn -0.6970 0.2574 -0.6693 +vn -0.6834 0.2629 -0.6810 +vn -0.6703 0.2688 -0.6917 +vn -0.3957 0.5813 0.7110 +vn -0.2866 0.5969 0.7494 +vn -0.4889 0.5644 0.6652 +vn -0.5093 0.4935 0.7051 +vn -0.4134 0.5090 0.7550 +vn -0.2999 0.5244 0.7969 +vn -0.6358 0.5341 0.5572 +vn -0.5679 0.5486 0.6136 +vn -0.6597 0.4664 0.5893 +vn -0.5908 0.4787 0.6495 +vn -0.6969 0.3212 0.6412 +vn -0.6257 0.3293 0.7072 +vn -0.6098 0.4058 0.6808 +vn -0.6803 0.3951 0.6173 +vn -0.5415 0.3398 0.7690 +vn -0.5271 0.4182 0.7398 +vn -0.3222 0.3643 0.8738 +vn -0.3119 0.4465 0.8387 +vn -0.4286 0.4325 0.7932 +vn -0.4416 0.3515 0.8255 +vn -0.6934 0.5224 0.4962 +vn -0.7431 0.5128 0.4298 +vn -0.7693 0.4485 0.4550 +vn -0.7190 0.4561 0.5245 +vn -0.8194 0.5003 0.2797 +vn -0.7847 0.5059 0.3582 +vn -0.8484 0.4379 0.2975 +vn -0.8125 0.4425 0.3795 +vn -0.8948 0.3039 0.3271 +vn -0.8562 0.3070 0.4154 +vn -0.8363 0.3763 0.3988 +vn -0.8735 0.3725 0.3133 +vn -0.8108 0.3103 0.4963 +vn -0.7921 0.3808 0.4771 +vn -0.7403 0.3871 0.5497 +vn -0.7581 0.3148 0.5711 +vn -0.8914 0.0808 0.4460 +vn -0.9322 0.0801 0.3529 +vn -0.8432 0.0813 0.5314 +vn -0.8367 0.1604 0.5237 +vn -0.8839 0.1591 0.4397 +vn -0.9245 0.1576 0.3471 +vn -0.7250 0.0832 0.6837 +vn -0.7883 0.0821 0.6098 +vn -0.7195 0.1648 0.6747 +vn -0.7820 0.1622 0.6018 +vn -0.7720 0.2399 0.5886 +vn -0.7100 0.2442 0.6605 +vn -0.8257 0.2368 0.5120 +vn -0.9118 0.2324 0.3386 +vn -0.8723 0.2345 0.4291 +vn -0.6520 0.0851 0.7535 +vn -0.5659 0.0876 0.8198 +vn -0.5610 0.1740 0.8093 +vn -0.6466 0.1686 0.7440 +vn -0.3409 0.0947 0.9353 +vn -0.4636 0.0910 0.8814 +vn -0.3369 0.1877 0.9227 +vn -0.4591 0.1803 0.8699 +vn -0.4516 0.2676 0.8511 +vn -0.3307 0.2775 0.9020 +vn -0.5529 0.2580 0.7923 +vn -0.6379 0.2503 0.7283 +vn -0.8452 0.4961 0.1987 +vn -0.8617 0.4933 0.1189 +vn -0.8930 0.4312 0.1289 +vn -0.8755 0.4341 0.2122 +vn -0.8711 0.4900 -0.0321 +vn -0.8700 0.4913 0.0420 +vn -0.9033 0.4281 -0.0293 +vn -0.9018 0.4294 0.0481 +vn -0.9549 0.2959 -0.0239 +vn -0.9530 0.2971 0.0592 +vn -0.9296 0.3646 0.0539 +vn -0.9312 0.3634 -0.0265 +vn -0.9432 0.2987 0.1456 +vn -0.9202 0.3665 0.1378 +vn -0.9019 0.3690 0.2246 +vn -0.9241 0.3011 0.2354 +vn -0.8662 0.4889 -0.1031 +vn -0.8558 0.4881 -0.1717 +vn -0.8874 0.4266 -0.1749 +vn -0.8982 0.4273 -0.1036 +vn -0.8404 0.4870 -0.2379 +vn -0.8711 0.4262 -0.2439 +vn -0.9214 0.2956 -0.2523 +vn -0.8983 0.3624 -0.2486 +vn -0.9385 0.2952 -0.1793 +vn -0.9150 0.3624 -0.1774 +vn -0.9262 0.3627 -0.1035 +vn -0.9498 0.2954 -0.1032 +vn -0.9629 0.0777 -0.2582 +vn -0.9803 0.0774 -0.1815 +vn -0.9715 0.1526 -0.1813 +vn -0.9542 0.1532 -0.2569 +vn -0.9968 0.0774 -0.0183 +vn -0.9918 0.0773 -0.1020 +vn -0.9881 0.1527 -0.0197 +vn -0.9830 0.1525 -0.1021 +vn -0.9689 0.2252 -0.1028 +vn -0.9740 0.2257 -0.0214 +vn -0.9574 0.2253 -0.1804 +vn -0.9402 0.2258 -0.2552 +vn -0.9946 0.0778 0.0689 +vn -0.9839 0.0785 0.1606 +vn -0.9754 0.1546 0.1571 +vn -0.9859 0.1535 0.0670 +vn -0.9636 0.0792 0.2552 +vn -0.9553 0.1561 0.2512 +vn -0.9421 0.2300 0.2442 +vn -0.9616 0.2281 0.1523 +vn -0.9719 0.2266 0.0634 +vn 0.2992 0.5940 0.7468 +vn 0.3529 0.5816 0.7329 +vn 0.2417 0.6041 0.7594 +vn 0.2587 0.5341 0.8049 +vn 0.3203 0.5247 0.7888 +vn 0.3784 0.5109 0.7719 +vn 0.1066 0.6153 0.7810 +vn 0.1781 0.6108 0.7715 +vn 0.1145 0.5448 0.8307 +vn 0.1910 0.5411 0.8190 +vn 0.1262 0.3858 0.9139 +vn 0.2105 0.3835 0.8992 +vn 0.2016 0.4650 0.8620 +vn 0.1212 0.4685 0.8751 +vn 0.2858 0.3777 0.8807 +vn 0.2735 0.4591 0.8453 +vn 0.4195 0.3568 0.8347 +vn 0.4005 0.4366 0.8056 +vn 0.3389 0.4492 0.8267 +vn 0.3546 0.3695 0.8589 +vn 0.0247 0.6166 0.7869 +vn -0.0681 0.6147 0.7858 +vn -0.0707 0.5430 0.8368 +vn 0.0280 0.5457 0.8375 +vn -0.1728 0.6084 0.7746 +vn -0.1806 0.5360 0.8247 +vn -0.1952 0.3747 0.9064 +vn -0.1883 0.4581 0.8687 +vn -0.0764 0.3818 0.9211 +vn -0.0734 0.4653 0.8821 +vn 0.0298 0.4685 0.8829 +vn 0.0309 0.3855 0.9222 +vn -0.2087 0.0984 0.9730 +vn -0.0838 0.1012 0.9913 +vn -0.0818 0.1992 0.9765 +vn -0.2059 0.1942 0.9591 +vn 0.1337 0.1036 0.9856 +vn 0.0311 0.1029 0.9942 +vn 0.1325 0.2029 0.9702 +vn 0.0311 0.2021 0.9789 +vn 0.0313 0.2965 0.9545 +vn 0.1299 0.2974 0.9459 +vn -0.0794 0.2929 0.9528 +vn -0.2011 0.2867 0.9367 +vn 0.2255 0.1031 0.9688 +vn 0.3076 0.1016 0.9461 +vn 0.3031 0.1987 0.9320 +vn 0.2224 0.2020 0.9538 +vn 0.4537 0.0946 0.8861 +vn 0.3827 0.0986 0.9186 +vn 0.4463 0.1857 0.8754 +vn 0.3769 0.1937 0.9058 +vn 0.3673 0.2837 0.8858 +vn 0.4350 0.2737 0.8578 +vn 0.2958 0.2913 0.9098 +vn 0.2175 0.2954 0.9303 +vn -0.5997 0.5836 -0.5475 +vn -0.6184 0.5825 -0.5275 +vn -0.5912 0.6270 -0.5073 +vn -0.5734 0.6267 -0.5277 +vn -0.6607 0.5851 -0.4703 +vn -0.6389 0.5833 -0.5016 +vn -0.6304 0.6320 -0.4508 +vn -0.6102 0.6288 -0.4820 +vn -0.5663 0.7163 -0.4078 +vn -0.5496 0.7114 -0.4380 +vn -0.5803 0.6717 -0.4604 +vn -0.5986 0.6758 -0.4301 +vn -0.5334 0.7079 -0.4630 +vn -0.5626 0.6688 -0.4859 +vn -0.5459 0.6678 -0.5060 +vn -0.5177 0.7058 -0.4835 +vn -0.6837 0.5878 -0.4324 +vn -0.7069 0.5909 -0.3887 +vn -0.6726 0.6401 -0.3714 +vn -0.6512 0.6358 -0.4142 +vn -0.7299 0.5941 -0.3381 +vn -0.6931 0.6443 -0.3233 +vn -0.6157 0.7331 -0.2890 +vn -0.6550 0.6907 -0.3064 +vn -0.5998 0.7275 -0.3332 +vn -0.6364 0.6858 -0.3532 +vn -0.6176 0.6806 -0.3941 +vn -0.5829 0.7217 -0.3732 +vn -0.5014 0.8337 -0.2313 +vn -0.4915 0.8277 -0.2707 +vn -0.5267 0.7985 -0.2917 +vn -0.5382 0.8045 -0.2511 +vn -0.4699 0.8152 -0.3386 +vn -0.4811 0.8214 -0.3063 +vn -0.5013 0.7860 -0.3617 +vn -0.5141 0.7921 -0.3289 +vn -0.5484 0.7590 -0.3511 +vn -0.5335 0.7530 -0.3852 +vn -0.5628 0.7651 -0.3129 +vn -0.5768 0.7710 -0.2701 +vn -0.4582 0.8097 -0.3668 +vn -0.4459 0.8050 -0.3914 +vn -0.4746 0.7761 -0.4154 +vn -0.4880 0.7804 -0.3908 +vn -0.4331 0.8019 -0.4116 +vn -0.4609 0.7730 -0.4360 +vn -0.4892 0.7411 -0.4598 +vn -0.5039 0.7435 -0.4396 +vn -0.5187 0.7478 -0.4145 +vn 0.1916 0.5342 0.8233 +vn 0.0000 0.5384 0.8427 +vn 0.3280 0.5237 0.7862 +vn 0.3557 0.4545 0.8166 +vn 0.2105 0.4637 0.8606 +vn -0.0000 0.4721 0.8815 +vn 0.4446 0.5245 0.7262 +vn 0.4072 0.5206 0.7504 +vn 0.4781 0.4530 0.7525 +vn 0.4406 0.4492 0.7773 +vn 0.5320 0.3049 0.7899 +vn 0.4933 0.3020 0.8157 +vn 0.4687 0.3766 0.7991 +vn 0.5079 0.3795 0.7733 +vn 0.4027 0.3075 0.8622 +vn 0.3818 0.3810 0.8420 +vn -0.0000 0.3249 0.9458 +vn -0.0000 0.3982 0.9173 +vn 0.2263 0.3930 0.8913 +vn 0.2411 0.3168 0.9173 +vn 0.4503 0.5349 0.7149 +vn 0.4336 0.5499 0.7139 +vn 0.4653 0.4782 0.7449 +vn 0.4837 0.4636 0.7424 +vn 0.4000 0.5656 0.7212 +vn 0.4288 0.4953 0.7555 +vn 0.4760 0.3424 0.8101 +vn 0.4543 0.4202 0.7855 +vn 0.5161 0.3269 0.7916 +vn 0.4930 0.4042 0.7705 +vn 0.5124 0.3895 0.7653 +vn 0.5370 0.3139 0.7830 +vn 0.5142 0.0893 0.8530 +vn 0.5573 0.0842 0.8260 +vn 0.5484 0.1668 0.8194 +vn 0.5065 0.1764 0.8440 +vn 0.5748 0.0769 0.8147 +vn 0.5785 0.0798 0.8118 +vn 0.5655 0.1534 0.8103 +vn 0.5704 0.1587 0.8059 +vn 0.5559 0.2368 0.7968 +vn 0.5520 0.2293 0.8017 +vn 0.5351 0.2480 0.8076 +vn 0.4933 0.2606 0.8299 +vn 0.5342 0.0762 0.8419 +vn 0.4411 0.0777 0.8941 +vn 0.4327 0.1552 0.8881 +vn 0.5264 0.1517 0.8366 +vn 0.0000 0.0832 0.9965 +vn 0.2661 0.0815 0.9605 +vn 0.0000 0.1662 0.9861 +vn 0.2612 0.1612 0.9517 +vn 0.2521 0.2409 0.9372 +vn 0.0000 0.2453 0.9694 +vn 0.4206 0.2312 0.8773 +vn 0.5118 0.2274 0.8284 +vn -0.0660 0.7858 -0.6149 +vn 0.0000 0.7887 -0.6148 +vn -0.1342 0.7787 -0.6129 +vn -0.1218 0.8067 -0.5783 +vn -0.0593 0.8135 -0.5786 +vn -0.0000 0.8152 -0.5791 +vn -0.2619 0.7506 -0.6066 +vn -0.2012 0.7662 -0.6103 +vn -0.2397 0.7821 -0.5751 +vn -0.1824 0.7964 -0.5767 +vn -0.1991 0.8320 -0.5177 +vn -0.1501 0.8429 -0.5167 +vn -0.1660 0.8212 -0.5459 +vn -0.2181 0.8092 -0.5455 +vn -0.0996 0.8505 -0.5164 +vn -0.1097 0.8307 -0.5458 +vn -0.0000 0.8567 -0.5158 +vn -0.0000 0.8380 -0.5457 +vn -0.0537 0.8359 -0.5462 +vn -0.0483 0.8555 -0.5156 +vn -0.3159 0.7327 -0.6028 +vn -0.3612 0.7139 -0.5999 +vn -0.3341 0.7490 -0.5721 +vn -0.2900 0.7661 -0.5735 +vn -0.3990 0.6957 -0.5974 +vn -0.3709 0.7318 -0.5718 +vn -0.3177 0.7917 -0.5218 +vn -0.3439 0.7638 -0.5463 +vn -0.2834 0.8058 -0.5200 +vn -0.3078 0.7794 -0.5458 +vn -0.2663 0.7947 -0.5454 +vn -0.2433 0.8196 -0.5187 +vn -0.2476 0.8573 -0.4514 +vn -0.2172 0.8671 -0.4483 +vn -0.2382 0.8492 -0.4714 +vn -0.2695 0.8381 -0.4744 +vn -0.1484 0.8846 -0.4421 +vn -0.1845 0.8762 -0.4451 +vn -0.1643 0.8692 -0.4663 +vn -0.2024 0.8599 -0.4686 +vn -0.2226 0.8410 -0.4932 +vn -0.1805 0.8521 -0.4912 +vn -0.2597 0.8289 -0.4954 +vn -0.2932 0.8164 -0.4976 +vn -0.1114 0.8911 -0.4399 +vn -0.0729 0.8961 -0.4378 +vn -0.0812 0.8828 -0.4627 +vn -0.1229 0.8773 -0.4640 +vn 0.0000 0.8998 -0.4363 +vn -0.0356 0.8988 -0.4370 +vn -0.0000 0.8872 -0.4613 +vn -0.0394 0.8863 -0.4614 +vn -0.0438 0.8718 -0.4880 +vn -0.0000 0.8732 -0.4873 +vn -0.0896 0.8680 -0.4884 +vn -0.1364 0.8611 -0.4899 +vn 0.3937 0.8258 -0.4038 +vn 0.4199 0.8003 -0.4280 +vn 0.4059 0.8009 -0.4402 +vn 0.3805 0.8256 -0.4167 +vn 0.4469 0.7721 -0.4519 +vn 0.4325 0.7730 -0.4641 +vn 0.4170 0.7764 -0.4726 +vn 0.3910 0.8032 -0.4494 +vn 0.3660 0.8275 -0.4258 +vn 0.5024 0.7062 -0.4990 +vn 0.4870 0.7086 -0.5106 +vn 0.4595 0.7425 -0.4874 +vn 0.4746 0.7405 -0.4759 +vn 0.4708 0.7138 -0.5185 +vn 0.4438 0.7464 -0.4959 +vn 0.4356 0.7300 -0.5266 +vn 0.4090 0.7606 -0.5042 +vn 0.4269 0.7528 -0.5011 +vn 0.4538 0.7208 -0.5239 +vn 0.3828 0.7886 -0.4813 +vn 0.4005 0.7815 -0.4784 +vn 0.3335 0.8360 -0.4357 +vn 0.3504 0.8309 -0.4323 +vn 0.3749 0.8077 -0.4551 +vn 0.3576 0.8135 -0.4587 +vn 0.5300 0.6686 -0.5216 +vn 0.5142 0.6723 -0.5325 +vn 0.5569 0.6288 -0.5427 +vn 0.5409 0.6330 -0.5538 +vn 0.5246 0.6399 -0.5615 +vn 0.4979 0.6781 -0.5406 +vn 0.6072 0.5424 -0.5807 +vn 0.5911 0.5482 -0.5918 +vn 0.5666 0.5917 -0.5734 +vn 0.5828 0.5864 -0.5627 +vn 0.5751 0.5562 -0.6000 +vn 0.5505 0.5990 -0.5815 +vn 0.5420 0.5772 -0.6108 +vn 0.5164 0.6196 -0.5911 +vn 0.5337 0.6086 -0.5871 +vn 0.5590 0.5657 -0.6063 +vn 0.4897 0.6596 -0.5702 +vn 0.5077 0.6486 -0.5670 +vn 0.4808 0.6863 -0.5457 +vn 0.4628 0.6961 -0.5489 +vn 0.4583 0.6362 -0.6207 +vn 0.4299 0.6779 -0.5963 +vn 0.4553 0.6619 -0.5954 +vn 0.4835 0.6192 -0.6187 +vn 0.4016 0.7155 -0.5716 +vn 0.4275 0.6998 -0.5723 +vn 0.4501 0.6854 -0.5724 +vn 0.4778 0.6464 -0.5948 +vn 0.5048 0.6041 -0.6166 +vn 0.3474 0.7780 -0.5236 +vn 0.3728 0.7646 -0.5258 +vn 0.3998 0.7342 -0.5488 +vn 0.3740 0.7484 -0.5477 +vn 0.3955 0.7522 -0.5271 +vn 0.4227 0.7203 -0.5500 +vn 0.4434 0.7078 -0.5499 +vn 0.4164 0.7403 -0.5277 +vn 0.4708 0.6716 -0.5721 +vn 0.5244 0.5898 -0.6142 +vn 0.4977 0.6326 -0.5934 +vn 0.3217 0.8039 -0.5003 +vn 0.3467 0.7920 -0.5025 +vn 0.2974 0.8270 -0.4771 +vn 0.3216 0.8163 -0.4799 +vn 0.3436 0.8063 -0.4816 +vn 0.3691 0.7805 -0.5045 +vn 0.2523 0.8657 -0.4324 +vn 0.2751 0.8572 -0.4353 +vn 0.2978 0.8380 -0.4572 +vn 0.2740 0.8474 -0.4547 +vn 0.2960 0.8494 -0.4368 +vn 0.3192 0.8290 -0.4593 +vn 0.3390 0.8209 -0.4596 +vn 0.3154 0.8421 -0.4374 +vn 0.3639 0.7968 -0.4825 +vn 0.3897 0.7702 -0.5049 +vn 0.4856 0.8685 0.0995 +vn 0.4645 0.8786 0.1113 +vn 0.4890 0.8608 0.1408 +vn 0.5092 0.8534 0.1118 +vn 0.4349 0.8910 0.1300 +vn 0.4576 0.8736 0.1656 +vn 0.4903 0.8476 0.2028 +vn 0.5228 0.8354 0.1693 +vn 0.5467 0.8269 0.1318 +vn 0.3647 0.9164 0.1650 +vn 0.3835 0.8993 0.2102 +vn 0.4234 0.8860 0.1889 +vn 0.4013 0.9041 0.1470 +vn 0.4093 0.8752 0.2578 +vn 0.4518 0.8615 0.2318 +vn 0.4736 0.8069 0.3531 +vn 0.5229 0.7910 0.3175 +vn 0.4861 0.8295 0.2751 +vn 0.4396 0.8444 0.3061 +vn 0.5660 0.7770 0.2754 +vn 0.5267 0.8157 0.2392 +vn 0.6292 0.7572 0.1754 +vn 0.5862 0.7957 0.1525 +vn 0.5605 0.8041 0.1982 +vn 0.6016 0.7656 0.2279 +vn 0.3247 0.9283 0.1810 +vn 0.3409 0.9116 0.2295 +vn 0.2841 0.9385 0.1961 +vn 0.2954 0.9231 0.2461 +vn 0.3125 0.9015 0.2995 +vn 0.3620 0.8890 0.2802 +vn 0.1916 0.9561 0.2215 +vn 0.1926 0.9421 0.2745 +vn 0.2470 0.9331 0.2613 +vn 0.2401 0.9479 0.2092 +vn 0.1972 0.9226 0.3315 +vn 0.2576 0.9130 0.3163 +vn 0.2153 0.8650 0.4532 +vn 0.2903 0.8532 0.4334 +vn 0.2728 0.8863 0.3742 +vn 0.2045 0.8973 0.3912 +vn 0.3580 0.8388 0.4103 +vn 0.3331 0.8737 0.3545 +vn 0.3889 0.8593 0.3321 +vn 0.4183 0.8232 0.3839 +vn 0.2723 0.6640 0.6964 +vn 0.3761 0.6484 0.6619 +vn 0.3546 0.7100 0.6084 +vn 0.2570 0.7249 0.6391 +vn 0.4652 0.6314 0.6205 +vn 0.4393 0.6928 0.5718 +vn 0.4120 0.7483 0.5199 +vn 0.3324 0.7649 0.5518 +vn 0.2422 0.7789 0.5785 +vn 0.6077 0.5988 0.5216 +vn 0.5769 0.6587 0.4829 +vn 0.5128 0.6755 0.5298 +vn 0.5421 0.6142 0.5735 +vn 0.5433 0.7139 0.4419 +vn 0.4819 0.7308 0.4834 +vn 0.4501 0.7802 0.4344 +vn 0.5086 0.7631 0.3987 +vn 0.3842 0.7971 0.4658 +vn 0.2276 0.8258 0.5160 +vn 0.3110 0.8126 0.4930 +vn 0.6647 0.5851 0.4645 +vn 0.6319 0.6443 0.4309 +vn 0.7126 0.5745 0.4026 +vn 0.6794 0.6318 0.3732 +vn 0.6433 0.6846 0.3427 +vn 0.5973 0.6979 0.3952 +vn 0.7864 0.5599 0.2607 +vn 0.7507 0.6153 0.2404 +vn 0.7186 0.6225 0.3100 +vn 0.7535 0.5660 0.3345 +vn 0.7127 0.6662 0.2199 +vn 0.6821 0.6738 0.2841 +vn 0.6429 0.7215 0.2571 +vn 0.6725 0.7131 0.1981 +vn 0.6057 0.7327 0.3104 +vn 0.5605 0.7471 0.3574 +vn 0.2315 0.8818 -0.4109 +vn 0.2538 0.8745 -0.4133 +vn 0.2122 0.8964 -0.3892 +vn 0.2336 0.8898 -0.3919 +vn 0.2535 0.8838 -0.3933 +vn 0.2742 0.8675 -0.4151 +vn 0.1770 0.9210 -0.3470 +vn 0.1968 0.9161 -0.3493 +vn 0.2147 0.9037 -0.3704 +vn 0.1938 0.9094 -0.3681 +vn 0.2156 0.9114 -0.3506 +vn 0.2339 0.8982 -0.3721 +vn 0.2506 0.9027 -0.3498 +vn 0.2698 0.8886 -0.3710 +vn 0.2522 0.8933 -0.3721 +vn 0.2335 0.9068 -0.3511 +vn 0.2897 0.8732 -0.3920 +vn 0.2722 0.8780 -0.3937 +vn 0.2931 0.8613 -0.4151 +vn 0.3110 0.8557 -0.4137 +vn 0.1613 0.9314 -0.3264 +vn 0.1807 0.9272 -0.3282 +vn 0.1478 0.9405 -0.3059 +vn 0.1659 0.9370 -0.3075 +vn 0.1833 0.9335 -0.3083 +vn 0.1985 0.9230 -0.3295 +vn 0.1260 0.9556 -0.2663 +vn 0.1426 0.9532 -0.2667 +vn 0.1534 0.9456 -0.2869 +vn 0.1356 0.9486 -0.2859 +vn 0.1588 0.9506 -0.2667 +vn 0.1697 0.9427 -0.2874 +vn 0.1910 0.9450 -0.2655 +vn 0.2024 0.9365 -0.2863 +vn 0.1861 0.9396 -0.2872 +vn 0.1744 0.9480 -0.2662 +vn 0.2165 0.9266 -0.3074 +vn 0.1998 0.9300 -0.3085 +vn 0.2159 0.9191 -0.3297 +vn 0.2328 0.9153 -0.3288 +vn 0.2476 0.9333 -0.2600 +vn 0.2589 0.9274 -0.2699 +vn 0.2478 0.9282 -0.2775 +vn 0.2377 0.9356 -0.2611 +vn 0.2744 0.9182 -0.2856 +vn 0.2632 0.9185 -0.2950 +vn 0.2482 0.9207 -0.3012 +vn 0.2335 0.9307 -0.2815 +vn 0.2225 0.9388 -0.2629 +vn 0.3096 0.8952 -0.3207 +vn 0.2976 0.8949 -0.3326 +vn 0.2792 0.9077 -0.3133 +vn 0.2917 0.9075 -0.3022 +vn 0.2830 0.8964 -0.3412 +vn 0.2652 0.9092 -0.3210 +vn 0.2492 0.9119 -0.3259 +vn 0.2675 0.8989 -0.3469 +vn 0.2328 0.9234 -0.3051 +vn 0.2072 0.9419 -0.2642 +vn 0.2185 0.9335 -0.2844 +vn 0.3293 0.8808 -0.3402 +vn 0.3163 0.8807 -0.3525 +vn 0.3486 0.8654 -0.3600 +vn 0.3362 0.8649 -0.3728 +vn 0.3217 0.8664 -0.3820 +vn 0.3023 0.8819 -0.3617 +vn 0.3569 0.8471 -0.3938 +vn 0.3700 0.8473 -0.3811 +vn 0.3430 0.8483 -0.4034 +vn 0.3274 0.8514 -0.4097 +vn 0.3065 0.8690 -0.3885 +vn 0.2863 0.8849 -0.3675 +vn 0.0808 0.9960 -0.0372 +vn 0.0734 0.9973 0.0009 +vn 0.0845 0.9964 0.0016 +vn 0.0932 0.9950 -0.0353 +vn 0.0637 0.9973 0.0376 +vn 0.0747 0.9965 0.0375 +vn 0.0878 0.9955 0.0360 +vn 0.0986 0.9951 0.0017 +vn 0.1069 0.9937 -0.0344 +vn 0.0374 0.9932 0.1105 +vn 0.0476 0.9930 0.1079 +vn 0.0621 0.9954 0.0724 +vn 0.0523 0.9959 0.0742 +vn 0.0607 0.9927 0.1041 +vn 0.0757 0.9947 0.0701 +vn 0.0977 0.9907 0.0947 +vn 0.1117 0.9918 0.0627 +vn 0.0918 0.9936 0.0666 +vn 0.0779 0.9919 0.1000 +vn 0.1231 0.9919 0.0306 +vn 0.1044 0.9940 0.0340 +vn 0.1415 0.9893 -0.0355 +vn 0.1234 0.9918 -0.0343 +vn 0.1144 0.9934 0.0005 +vn 0.1335 0.9910 -0.0015 +vn 0.0200 0.9887 0.1484 +vn 0.0297 0.9891 0.1441 +vn -0.0016 0.9822 0.1878 +vn 0.0097 0.9831 0.1827 +vn 0.0242 0.9839 0.1770 +vn 0.0440 0.9892 0.1396 +vn -0.0552 0.9593 0.2769 +vn -0.0402 0.9619 0.2705 +vn -0.0141 0.9744 0.2242 +vn -0.0260 0.9728 0.2303 +vn -0.0216 0.9641 0.2646 +vn 0.0028 0.9759 0.2183 +vn 0.0296 0.9670 0.2532 +vn 0.0484 0.9773 0.2061 +vn 0.0232 0.9769 0.2122 +vn 0.0019 0.9659 0.2589 +vn 0.0659 0.9841 0.1652 +vn 0.0434 0.9842 0.1714 +vn 0.0612 0.9891 0.1343 +vn 0.0829 0.9882 0.1287 +vn 0.1942 0.9654 0.1741 +vn 0.1502 0.9714 0.1839 +vn 0.1430 0.9622 0.2316 +vn 0.1991 0.9708 0.1339 +vn 0.1596 0.9768 0.1431 +vn 0.1238 0.9807 0.1513 +vn 0.1117 0.9750 0.1922 +vn 0.0999 0.9656 0.2400 +vn 0.2139 0.9746 0.0662 +vn 0.1799 0.9808 0.0750 +vn 0.1692 0.9797 0.1073 +vn 0.2065 0.9735 0.0985 +vn 0.1486 0.9855 0.0824 +vn 0.1368 0.9839 0.1153 +vn 0.1075 0.9867 0.1222 +vn 0.1218 0.9885 0.0891 +vn 0.0931 0.9829 0.1586 +vn 0.0622 0.9670 0.2470 +vn 0.0775 0.9768 0.1995 +vn 0.2224 0.9743 0.0362 +vn 0.1892 0.9809 0.0442 +vn 0.2294 0.9733 0.0063 +vn 0.1988 0.9799 0.0147 +vn 0.1702 0.9852 0.0210 +vn 0.1604 0.9857 0.0516 +vn 0.2412 0.9689 -0.0555 +vn 0.2129 0.9759 -0.0472 +vn 0.2061 0.9784 -0.0159 +vn 0.2366 0.9713 -0.0233 +vn 0.1861 0.9816 -0.0418 +vn 0.1794 0.9837 -0.0094 +vn 0.1546 0.9880 -0.0050 +vn 0.1629 0.9859 -0.0377 +vn 0.1455 0.9890 0.0266 +vn 0.1340 0.9893 0.0574 +vn 0.4733 0.8641 -0.1714 +vn 0.4778 0.8686 -0.1316 +vn 0.5165 0.8436 -0.1468 +vn 0.5099 0.8391 -0.1892 +vn 0.4804 0.8719 -0.0944 +vn 0.5201 0.8473 -0.1077 +vn 0.5631 0.8177 -0.1193 +vn 0.5570 0.8146 -0.1619 +vn 0.5490 0.8099 -0.2064 +vn 0.4827 0.8755 -0.0235 +vn 0.5245 0.8508 -0.0318 +vn 0.5232 0.8494 -0.0695 +vn 0.4812 0.8746 -0.0594 +vn 0.5703 0.8206 -0.0367 +vn 0.5671 0.8199 -0.0787 +vn 0.6638 0.7468 -0.0405 +vn 0.6590 0.7466 -0.0909 +vn 0.6132 0.7853 -0.0852 +vn 0.6169 0.7860 -0.0401 +vn 0.6522 0.7450 -0.1397 +vn 0.6070 0.7839 -0.1305 +vn 0.6308 0.7380 -0.2396 +vn 0.5893 0.7763 -0.2236 +vn 0.5997 0.7807 -0.1758 +vn 0.6427 0.7424 -0.1893 +vn 0.4827 0.8757 0.0108 +vn 0.5254 0.8509 0.0067 +vn 0.4842 0.8738 0.0447 +vn 0.5239 0.8507 0.0428 +vn 0.5687 0.8212 0.0479 +vn 0.5704 0.8213 0.0049 +vn 0.5208 0.8499 0.0801 +vn 0.4837 0.8719 0.0762 +vn 0.5616 0.8225 0.0906 +vn 0.6488 0.7514 0.1201 +vn 0.6040 0.7901 0.1046 +vn 0.6602 0.7483 0.0653 +vn 0.6140 0.7874 0.0552 +vn 0.6178 0.7863 0.0073 +vn 0.6646 0.7471 0.0110 +vn 0.8111 0.5553 0.1837 +vn 0.7738 0.6106 0.1685 +vn 0.8265 0.5524 0.1086 +vn 0.7882 0.6076 0.0976 +vn 0.7479 0.6582 0.0868 +vn 0.7347 0.6610 0.1526 +vn 0.8351 0.5490 -0.0345 +vn 0.7956 0.6047 -0.0369 +vn 0.7951 0.6058 0.0292 +vn 0.8341 0.5505 0.0355 +vn 0.7536 0.6562 -0.0387 +vn 0.7536 0.6569 0.0226 +vn 0.7102 0.7038 0.0167 +vn 0.7094 0.7037 -0.0403 +vn 0.7053 0.7048 0.0756 +vn 0.6932 0.7077 0.1368 +vn 0.8303 0.5479 -0.1022 +vn 0.7910 0.6035 -0.1003 +vn 0.8206 0.5465 -0.1672 +vn 0.7818 0.6020 -0.1622 +vn 0.7404 0.6539 -0.1556 +vn 0.7488 0.6555 -0.0981 +vn 0.7870 0.5430 -0.2929 +vn 0.7509 0.5972 -0.2820 +vn 0.7686 0.5999 -0.2222 +vn 0.8060 0.5450 -0.2309 +vn 0.7124 0.6481 -0.2690 +vn 0.7282 0.6516 -0.2127 +vn 0.6861 0.6991 -0.2013 +vn 0.6719 0.6953 -0.2552 +vn 0.6967 0.7019 -0.1484 +vn 0.7047 0.7031 -0.0947 +vn 0.1383 0.9483 0.2855 +vn 0.0899 0.9516 0.2938 +vn 0.0818 0.9326 0.3516 +vn 0.1360 0.9294 0.3431 +vn 0.0109 0.9521 0.3057 +vn 0.0476 0.9526 0.3004 +vn -0.0073 0.9322 0.3619 +vn 0.0341 0.9333 0.3574 +vn -0.0416 0.8748 0.4827 +vn 0.0106 0.8769 0.4806 +vn 0.0219 0.9082 0.4179 +vn -0.0249 0.9067 0.4210 +vn 0.0709 0.8764 0.4763 +vn 0.0753 0.9078 0.4125 +vn 0.1365 0.9044 0.4043 +vn 0.1388 0.8730 0.4675 +vn -0.0205 0.9503 0.3106 +vn -0.0470 0.9478 0.3154 +vn -0.0734 0.9264 0.3694 +vn -0.0428 0.9298 0.3655 +vn -0.0865 0.9411 0.3269 +vn -0.0692 0.9446 0.3209 +vn -0.1207 0.9175 0.3790 +vn -0.0989 0.9223 0.3735 +vn -0.1913 0.8525 0.4864 +vn -0.1608 0.8601 0.4841 +vn -0.1300 0.8942 0.4284 +vn -0.1553 0.8883 0.4321 +vn -0.1265 0.8661 0.4836 +vn -0.0999 0.8995 0.4254 +vn -0.0652 0.9036 0.4234 +vn -0.0870 0.8712 0.4831 +vn -0.3250 0.6464 0.6903 +vn -0.2755 0.6589 0.7000 +vn -0.2496 0.7179 0.6499 +vn -0.2941 0.7073 0.6429 +vn -0.2224 0.6679 0.7103 +vn -0.2010 0.7269 0.6567 +vn -0.1775 0.7797 0.6005 +vn -0.2213 0.7719 0.5960 +vn -0.2614 0.7617 0.5929 +vn -0.0967 0.6795 0.7273 +vn -0.0853 0.7382 0.6692 +vn -0.1467 0.7334 0.6638 +vn -0.1636 0.6751 0.7194 +vn -0.0720 0.7905 0.6082 +vn -0.1283 0.7861 0.6046 +vn -0.1081 0.8320 0.5442 +vn -0.0575 0.8363 0.5453 +vn -0.1525 0.8264 0.5420 +vn -0.2265 0.8107 0.5399 +vn -0.1917 0.8191 0.5407 +vn -0.0206 0.6817 0.7314 +vn -0.0146 0.7404 0.6720 +vn 0.0667 0.6803 0.7299 +vn 0.0657 0.7398 0.6696 +vn 0.0663 0.7925 0.6063 +vn -0.0077 0.7930 0.6091 +vn 0.1570 0.7349 0.6597 +vn 0.1646 0.6749 0.7194 +vn 0.1495 0.7884 0.5967 +vn 0.1437 0.8343 0.5323 +vn 0.0676 0.8382 0.5411 +vn 0.0010 0.8384 0.5450 +vn 0.2379 0.9575 0.1631 +vn 0.2779 0.9487 0.1507 +vn 0.2764 0.9545 0.1119 +vn 0.2397 0.9630 0.1233 +vn 0.3524 0.9277 0.1233 +vn 0.3154 0.9389 0.1378 +vn 0.3462 0.9341 0.0869 +vn 0.3115 0.9450 0.0994 +vn 0.3449 0.9384 0.0219 +vn 0.3140 0.9488 0.0341 +vn 0.3113 0.9480 0.0655 +vn 0.3441 0.9374 0.0531 +vn 0.2821 0.9583 0.0457 +vn 0.2785 0.9573 0.0773 +vn 0.2435 0.9659 0.0883 +vn 0.2495 0.9667 0.0566 +vn 0.3879 0.9152 0.1094 +vn 0.4205 0.9023 0.0948 +vn 0.4137 0.9083 0.0620 +vn 0.3801 0.9220 0.0737 +vn 0.4539 0.8871 0.0836 +vn 0.4472 0.8930 0.0510 +vn 0.4438 0.8960 -0.0138 +vn 0.4456 0.8950 0.0194 +vn 0.4093 0.9124 -0.0023 +vn 0.4101 0.9116 0.0295 +vn 0.3770 0.9253 0.0412 +vn 0.3763 0.9264 0.0096 +vn 0.4396 0.8850 -0.1537 +vn 0.4429 0.8891 -0.1156 +vn 0.4091 0.9022 -0.1367 +vn 0.4110 0.9061 -0.1001 +vn 0.4107 0.9094 -0.0665 +vn 0.4436 0.8926 -0.0806 +vn 0.3534 0.9296 -0.1049 +vn 0.3532 0.9329 -0.0704 +vn 0.3813 0.9205 -0.0851 +vn 0.3810 0.9167 -0.1202 +vn 0.3504 0.9358 -0.0390 +vn 0.3800 0.9235 -0.0524 +vn 0.3778 0.9256 -0.0214 +vn 0.3476 0.9376 -0.0084 +vn 0.4094 0.9117 -0.0344 +vn 0.4439 0.8949 -0.0470 +vn 0.3270 0.9407 -0.0901 +vn 0.3247 0.9441 -0.0571 +vn 0.2989 0.9511 -0.0772 +vn 0.2966 0.9540 -0.0443 +vn 0.2918 0.9564 -0.0141 +vn 0.3218 0.9465 -0.0258 +vn 0.2666 0.9632 -0.0335 +vn 0.2712 0.9603 -0.0650 +vn 0.2619 0.9651 -0.0029 +vn 0.2552 0.9665 0.0263 +vn 0.2874 0.9577 0.0158 +vn 0.3174 0.9483 0.0039 +vn 0.7351 0.0907 -0.6719 +vn 0.7518 0.0886 -0.6534 +vn 0.7257 0.1749 -0.6654 +vn 0.7429 0.1712 -0.6472 +vn 0.7636 0.1677 -0.6236 +vn 0.7726 0.0866 -0.6290 +vn 0.6945 0.3223 -0.6433 +vn 0.7121 0.3169 -0.6265 +vn 0.7291 0.2473 -0.6381 +vn 0.7119 0.2521 -0.6555 +vn 0.7330 0.3120 -0.6044 +vn 0.7501 0.2429 -0.6151 +vn 0.7842 0.3042 -0.5408 +vn 0.8015 0.2352 -0.5497 +vn 0.7744 0.2388 -0.5859 +vn 0.7573 0.3078 -0.5760 +vn 0.8149 0.1614 -0.5566 +vn 0.7879 0.1644 -0.5935 +vn 0.7966 0.0847 -0.5986 +vn 0.8238 0.0829 -0.5608 +vn 0.6747 0.3858 -0.6293 +vn 0.6924 0.3802 -0.6132 +vn 0.6531 0.4433 -0.6140 +vn 0.6708 0.4378 -0.5985 +vn 0.6916 0.4337 -0.5776 +vn 0.7133 0.3755 -0.5918 +vn 0.6245 0.5383 -0.5659 +vn 0.6481 0.4904 -0.5826 +vn 0.6305 0.4951 -0.5978 +vn 0.6441 0.5362 -0.5455 +vn 0.6683 0.4870 -0.5623 +vn 0.6893 0.5359 -0.4875 +vn 0.7158 0.4839 -0.5034 +vn 0.6911 0.4850 -0.5359 +vn 0.6657 0.5355 -0.5198 +vn 0.7409 0.4282 -0.5174 +vn 0.7150 0.4305 -0.5509 +vn 0.7373 0.3716 -0.5642 +vn 0.7638 0.3684 -0.5300 +vn 0.8199 0.4859 -0.3027 +vn 0.7956 0.4848 -0.3633 +vn 0.7640 0.5410 -0.3517 +vn 0.8499 0.4256 -0.3108 +vn 0.8242 0.4256 -0.3735 +vn 0.7966 0.4259 -0.4289 +vn 0.7691 0.4841 -0.4173 +vn 0.7393 0.5389 -0.4037 +vn 0.8990 0.2956 -0.3231 +vn 0.8720 0.2969 -0.3891 +vn 0.8499 0.3629 -0.3820 +vn 0.8763 0.3622 -0.3176 +vn 0.8429 0.2987 -0.4476 +vn 0.8213 0.3642 -0.4392 +vn 0.7922 0.3660 -0.4884 +vn 0.8131 0.3012 -0.4982 +vn 0.7683 0.4268 -0.4770 +vn 0.7139 0.5372 -0.4492 +vn 0.7423 0.4837 -0.4638 +vn 0.9175 0.2259 -0.3273 +vn 0.8902 0.2274 -0.3947 +vn 0.9313 0.1532 -0.3304 +vn 0.9040 0.1546 -0.3986 +vn 0.8743 0.1564 -0.4594 +vn 0.8608 0.2294 -0.4544 +vn 0.9126 0.0786 -0.4012 +vn 0.9401 0.0778 -0.3319 +vn 0.8831 0.0798 -0.4623 +vn 0.8528 0.0812 -0.5158 +vn 0.8442 0.1587 -0.5119 +vn 0.8307 0.2320 -0.5061 +vn -0.0657 0.9566 0.2838 +vn -0.1006 0.9372 0.3341 +vn -0.0738 0.9539 0.2911 +vn -0.1094 0.9332 0.3423 +vn -0.1491 0.9068 0.3942 +vn -0.1372 0.9124 0.3856 +vn -0.0753 0.9488 0.3067 +vn -0.1097 0.9259 0.3616 +vn -0.1134 0.9293 0.3515 +vn -0.0768 0.9512 0.2989 +vn -0.1483 0.8971 0.4161 +vn -0.1531 0.9017 0.4045 +vn -0.2334 0.8204 0.5219 +vn -0.2401 0.8273 0.5078 +vn -0.1960 0.8677 0.4569 +vn -0.1898 0.8620 0.4701 +vn -0.2335 0.8355 0.4974 +vn -0.1903 0.8745 0.4461 +vn -0.1765 0.8814 0.4381 +vn -0.2160 0.8445 0.4901 +vn -0.0670 0.9469 0.3146 +vn -0.0976 0.9233 0.3714 +vn -0.0518 0.9457 0.3208 +vn -0.0754 0.9215 0.3809 +vn -0.1018 0.8922 0.4399 +vn -0.1320 0.8937 0.4288 +vn -0.0424 0.9212 0.3867 +vn -0.0293 0.9449 0.3260 +vn -0.0578 0.8914 0.4496 +vn -0.0930 0.8153 0.5715 +vn -0.0742 0.8570 0.5100 +vn -0.1626 0.8150 0.5561 +vn -0.1316 0.8562 0.4996 +vn -0.1692 0.8583 0.4845 +vn -0.2092 0.8159 0.5390 +vn -0.1730 0.5980 0.7826 +vn -0.1521 0.6609 0.7349 +vn -0.2961 0.5917 0.7498 +vn -0.2642 0.6541 0.7088 +vn -0.2295 0.7138 0.6617 +vn -0.1325 0.7165 0.6848 +vn -0.4065 0.5932 0.6949 +vn -0.3658 0.6580 0.6582 +vn -0.3320 0.6534 0.6803 +vn -0.3715 0.5885 0.7181 +vn -0.3224 0.7180 0.6169 +vn -0.2918 0.7130 0.6376 +vn -0.2499 0.7678 0.5900 +vn -0.2781 0.7723 0.5712 +vn -0.1964 0.7665 0.6114 +vn -0.1117 0.7698 0.6285 +vn -0.4131 0.6036 0.6819 +vn -0.3727 0.6676 0.6445 +vn -0.3984 0.6171 0.6786 +vn -0.3598 0.6807 0.6381 +vn -0.3192 0.7381 0.5943 +vn -0.3297 0.7270 0.6023 +vn -0.3327 0.6939 0.6386 +vn -0.3675 0.6326 0.6817 +vn -0.2950 0.7506 0.5912 +vn -0.2563 0.8005 0.5419 +vn -0.2764 0.7903 0.5468 +vn -0.2853 0.7802 0.5567 +vn 0.2265 0.8743 -0.4293 +vn 0.2072 0.8894 -0.4075 +vn 0.1984 0.8828 -0.4258 +vn 0.1799 0.8969 -0.4039 +vn 0.1634 0.9094 -0.3825 +vn 0.1885 0.9030 -0.3861 +vn 0.1345 0.8978 -0.4193 +vn 0.1208 0.9099 -0.3969 +vn 0.1514 0.9037 -0.4004 +vn 0.1670 0.8909 -0.4224 +vn 0.1088 0.9204 -0.3757 +vn 0.1362 0.9154 -0.3788 +vn 0.0871 0.9382 -0.3350 +vn 0.1099 0.9348 -0.3378 +vn 0.1228 0.9256 -0.3581 +vn 0.0971 0.9299 -0.3548 +vn 0.1332 0.9306 -0.3410 +vn 0.1473 0.9207 -0.3615 +vn 0.1715 0.9151 -0.3649 +vn 0.1554 0.9260 -0.3442 +vn 0.1000 0.9037 -0.4164 +vn 0.0901 0.9145 -0.3943 +vn 0.0658 0.9076 -0.4147 +vn 0.0588 0.9181 -0.3920 +vn 0.0528 0.9272 -0.3708 +vn 0.0804 0.9245 -0.3727 +vn 0.0287 0.9200 -0.3909 +vn 0.0319 0.9101 -0.4131 +vn 0.0256 0.9290 -0.3693 +vn 0.0203 0.9439 -0.3295 +vn 0.0229 0.9368 -0.3491 +vn 0.0419 0.9428 -0.3308 +vn 0.0469 0.9355 -0.3501 +vn 0.0720 0.9331 -0.3523 +vn 0.0640 0.9410 -0.3324 +vn 0.0132 0.9653 -0.2609 +vn 0.0146 0.9608 -0.2769 +vn 0.0274 0.9649 -0.2613 +vn 0.0299 0.9603 -0.2774 +vn 0.0334 0.9551 -0.2944 +vn 0.0161 0.9558 -0.2935 +vn 0.0581 0.9632 -0.2626 +vn 0.0632 0.9581 -0.2795 +vn 0.0464 0.9594 -0.2784 +vn 0.0422 0.9642 -0.2618 +vn 0.0701 0.9522 -0.2973 +vn 0.0512 0.9540 -0.2955 +vn 0.0573 0.9478 -0.3137 +vn 0.0777 0.9457 -0.3157 +vn 0.0372 0.9494 -0.3120 +vn 0.0181 0.9502 -0.3112 +vn 0.0742 0.9618 -0.2635 +vn 0.0811 0.9562 -0.2811 +vn 0.0913 0.9600 -0.2645 +vn 0.0989 0.9541 -0.2827 +vn 0.1089 0.9472 -0.3017 +vn 0.0890 0.9500 -0.2993 +vn 0.1175 0.9515 -0.2845 +vn 0.1083 0.9580 -0.2655 +vn 0.1282 0.9440 -0.3039 +vn 0.1412 0.9355 -0.3238 +vn 0.1200 0.9394 -0.3210 +vn 0.0991 0.9428 -0.3183 +vn 0.0700 0.9968 -0.0397 +vn 0.0631 0.9980 -0.0009 +vn 0.0592 0.9973 -0.0428 +vn 0.0538 0.9985 -0.0033 +vn 0.0460 0.9983 0.0355 +vn 0.0549 0.9978 0.0371 +vn 0.0389 0.9980 -0.0494 +vn 0.0354 0.9993 -0.0092 +vn 0.0442 0.9990 -0.0061 +vn 0.0491 0.9977 -0.0462 +vn 0.0299 0.9991 0.0314 +vn 0.0381 0.9987 0.0336 +vn 0.0116 0.9933 0.1148 +vn 0.0171 0.9933 0.1147 +vn 0.0289 0.9969 0.0737 +vn 0.0226 0.9971 0.0725 +vn 0.0227 0.9932 0.1139 +vn 0.0363 0.9966 0.0745 +vn 0.0437 0.9963 0.0746 +vn 0.0300 0.9932 0.1128 +vn 0.0291 0.9982 -0.0526 +vn 0.0262 0.9996 -0.0119 +vn 0.0191 0.9983 -0.0549 +vn 0.0175 0.9997 -0.0145 +vn 0.0146 0.9995 0.0272 +vn 0.0225 0.9993 0.0291 +vn 0.0086 0.9998 -0.0159 +vn 0.0095 0.9983 -0.0570 +vn 0.0073 0.9996 0.0256 +vn 0.0017 0.9935 0.1141 +vn 0.0050 0.9976 0.0690 +vn 0.0040 0.9934 0.1144 +vn 0.0106 0.9975 0.0699 +vn 0.0161 0.9973 0.0712 +vn 0.0077 0.9934 0.1147 +vn -0.0183 0.9636 0.2666 +vn -0.0322 0.9640 0.2641 +vn -0.0168 0.9774 0.2107 +vn -0.0097 0.9771 0.2126 +vn -0.0454 0.9661 0.2543 +vn -0.0414 0.9649 0.2594 +vn -0.0218 0.9785 0.2050 +vn -0.0205 0.9778 0.2084 +vn -0.0047 0.9871 0.1602 +vn -0.0025 0.9873 0.1589 +vn -0.0046 0.9869 0.1613 +vn -0.0032 0.9868 0.1617 +vn -0.0459 0.9676 0.2483 +vn -0.0417 0.9693 0.2424 +vn -0.0159 0.9803 0.1971 +vn -0.0196 0.9793 0.2014 +vn -0.0355 0.9710 0.2363 +vn -0.0091 0.9812 0.1928 +vn 0.0120 0.9884 0.1517 +vn 0.0060 0.9879 0.1547 +vn 0.0006 0.9876 0.1569 +vn 0.6011 0.1147 -0.7909 +vn 0.6257 0.1104 -0.7722 +vn 0.5668 0.1197 -0.8151 +vn 0.5528 0.2325 -0.8002 +vn 0.5883 0.2224 -0.7774 +vn 0.6130 0.2142 -0.7605 +vn 0.4524 0.1323 -0.8819 +vn 0.5181 0.1257 -0.8460 +vn 0.4384 0.2564 -0.8614 +vn 0.5046 0.2437 -0.8282 +vn 0.3936 0.4637 -0.7938 +vn 0.4580 0.4436 -0.7704 +vn 0.4834 0.3505 -0.8022 +vn 0.4185 0.3674 -0.8306 +vn 0.5068 0.4250 -0.7500 +vn 0.5326 0.3345 -0.7775 +vn 0.5707 0.3935 -0.7208 +vn 0.5945 0.3087 -0.7425 +vn 0.5682 0.3208 -0.7578 +vn 0.5439 0.4078 -0.7334 +vn 0.3647 0.1392 -0.9207 +vn 0.2560 0.1454 -0.9557 +vn 0.2462 0.2805 -0.9277 +vn 0.3528 0.2691 -0.8962 +vn 0.1301 0.1497 -0.9801 +vn 0.1251 0.2887 -0.9492 +vn 0.1084 0.5116 -0.8524 +vn 0.1174 0.4097 -0.9046 +vn 0.2158 0.4999 -0.8388 +vn 0.2324 0.3997 -0.8867 +vn 0.3344 0.3846 -0.8604 +vn 0.3126 0.4833 -0.8178 +vn 0.0729 0.7530 -0.6539 +vn 0.0811 0.7112 -0.6982 +vn 0.1487 0.7440 -0.6514 +vn 0.1637 0.7020 -0.6931 +vn 0.1808 0.6485 -0.7394 +vn 0.0896 0.6596 -0.7463 +vn 0.2865 0.7129 -0.6401 +vn 0.3119 0.6675 -0.6761 +vn 0.2426 0.6864 -0.6856 +vn 0.2206 0.7306 -0.6462 +vn 0.3392 0.6121 -0.7144 +vn 0.2652 0.6323 -0.7280 +vn 0.2891 0.5651 -0.7727 +vn 0.3667 0.5447 -0.7542 +vn 0.1980 0.5825 -0.7883 +vn 0.0991 0.5934 -0.7988 +vn 0.3425 0.6934 -0.6339 +vn 0.3709 0.6468 -0.6664 +vn 0.3896 0.6735 -0.6281 +vn 0.4189 0.6257 -0.6580 +vn 0.4487 0.5696 -0.6886 +vn 0.4001 0.5905 -0.7009 +vn 0.4873 0.5877 -0.6458 +vn 0.4570 0.6062 -0.6509 +vn 0.4278 0.6539 -0.6240 +vn 0.5160 0.5322 -0.6712 +vn 0.4870 0.5496 -0.6788 +vn 0.5159 0.4843 -0.7066 +vn 0.5445 0.4674 -0.6965 +vn 0.4787 0.5027 -0.7198 +vn 0.4294 0.5235 -0.7359 +vn 0.0122 0.9696 -0.2446 +vn 0.0114 0.9740 -0.2263 +vn 0.0237 0.9738 -0.2260 +vn 0.0252 0.9693 -0.2447 +vn 0.0104 0.9831 -0.1829 +vn 0.0108 0.9785 -0.2057 +vn 0.0216 0.9831 -0.1819 +vn 0.0224 0.9784 -0.2053 +vn 0.0457 0.9828 -0.1791 +vn 0.0476 0.9779 -0.2035 +vn 0.0347 0.9783 -0.2045 +vn 0.0333 0.9830 -0.1808 +vn 0.0504 0.9730 -0.2253 +vn 0.0366 0.9735 -0.2258 +vn 0.0392 0.9688 -0.2448 +vn 0.0536 0.9680 -0.2450 +vn 0.0102 0.9876 -0.1568 +vn 0.0101 0.9917 -0.1279 +vn 0.0207 0.9918 -0.1262 +vn 0.0210 0.9875 -0.1559 +vn 0.0099 0.9955 -0.0944 +vn 0.0202 0.9955 -0.0931 +vn 0.0414 0.9953 -0.0877 +vn 0.0306 0.9954 -0.0904 +vn 0.0429 0.9917 -0.1215 +vn 0.0316 0.9917 -0.1243 +vn 0.0324 0.9875 -0.1540 +vn 0.0442 0.9874 -0.1520 +vn 0.0870 0.9934 -0.0746 +vn 0.0750 0.9942 -0.0776 +vn 0.0916 0.9898 -0.1094 +vn 0.0788 0.9905 -0.1123 +vn 0.0665 0.9911 -0.1155 +vn 0.0635 0.9947 -0.0809 +vn 0.1000 0.9802 -0.1710 +vn 0.0856 0.9812 -0.1731 +vn 0.0822 0.9861 -0.1441 +vn 0.0957 0.9853 -0.1414 +vn 0.0719 0.9819 -0.1753 +vn 0.0690 0.9867 -0.1469 +vn 0.0565 0.9872 -0.1495 +vn 0.0585 0.9824 -0.1773 +vn 0.0545 0.9914 -0.1187 +vn 0.0523 0.9951 -0.0843 +vn 0.1048 0.9746 -0.1981 +vn 0.0899 0.9757 -0.1996 +vn 0.1108 0.9685 -0.2231 +vn 0.0948 0.9700 -0.2238 +vn 0.0796 0.9712 -0.2244 +vn 0.0752 0.9767 -0.2010 +vn 0.1012 0.9640 -0.2457 +vn 0.1176 0.9622 -0.2458 +vn 0.0847 0.9657 -0.2455 +vn 0.0691 0.9670 -0.2452 +vn 0.0645 0.9722 -0.2249 +vn 0.0612 0.9774 -0.2023 +vn 0.1340 0.9601 -0.2456 +vn 0.1262 0.9668 -0.2221 +vn 0.1415 0.9650 -0.2209 +vn 0.1493 0.9580 -0.2449 +vn 0.1144 0.9790 -0.1687 +vn 0.1199 0.9731 -0.1965 +vn 0.1292 0.9775 -0.1666 +vn 0.1346 0.9716 -0.1947 +vn 0.1614 0.9732 -0.1636 +vn 0.1663 0.9672 -0.1918 +vn 0.1500 0.9696 -0.1931 +vn 0.1445 0.9757 -0.1647 +vn 0.1731 0.9603 -0.2189 +vn 0.1565 0.9630 -0.2196 +vn 0.1651 0.9556 -0.2442 +vn 0.1812 0.9529 -0.2434 +vn 0.1097 0.9842 -0.1388 +vn 0.1051 0.9887 -0.1066 +vn 0.1194 0.9873 -0.1044 +vn 0.1243 0.9828 -0.1365 +vn 0.0997 0.9924 -0.0722 +vn 0.1141 0.9910 -0.0703 +vn 0.1483 0.9865 -0.0695 +vn 0.1299 0.9891 -0.0695 +vn 0.1530 0.9829 -0.1023 +vn 0.1354 0.9854 -0.1028 +vn 0.1399 0.9810 -0.1346 +vn 0.1572 0.9785 -0.1335 +vn 0.2454 0.9655 -0.0870 +vn 0.2170 0.9729 -0.0798 +vn 0.2473 0.9617 -0.1185 +vn 0.2206 0.9691 -0.1102 +vn 0.1954 0.9750 -0.1057 +vn 0.1918 0.9786 -0.0741 +vn 0.2494 0.9521 -0.1771 +vn 0.2244 0.9597 -0.1691 +vn 0.2226 0.9647 -0.1405 +vn 0.2492 0.9571 -0.1476 +vn 0.2010 0.9655 -0.1653 +vn 0.1983 0.9707 -0.1356 +vn 0.1765 0.9752 -0.1338 +vn 0.1799 0.9701 -0.1632 +vn 0.1731 0.9795 -0.1029 +vn 0.1685 0.9831 -0.0711 +vn 0.2497 0.9467 -0.2033 +vn 0.2261 0.9540 -0.1970 +vn 0.2489 0.9414 -0.2276 +vn 0.2279 0.9482 -0.2212 +vn 0.2084 0.9532 -0.2191 +vn 0.2041 0.9598 -0.1929 +vn 0.2315 0.9418 -0.2439 +vn 0.2485 0.9366 -0.2471 +vn 0.2142 0.9462 -0.2426 +vn 0.1981 0.9496 -0.2430 +vn 0.1901 0.9572 -0.2183 +vn 0.1845 0.9639 -0.1919 +vn 0.2655 0.9291 -0.2575 +vn 0.2709 0.9328 -0.2377 +vn 0.2907 0.9230 -0.2520 +vn 0.2843 0.9195 -0.2714 +vn 0.2755 0.9428 -0.1876 +vn 0.2729 0.9378 -0.2148 +vn 0.2991 0.9326 -0.2018 +vn 0.2964 0.9274 -0.2283 +vn 0.3440 0.9092 -0.2348 +vn 0.3387 0.9038 -0.2617 +vn 0.3172 0.9163 -0.2444 +vn 0.3228 0.9212 -0.2173 +vn 0.3302 0.8997 -0.2854 +vn 0.3111 0.9118 -0.2678 +vn 0.3015 0.9091 -0.2874 +vn 0.3211 0.8966 -0.3051 +vn 0.2754 0.9481 -0.1592 +vn 0.2754 0.9527 -0.1286 +vn 0.3011 0.9429 -0.1422 +vn 0.3016 0.9378 -0.1723 +vn 0.2731 0.9570 -0.0980 +vn 0.3010 0.9473 -0.1099 +vn 0.3529 0.9252 -0.1397 +vn 0.3267 0.9369 -0.1245 +vn 0.3507 0.9203 -0.1734 +vn 0.3269 0.9320 -0.1567 +vn 0.3249 0.9268 -0.1882 +vn 0.3487 0.9146 -0.2049 +vn 0.4662 0.8590 -0.2119 +vn 0.4341 0.8800 -0.1925 +vn 0.4583 0.8531 -0.2494 +vn 0.4279 0.8744 -0.2289 +vn 0.4005 0.8921 -0.2094 +vn 0.4054 0.8974 -0.1740 +vn 0.4399 0.8409 -0.3153 +vn 0.4126 0.8624 -0.2932 +vn 0.4206 0.8684 -0.2625 +vn 0.4495 0.8469 -0.2841 +vn 0.3881 0.8804 -0.2725 +vn 0.3952 0.8861 -0.2423 +vn 0.3710 0.9014 -0.2232 +vn 0.3662 0.8955 -0.2531 +vn 0.3756 0.9070 -0.1907 +vn 0.3783 0.9123 -0.1565 +vn 0.4294 0.8353 -0.3433 +vn 0.4032 0.8571 -0.3206 +vn 0.4182 0.8308 -0.3673 +vn 0.3931 0.8525 -0.3446 +vn 0.3707 0.8705 -0.3236 +vn 0.3804 0.8749 -0.2998 +vn 0.3817 0.8493 -0.3647 +vn 0.4063 0.8274 -0.3877 +vn 0.3605 0.8671 -0.3438 +vn 0.3402 0.8827 -0.3241 +vn 0.3508 0.8857 -0.3041 +vn 0.3588 0.8903 -0.2803 +vn 0.6145 0.5016 -0.6089 +vn 0.6374 0.4499 -0.6256 +vn 0.6222 0.4579 -0.6350 +vn 0.5989 0.5096 -0.6177 +vn 0.6794 0.3283 -0.6562 +vn 0.6591 0.3924 -0.6415 +vn 0.6652 0.3351 -0.6673 +vn 0.6446 0.3999 -0.6517 +vn 0.6379 0.3506 -0.6857 +vn 0.6159 0.4178 -0.6679 +vn 0.6302 0.4084 -0.6604 +vn 0.6516 0.3424 -0.6768 +vn 0.5919 0.4775 -0.6493 +vn 0.6073 0.4670 -0.6428 +vn 0.5832 0.5193 -0.6246 +vn 0.5673 0.5302 -0.6301 +vn 0.6970 0.2573 -0.6693 +vn 0.7114 0.1787 -0.6797 +vn 0.6980 0.1827 -0.6924 +vn 0.6835 0.2628 -0.6810 +vn 0.7208 0.0927 -0.6870 +vn 0.7079 0.0948 -0.6999 +vn 0.6837 0.0991 -0.7230 +vn 0.6955 0.0969 -0.7119 +vn 0.6731 0.1912 -0.7144 +vn 0.6856 0.1868 -0.7036 +vn 0.6703 0.2687 -0.6917 +vn 0.6576 0.2751 -0.7014 +vn 0.6434 0.1070 -0.7580 +vn 0.6319 0.2071 -0.7469 +vn 0.6470 0.2013 -0.7355 +vn 0.6585 0.1040 -0.7454 +vn 0.5917 0.3806 -0.7107 +vn 0.6137 0.2988 -0.7308 +vn 0.6086 0.3696 -0.7021 +vn 0.6301 0.2899 -0.7204 +vn 0.6442 0.2822 -0.7109 +vn 0.6240 0.3595 -0.6938 +vn 0.6607 0.1959 -0.7247 +vn 0.6713 0.1015 -0.7342 +vn 0.5661 0.4531 -0.6886 +vn 0.5393 0.5161 -0.6654 +vn 0.5586 0.5021 -0.6602 +vn 0.5847 0.4399 -0.6816 +vn 0.5112 0.5715 -0.6419 +vn 0.5321 0.5562 -0.6384 +vn 0.5502 0.5428 -0.6346 +vn 0.5761 0.4890 -0.6549 +vn 0.6007 0.4284 -0.6750 +vn 0.2866 0.5969 0.7494 +vn 0.3957 0.5813 0.7110 +vn 0.2999 0.5244 0.7969 +vn 0.4134 0.5090 0.7550 +vn 0.5093 0.4935 0.7050 +vn 0.4889 0.5644 0.6652 +vn 0.3222 0.3643 0.8738 +vn 0.4416 0.3515 0.8255 +vn 0.4286 0.4325 0.7932 +vn 0.3119 0.4465 0.8387 +vn 0.5415 0.3398 0.7690 +vn 0.5271 0.4182 0.7398 +vn 0.6969 0.3211 0.6412 +vn 0.6803 0.3951 0.6173 +vn 0.6098 0.4058 0.6808 +vn 0.6257 0.3293 0.7072 +vn 0.6597 0.4664 0.5893 +vn 0.5908 0.4787 0.6495 +vn 0.5679 0.5486 0.6136 +vn 0.6358 0.5341 0.5572 +vn 0.3307 0.2775 0.9020 +vn 0.4516 0.2676 0.8511 +vn 0.3369 0.1877 0.9227 +vn 0.4591 0.1803 0.8699 +vn 0.5610 0.1740 0.8093 +vn 0.5529 0.2580 0.7923 +vn 0.4636 0.0910 0.8814 +vn 0.3409 0.0947 0.9353 +vn 0.5659 0.0876 0.8198 +vn 0.7250 0.0832 0.6837 +vn 0.6520 0.0851 0.7535 +vn 0.7195 0.1648 0.6747 +vn 0.6466 0.1686 0.7439 +vn 0.6379 0.2503 0.7283 +vn 0.7100 0.2441 0.6605 +vn 0.9322 0.0800 0.3529 +vn 0.8914 0.0807 0.4460 +vn 0.9245 0.1574 0.3471 +vn 0.8840 0.1590 0.4396 +vn 0.8367 0.1603 0.5237 +vn 0.8432 0.0813 0.5314 +vn 0.8948 0.3037 0.3271 +vn 0.8563 0.3069 0.4154 +vn 0.8723 0.2344 0.4291 +vn 0.9118 0.2322 0.3386 +vn 0.8108 0.3103 0.4963 +vn 0.8257 0.2367 0.5120 +vn 0.7721 0.2398 0.5886 +vn 0.7581 0.3148 0.5711 +vn 0.7820 0.1621 0.6018 +vn 0.7883 0.0820 0.6098 +vn 0.8736 0.3724 0.3133 +vn 0.8363 0.3762 0.3988 +vn 0.8484 0.4378 0.2975 +vn 0.8125 0.4425 0.3795 +vn 0.7694 0.4484 0.4550 +vn 0.7921 0.3808 0.4771 +vn 0.7847 0.5059 0.3582 +vn 0.8194 0.5003 0.2797 +vn 0.7431 0.5128 0.4298 +vn 0.6934 0.5224 0.4962 +vn 0.7190 0.4561 0.5245 +vn 0.7403 0.3870 0.5497 +vn 0.8452 0.4961 0.1987 +vn 0.8756 0.4340 0.2122 +vn 0.8930 0.4311 0.1289 +vn 0.8617 0.4932 0.1189 +vn 0.9242 0.3009 0.2354 +vn 0.9020 0.3688 0.2246 +vn 0.9433 0.2983 0.1456 +vn 0.9202 0.3663 0.1378 +vn 0.9551 0.2953 -0.0239 +vn 0.9314 0.3631 -0.0265 +vn 0.9297 0.3643 0.0539 +vn 0.9532 0.2966 0.0591 +vn 0.9034 0.4279 -0.0293 +vn 0.9019 0.4293 0.0482 +vn 0.8700 0.4912 0.0420 +vn 0.8711 0.4900 -0.0321 +vn 0.9421 0.2297 0.2442 +vn 0.9553 0.1558 0.2511 +vn 0.9755 0.1542 0.1571 +vn 0.9617 0.2277 0.1523 +vn 0.9637 0.0790 0.2552 +vn 0.9839 0.0782 0.1606 +vn 0.9969 0.0770 -0.0183 +vn 0.9946 0.0775 0.0689 +vn 0.9882 0.1521 -0.0198 +vn 0.9860 0.1530 0.0669 +vn 0.9721 0.2260 0.0634 +vn 0.9741 0.2251 -0.0215 +vn 0.9630 0.0772 -0.2583 +vn 0.9543 0.1523 -0.2570 +vn 0.9716 0.1518 -0.1814 +vn 0.9804 0.0769 -0.1815 +vn 0.9216 0.2949 -0.2524 +vn 0.9403 0.2250 -0.2552 +vn 0.9387 0.2946 -0.1793 +vn 0.9576 0.2245 -0.1805 +vn 0.9690 0.2245 -0.1029 +vn 0.9500 0.2948 -0.1032 +vn 0.9831 0.1518 -0.1022 +vn 0.9918 0.0768 -0.1020 +vn 0.8984 0.3619 -0.2486 +vn 0.8712 0.4260 -0.2439 +vn 0.8875 0.4264 -0.1749 +vn 0.9151 0.3620 -0.1775 +vn 0.8404 0.4870 -0.2379 +vn 0.8558 0.4880 -0.1717 +vn 0.8662 0.4889 -0.1031 +vn 0.8983 0.4271 -0.1036 +vn 0.9263 0.3623 -0.1036 +vn -0.3529 0.5816 0.7329 +vn -0.2992 0.5940 0.7468 +vn -0.3784 0.5109 0.7719 +vn -0.3203 0.5247 0.7888 +vn -0.2587 0.5341 0.8049 +vn -0.2417 0.6041 0.7594 +vn -0.4195 0.3568 0.8347 +vn -0.3546 0.3695 0.8589 +vn -0.3389 0.4492 0.8267 +vn -0.4005 0.4366 0.8056 +vn -0.2858 0.3777 0.8807 +vn -0.2735 0.4591 0.8453 +vn -0.1262 0.3858 0.9139 +vn -0.1212 0.4685 0.8751 +vn -0.2016 0.4650 0.8620 +vn -0.2105 0.3835 0.8992 +vn -0.1145 0.5448 0.8307 +vn -0.1910 0.5411 0.8190 +vn -0.1781 0.6108 0.7715 +vn -0.1066 0.6153 0.7810 +vn -0.4350 0.2737 0.8578 +vn -0.3673 0.2837 0.8858 +vn -0.4463 0.1857 0.8754 +vn -0.3769 0.1937 0.9058 +vn -0.3031 0.1987 0.9320 +vn -0.2958 0.2913 0.9098 +vn -0.3827 0.0986 0.9186 +vn -0.4537 0.0946 0.8861 +vn -0.3076 0.1016 0.9461 +vn -0.1337 0.1036 0.9856 +vn -0.2255 0.1031 0.9688 +vn -0.1325 0.2029 0.9702 +vn -0.2224 0.2020 0.9538 +vn -0.2175 0.2954 0.9303 +vn -0.1299 0.2974 0.9459 +vn 0.2087 0.0984 0.9730 +vn 0.2059 0.1942 0.9591 +vn 0.0818 0.1992 0.9765 +vn 0.0838 0.1012 0.9913 +vn 0.1952 0.3747 0.9064 +vn 0.2011 0.2867 0.9367 +vn 0.0764 0.3818 0.9211 +vn 0.0794 0.2929 0.9528 +vn -0.0313 0.2965 0.9545 +vn -0.0309 0.3855 0.9222 +vn -0.0311 0.2021 0.9789 +vn -0.0311 0.1029 0.9942 +vn 0.1883 0.4581 0.8687 +vn 0.1806 0.5360 0.8247 +vn 0.0707 0.5430 0.8368 +vn 0.0734 0.4653 0.8821 +vn 0.1728 0.6084 0.7746 +vn 0.0681 0.6147 0.7858 +vn -0.0247 0.6166 0.7869 +vn -0.0280 0.5457 0.8375 +vn -0.0298 0.4685 0.8829 +vn 0.5997 0.5836 -0.5475 +vn 0.5734 0.6267 -0.5277 +vn 0.5912 0.6270 -0.5073 +vn 0.6184 0.5825 -0.5275 +vn 0.5177 0.7058 -0.4835 +vn 0.5459 0.6678 -0.5060 +vn 0.5334 0.7079 -0.4630 +vn 0.5626 0.6688 -0.4859 +vn 0.5663 0.7163 -0.4078 +vn 0.5986 0.6758 -0.4301 +vn 0.5803 0.6717 -0.4604 +vn 0.5496 0.7114 -0.4380 +vn 0.6304 0.6320 -0.4508 +vn 0.6102 0.6288 -0.4820 +vn 0.6389 0.5833 -0.5016 +vn 0.6607 0.5851 -0.4703 +vn 0.4892 0.7411 -0.4598 +vn 0.4609 0.7730 -0.4360 +vn 0.4746 0.7761 -0.4154 +vn 0.5039 0.7435 -0.4396 +vn 0.4331 0.8019 -0.4116 +vn 0.4459 0.8050 -0.3914 +vn 0.4699 0.8152 -0.3386 +vn 0.4582 0.8097 -0.3668 +vn 0.5013 0.7860 -0.3617 +vn 0.4880 0.7804 -0.3908 +vn 0.5187 0.7478 -0.4144 +vn 0.5335 0.7530 -0.3852 +vn 0.5014 0.8337 -0.2313 +vn 0.5382 0.8045 -0.2511 +vn 0.5267 0.7985 -0.2917 +vn 0.4915 0.8277 -0.2707 +vn 0.6157 0.7331 -0.2890 +vn 0.5768 0.7710 -0.2701 +vn 0.5998 0.7275 -0.3332 +vn 0.5628 0.7651 -0.3129 +vn 0.5484 0.7590 -0.3511 +vn 0.5829 0.7217 -0.3732 +vn 0.5141 0.7921 -0.3289 +vn 0.4811 0.8214 -0.3063 +vn 0.6550 0.6907 -0.3064 +vn 0.6931 0.6443 -0.3233 +vn 0.6726 0.6401 -0.3714 +vn 0.6364 0.6857 -0.3532 +vn 0.7299 0.5941 -0.3381 +vn 0.7069 0.5909 -0.3887 +vn 0.6837 0.5878 -0.4324 +vn 0.6512 0.6358 -0.4142 +vn 0.6176 0.6806 -0.3941 +vn -0.1916 0.5342 0.8233 +vn -0.2105 0.4637 0.8606 +vn -0.3557 0.4545 0.8166 +vn -0.3280 0.5237 0.7862 +vn -0.2411 0.3168 0.9173 +vn -0.2263 0.3930 0.8913 +vn -0.4027 0.3075 0.8622 +vn -0.3818 0.3810 0.8420 +vn -0.5320 0.3049 0.7899 +vn -0.5079 0.3795 0.7733 +vn -0.4687 0.3766 0.7991 +vn -0.4933 0.3020 0.8157 +vn -0.4781 0.4530 0.7525 +vn -0.4406 0.4492 0.7773 +vn -0.4072 0.5206 0.7504 +vn -0.4446 0.5245 0.7262 +vn -0.2521 0.2409 0.9372 +vn -0.2612 0.1612 0.9517 +vn -0.4327 0.1552 0.8881 +vn -0.4206 0.2312 0.8773 +vn -0.2661 0.0815 0.9605 +vn -0.4411 0.0777 0.8941 +vn -0.5748 0.0769 0.8147 +vn -0.5342 0.0762 0.8419 +vn -0.5655 0.1534 0.8103 +vn -0.5264 0.1517 0.8366 +vn -0.5118 0.2274 0.8284 +vn -0.5520 0.2293 0.8017 +vn -0.5142 0.0893 0.8530 +vn -0.5065 0.1765 0.8440 +vn -0.5484 0.1668 0.8194 +vn -0.5574 0.0842 0.8260 +vn -0.4760 0.3424 0.8101 +vn -0.4933 0.2606 0.8299 +vn -0.5161 0.3269 0.7916 +vn -0.5351 0.2480 0.8076 +vn -0.5559 0.2368 0.7968 +vn -0.5370 0.3139 0.7830 +vn -0.5704 0.1587 0.8059 +vn -0.5785 0.0798 0.8118 +vn -0.4543 0.4202 0.7855 +vn -0.4288 0.4953 0.7555 +vn -0.4653 0.4782 0.7449 +vn -0.4930 0.4042 0.7705 +vn -0.4000 0.5656 0.7212 +vn -0.4336 0.5499 0.7139 +vn -0.4503 0.5349 0.7149 +vn -0.4837 0.4636 0.7424 +vn -0.5125 0.3895 0.7653 +vn 0.0660 0.7858 -0.6149 +vn 0.0593 0.8135 -0.5786 +vn 0.1218 0.8067 -0.5783 +vn 0.1342 0.7787 -0.6129 +vn 0.0483 0.8555 -0.5156 +vn 0.0537 0.8359 -0.5462 +vn 0.0996 0.8505 -0.5164 +vn 0.1097 0.8307 -0.5458 +vn 0.1991 0.8320 -0.5177 +vn 0.2181 0.8092 -0.5455 +vn 0.1660 0.8212 -0.5459 +vn 0.1501 0.8429 -0.5167 +vn 0.2397 0.7821 -0.5751 +vn 0.1824 0.7964 -0.5767 +vn 0.2012 0.7662 -0.6103 +vn 0.2619 0.7506 -0.6066 +vn 0.0438 0.8718 -0.4880 +vn 0.0394 0.8863 -0.4614 +vn 0.0812 0.8828 -0.4627 +vn 0.0896 0.8680 -0.4884 +vn 0.0356 0.8988 -0.4370 +vn 0.0729 0.8961 -0.4378 +vn 0.1484 0.8846 -0.4421 +vn 0.1114 0.8911 -0.4399 +vn 0.1643 0.8692 -0.4663 +vn 0.1229 0.8773 -0.4640 +vn 0.1364 0.8611 -0.4899 +vn 0.1805 0.8521 -0.4912 +vn 0.2476 0.8573 -0.4514 +vn 0.2695 0.8381 -0.4744 +vn 0.2382 0.8492 -0.4714 +vn 0.2172 0.8671 -0.4483 +vn 0.3177 0.7917 -0.5218 +vn 0.2932 0.8164 -0.4976 +vn 0.2834 0.8058 -0.5200 +vn 0.2597 0.8289 -0.4954 +vn 0.2226 0.8410 -0.4932 +vn 0.2433 0.8196 -0.5187 +vn 0.2024 0.8599 -0.4686 +vn 0.1845 0.8762 -0.4451 +vn 0.3439 0.7638 -0.5463 +vn 0.3709 0.7318 -0.5718 +vn 0.3341 0.7490 -0.5721 +vn 0.3078 0.7794 -0.5458 +vn 0.3990 0.6957 -0.5974 +vn 0.3612 0.7139 -0.5999 +vn 0.3159 0.7327 -0.6028 +vn 0.2900 0.7661 -0.5735 +vn 0.2663 0.7947 -0.5454 +# 5634 vertex normals + +vt 0.1020 0.1559 0.0000 +vt 0.0917 0.1400 0.0000 +vt 0.1404 0.0910 0.0000 +vt 0.1446 0.1132 0.0000 +vt 0.0812 0.1287 0.0000 +vt 0.1365 0.0728 0.0000 +vt 0.1878 0.0278 0.0000 +vt 0.1861 0.0527 0.0000 +vt 0.1860 0.0806 0.0000 +vt 0.0340 0.3475 0.0000 +vt 0.0572 0.3686 0.0000 +vt 0.4849 0.5853 0.0000 +vt 0.5487 0.5831 0.0000 +vt 0.5501 0.6019 0.0000 +vt 0.4942 0.6042 0.0000 +vt 0.6121 0.5822 0.0000 +vt 0.0583 0.6396 0.0000 +vt 0.0481 0.4000 0.0000 +vt 0.0154 0.3608 0.0000 +vt 0.0942 0.3841 0.0000 +vt 0.1072 0.8133 0.0000 +vt 0.0567 0.6676 0.0000 +vt 0.0907 0.4236 0.0000 +vt 0.0850 0.4575 0.0000 +vt 0.0348 0.4243 0.0000 +vt 0.0000 0.3700 0.0000 +vt 0.1845 0.1162 0.0000 +vt 0.1440 0.8133 0.0000 +vt 0.0019 0.6700 0.0000 +vt 0.1479 0.1421 0.0000 +vt 0.1810 0.1592 0.0000 +vt 0.1475 0.1777 0.0000 +vt 0.1224 0.1938 0.0000 +vt 0.1130 0.1765 0.0000 +vt 0.1445 0.8293 0.0000 +vt 0.1719 0.2643 0.0000 +vt 0.0081 0.6452 0.0000 +vt 0.6096 0.6011 0.0000 +vt 0.0559 0.6969 0.0000 +vt 0.1726 0.3206 0.0000 +vt 0.7354 0.5391 0.0000 +vt 0.1083 0.8301 0.0000 +vt 0.0000 0.6969 0.0000 +vt 0.1715 0.8133 0.0000 +vt 0.1333 0.3307 0.0000 +vt 0.1715 0.8292 0.0000 +vt 0.1715 0.8452 0.0000 +vt 0.1340 0.2741 0.0000 +vt 0.1766 0.3715 0.0000 +vt 0.1359 0.3835 0.0000 +vt 0.1628 0.6364 0.0000 +vt 0.0950 0.3323 0.0000 +vt 0.0985 0.2771 0.0000 +vt 0.0430 0.2551 0.0000 +vt 0.0332 0.3086 0.0000 +vt 0.0075 0.3049 0.0000 +vt 0.0193 0.2454 0.0000 +vt 0.1380 0.4245 0.0000 +vt 0.1819 0.4106 0.0000 +vt 0.1895 0.4405 0.0000 +vt 0.1402 0.4582 0.0000 +vt 0.0610 0.3217 0.0000 +vt 0.1963 0.4758 0.0000 +vt 0.1988 0.4954 0.0000 +vt 0.0681 0.2681 0.0000 +vt 0.1617 0.6657 0.0000 +vt 0.2128 0.3562 0.0000 +vt 0.2168 0.3928 0.0000 +vt 0.1354 0.4947 0.0000 +vt 0.2460 0.3485 0.0000 +vt 0.1368 0.4756 0.0000 +vt 0.2460 0.3839 0.0000 +vt 0.1128 0.6661 0.0000 +vt 0.2460 0.4070 0.0000 +vt 0.2220 0.4188 0.0000 +vt 0.2188 0.0631 0.0000 +vt 0.2168 0.1013 0.0000 +vt 0.1468 0.8453 0.0000 +vt 0.1133 0.8466 0.0000 +vt 0.0067 0.8532 0.0000 +vt 0.0716 0.4931 0.0000 +vt 0.1135 0.6370 0.0000 +vt 0.0808 0.4741 0.0000 +vt 0.3221 0.5394 0.0000 +vt 0.1620 0.6969 0.0000 +vt 0.2460 0.0581 0.0000 +vt 0.1128 0.6969 0.0000 +vt 0.2460 0.0968 0.0000 +vt 0.8980 0.1559 0.0000 +vt 0.0000 0.8338 0.0000 +vt 0.0577 0.8318 0.0000 +vt 0.8554 0.1132 0.0000 +vt 0.8596 0.0910 0.0000 +vt 0.9083 0.1400 0.0000 +vt 0.2194 0.6363 0.0000 +vt 0.8140 0.0806 0.0000 +vt 0.8139 0.0527 0.0000 +vt 0.8122 0.0278 0.0000 +vt 0.8635 0.0728 0.0000 +vt 0.9188 0.1287 0.0000 +vt 0.9660 0.3475 0.0000 +vt 0.9846 0.3608 0.0000 +vt 0.9519 0.4000 0.0000 +vt 0.9428 0.3686 0.0000 +vt 1.0000 0.3700 0.0000 +vt 0.9652 0.4243 0.0000 +vt 0.7335 0.5597 0.0000 +vt 0.6751 0.5606 0.0000 +vt 0.9150 0.4575 0.0000 +vt 0.2194 0.6658 0.0000 +vt 0.9093 0.4236 0.0000 +vt 0.9058 0.3841 0.0000 +vt 0.6768 0.5391 0.0000 +vt 0.8521 0.1421 0.0000 +vt 0.7263 0.5790 0.0000 +vt 0.8155 0.1162 0.0000 +vt 0.1952 0.6657 0.0000 +vt 0.8870 0.1765 0.0000 +vt 0.8776 0.1938 0.0000 +vt 0.8525 0.1777 0.0000 +vt 0.8190 0.1592 0.0000 +vt 0.0620 0.8497 0.0000 +vt 0.0556 0.8133 0.0000 +vt 0.2358 0.8133 0.0000 +vt 0.6714 0.5814 0.0000 +vt 0.1953 0.6362 0.0000 +vt 0.6138 0.5614 0.0000 +vt 0.6142 0.5391 0.0000 +vt 0.2194 0.6969 0.0000 +vt 0.8281 0.2643 0.0000 +vt 0.1955 0.6969 0.0000 +vt 0.8660 0.2741 0.0000 +vt 0.8667 0.3307 0.0000 +vt 0.8274 0.3206 0.0000 +vt 0.2346 0.8301 0.0000 +vt 0.1985 0.8293 0.0000 +vt 0.9015 0.2771 0.0000 +vt 0.9050 0.3323 0.0000 +vt 0.3804 0.6396 0.0000 +vt 0.8641 0.3835 0.0000 +vt 0.8234 0.3715 0.0000 +vt 0.9570 0.2551 0.0000 +vt 0.9807 0.2454 0.0000 +vt 0.9925 0.3049 0.0000 +vt 0.9668 0.3086 0.0000 +vt 0.8620 0.4245 0.0000 +vt 0.8598 0.4582 0.0000 +vt 0.8105 0.4405 0.0000 +vt 0.8181 0.4106 0.0000 +vt 0.2634 0.5393 0.0000 +vt 0.2618 0.5175 0.0000 +vt 0.9390 0.3217 0.0000 +vt 0.4306 0.6452 0.0000 +vt 0.9319 0.2681 0.0000 +vt 0.7832 0.3928 0.0000 +vt 0.7872 0.3562 0.0000 +vt 0.3201 0.5188 0.0000 +vt 0.2009 0.5393 0.0000 +vt 0.7780 0.4188 0.0000 +vt 0.4368 0.6700 0.0000 +vt 0.7540 0.4070 0.0000 +vt 0.7540 0.3839 0.0000 +vt 0.7540 0.3485 0.0000 +vt 0.7832 0.1013 0.0000 +vt 0.7812 0.0631 0.0000 +vt 0.1990 0.8133 0.0000 +vt 0.2297 0.8466 0.0000 +vt 0.1962 0.8453 0.0000 +vt 0.2004 0.5167 0.0000 +vt 0.2581 0.4965 0.0000 +vt 0.3820 0.6676 0.0000 +vt 0.3130 0.4994 0.0000 +vt 0.4387 0.6969 0.0000 +vt 0.7860 0.1469 0.0000 +vt 0.3828 0.6969 0.0000 +vt 0.7540 0.1427 0.0000 +vt 0.2460 0.1427 0.0000 +vt 0.2140 0.1469 0.0000 +vt 0.2092 0.2548 0.0000 +vt 0.2099 0.3088 0.0000 +vt 0.2460 0.2507 0.0000 +vt 0.2460 0.3030 0.0000 +vt 0.2460 0.1956 0.0000 +vt 0.7949 0.5391 0.0000 +vt 0.2110 0.1994 0.0000 +vt 0.1757 0.2093 0.0000 +vt 0.1406 0.2221 0.0000 +vt 0.3363 0.8534 0.0000 +vt 0.1095 0.2281 0.0000 +vt 0.0857 0.2187 0.0000 +vt 0.0667 0.2034 0.0000 +vt 0.2810 0.8497 0.0000 +vt 0.2759 0.6364 0.0000 +vt 0.7917 0.5576 0.0000 +vt 0.3252 0.6370 0.0000 +vt 0.0482 0.1908 0.0000 +vt 0.3259 0.6661 0.0000 +vt 0.0355 0.1836 0.0000 +vt 0.2460 0.0000 0.0000 +vt 0.2460 0.0266 0.0000 +vt 0.2198 0.0322 0.0000 +vt 0.2214 0.0055 0.0000 +vt 0.3901 0.1559 0.0000 +vt 0.3474 0.1132 0.0000 +vt 0.3516 0.0910 0.0000 +vt 0.3816 0.5394 0.0000 +vt 0.4003 0.1400 0.0000 +vt 0.3060 0.0806 0.0000 +vt 0.3060 0.0527 0.0000 +vt 0.2853 0.8318 0.0000 +vt 0.3042 0.0278 0.0000 +vt 0.3555 0.0728 0.0000 +vt 0.4109 0.1287 0.0000 +vt 0.3430 0.8339 0.0000 +vt 0.2770 0.6657 0.0000 +vt 0.3783 0.5209 0.0000 +vt 0.3260 0.6969 0.0000 +vt 0.4581 0.3475 0.0000 +vt 0.2767 0.6969 0.0000 +vt 0.4766 0.3608 0.0000 +vt 0.7540 0.0968 0.0000 +vt 0.7540 0.0581 0.0000 +vt 0.7901 0.3088 0.0000 +vt 0.7908 0.2548 0.0000 +vt 0.7540 0.3030 0.0000 +vt 0.7540 0.2507 0.0000 +vt 0.7890 0.1994 0.0000 +vt 0.4769 0.5391 0.0000 +vt 0.7540 0.1956 0.0000 +vt 0.8243 0.2093 0.0000 +vt 0.8594 0.2221 0.0000 +vt 0.2874 0.8133 0.0000 +vt 0.8905 0.2281 0.0000 +vt 0.9143 0.2187 0.0000 +vt 0.9333 0.2034 0.0000 +vt 0.1083 0.7965 0.0000 +vt 0.2434 0.6362 0.0000 +vt 0.4797 0.5631 0.0000 +vt 0.2435 0.6657 0.0000 +vt 0.9645 0.1836 0.0000 +vt 0.2432 0.6969 0.0000 +vt 0.9518 0.1908 0.0000 +vt 0.7540 0.0000 0.0000 +vt 0.7786 0.0055 0.0000 +vt 0.7802 0.0322 0.0000 +vt 0.7540 0.0266 0.0000 +vt 0.6099 0.1559 0.0000 +vt 0.5997 0.1400 0.0000 +vt 0.6484 0.0910 0.0000 +vt 0.0174 0.4878 0.0000 +vt 0.6526 0.1132 0.0000 +vt 0.5891 0.1287 0.0000 +vt 0.6445 0.0728 0.0000 +vt 0.1445 0.7973 0.0000 +vt 0.6958 0.0278 0.0000 +vt 0.6940 0.0527 0.0000 +vt 0.6940 0.0806 0.0000 +vt 0.1133 0.7800 0.0000 +vt 0.0583 0.7542 0.0000 +vt 0.0664 0.5153 0.0000 +vt 0.0081 0.7485 0.0000 +vt 0.5419 0.3475 0.0000 +vt 0.0019 0.7238 0.0000 +vt 0.5651 0.3686 0.0000 +vt 0.4440 0.4000 0.0000 +vt 0.4349 0.3686 0.0000 +vt 0.4921 0.3700 0.0000 +vt 0.4572 0.4243 0.0000 +vt 0.4071 0.4575 0.0000 +vt 0.4014 0.4236 0.0000 +vt 0.3978 0.3841 0.0000 +vt 0.3442 0.1421 0.0000 +vt 0.3076 0.1162 0.0000 +vt 0.3791 0.1765 0.0000 +vt 0.3697 0.1938 0.0000 +vt 0.3446 0.1777 0.0000 +vt 0.3110 0.1592 0.0000 +vt 0.3202 0.2643 0.0000 +vt 0.4180 0.5661 0.0000 +vt 0.1468 0.7813 0.0000 +vt 0.3580 0.2741 0.0000 +vt 0.3587 0.3307 0.0000 +vt 0.3195 0.3206 0.0000 +vt 0.3936 0.2771 0.0000 +vt 0.1715 0.7814 0.0000 +vt 0.3970 0.3323 0.0000 +vt 0.3562 0.3835 0.0000 +vt 0.3155 0.3715 0.0000 +vt 0.4491 0.2551 0.0000 +vt 0.4727 0.2454 0.0000 +vt 0.1715 0.7974 0.0000 +vt 0.0567 0.7262 0.0000 +vt 0.4133 0.5391 0.0000 +vt 0.1628 0.7574 0.0000 +vt 0.4846 0.3049 0.0000 +vt 0.4589 0.3086 0.0000 +vt 0.0067 0.7734 0.0000 +vt 0.1135 0.7568 0.0000 +vt 0.4307 0.5908 0.0000 +vt 0.1128 0.7277 0.0000 +vt 0.3541 0.4245 0.0000 +vt 0.1617 0.7281 0.0000 +vt 0.0620 0.7769 0.0000 +vt 0.3519 0.4582 0.0000 +vt 0.0577 0.7948 0.0000 +vt 0.3025 0.4405 0.0000 +vt 0.3101 0.4106 0.0000 +vt 0.4311 0.3217 0.0000 +vt 0.4239 0.2681 0.0000 +vt 0.2194 0.7575 0.0000 +vt 0.2753 0.3928 0.0000 +vt 0.2793 0.3562 0.0000 +vt 0.2701 0.4188 0.0000 +vt 0.2753 0.1013 0.0000 +vt 0.2733 0.0631 0.0000 +vt 0.2780 0.1469 0.0000 +vt 0.2821 0.3088 0.0000 +vt 0.2828 0.2548 0.0000 +vt 0.2810 0.1994 0.0000 +vt 0.0046 0.5125 0.0000 +vt 0.3163 0.2093 0.0000 +vt 0.3515 0.2221 0.0000 +vt 0.1953 0.7575 0.0000 +vt 0.3825 0.2281 0.0000 +vt 0.0000 0.7928 0.0000 +vt 0.4063 0.2187 0.0000 +vt 0.0635 0.5394 0.0000 +vt 0.4254 0.2034 0.0000 +vt 0.1952 0.7281 0.0000 +vt 0.4566 0.1836 0.0000 +vt 0.4438 0.1908 0.0000 +vt 0.2707 0.0055 0.0000 +vt 0.2723 0.0322 0.0000 +vt 0.2194 0.7280 0.0000 +vt 0.1985 0.7973 0.0000 +vt 0.2346 0.7965 0.0000 +vt 0.3804 0.7542 0.0000 +vt 0.3820 0.7262 0.0000 +vt 0.4368 0.7238 0.0000 +vt 0.4306 0.7485 0.0000 +vt 0.2759 0.7574 0.0000 +vt 0.0000 0.5394 0.0000 +vt 0.2770 0.7281 0.0000 +vt 0.3259 0.7277 0.0000 +vt 0.3252 0.7568 0.0000 +vt 0.5560 0.4000 0.0000 +vt 0.1962 0.7813 0.0000 +vt 0.5234 0.3608 0.0000 +vt 0.6022 0.3841 0.0000 +vt 0.5986 0.4236 0.0000 +vt 0.5929 0.4575 0.0000 +vt 0.2435 0.7281 0.0000 +vt 0.5428 0.4243 0.0000 +vt 0.5079 0.3700 0.0000 +vt 0.6924 0.1162 0.0000 +vt 0.6558 0.1421 0.0000 +vt 0.6890 0.1592 0.0000 +vt 0.6554 0.1777 0.0000 +vt 0.6303 0.1938 0.0000 +vt 0.6209 0.1765 0.0000 +vt 0.6798 0.2643 0.0000 +vt 0.5465 0.5619 0.0000 +vt 0.6805 0.3206 0.0000 +vt 0.6413 0.3307 0.0000 +vt 0.2434 0.7575 0.0000 +vt 0.6420 0.2741 0.0000 +vt 0.2297 0.7800 0.0000 +vt 0.6845 0.3715 0.0000 +vt 0.5453 0.5391 0.0000 +vt 0.6642 0.5991 0.0000 +vt 0.6438 0.3835 0.0000 +vt 0.6030 0.3323 0.0000 +vt 0.3363 0.7734 0.0000 +vt 0.6064 0.2771 0.0000 +vt 0.5509 0.2551 0.0000 +vt 0.5411 0.3086 0.0000 +vt 0.5154 0.3049 0.0000 +vt 0.5273 0.2454 0.0000 +vt 0.3430 0.7928 0.0000 +vt 0.2853 0.7948 0.0000 +vt 0.2810 0.7769 0.0000 +vt 0.6459 0.4245 0.0000 +vt 0.6899 0.4106 0.0000 +vt 0.6975 0.4405 0.0000 +vt 0.6481 0.4582 0.0000 +vt 0.6096 0.4772 0.0000 +vt 0.6121 0.4961 0.0000 +vt 0.5689 0.3217 0.0000 +vt 0.5761 0.2681 0.0000 +vt 0.7207 0.3562 0.0000 +vt 0.7247 0.3928 0.0000 +vt 0.7299 0.4188 0.0000 +vt 0.7267 0.0631 0.0000 +vt 0.7247 0.1013 0.0000 +vt 0.7220 0.1469 0.0000 +vt 0.7172 0.2548 0.0000 +vt 0.7179 0.3088 0.0000 +vt 0.7190 0.1994 0.0000 +vt 0.6837 0.2093 0.0000 +vt 0.6485 0.2221 0.0000 +vt 0.6175 0.2281 0.0000 +vt 0.5937 0.2187 0.0000 +vt 0.1331 0.5163 0.0000 +vt 0.5746 0.2034 0.0000 +vt 0.5562 0.1908 0.0000 +vt 0.5434 0.1836 0.0000 +vt 0.1320 0.5393 0.0000 +vt 0.2509 0.4784 0.0000 +vt 0.7277 0.0322 0.0000 +vt 0.7293 0.0055 0.0000 +vt 0.0716 0.5856 0.0000 +vt 0.1354 0.5834 0.0000 +vt 0.5487 0.4952 0.0000 +vt 0.5501 0.4764 0.0000 +vt 0.1368 0.6021 0.0000 +vt 0.0808 0.6045 0.0000 +vt 0.4849 0.4930 0.0000 +vt 0.4942 0.4741 0.0000 +vt 0.6751 0.5176 0.0000 +vt 0.7335 0.5186 0.0000 +vt 0.1988 0.5825 0.0000 +vt 0.1963 0.6014 0.0000 +vt 0.3201 0.5599 0.0000 +vt 0.2618 0.5609 0.0000 +vt 0.3130 0.5793 0.0000 +vt 0.2581 0.5816 0.0000 +vt 0.2004 0.5616 0.0000 +vt 0.3783 0.5579 0.0000 +vt 0.0664 0.5634 0.0000 +vt 0.0046 0.5663 0.0000 +vt 0.0174 0.5911 0.0000 +vt 0.1331 0.5621 0.0000 +vt 0.2509 0.5994 0.0000 +vt 0.6138 0.5169 0.0000 +vt 0.6714 0.4969 0.0000 +vt 0.7263 0.4993 0.0000 +vt 0.7917 0.5207 0.0000 +vt 0.4307 0.4875 0.0000 +vt 0.4797 0.5152 0.0000 +vt 0.4180 0.5122 0.0000 +vt 0.5465 0.5164 0.0000 +vt 0.6642 0.4792 0.0000 +vt 0.1192 0.1235 0.0000 +vt 0.1123 0.1075 0.0000 +vt 0.1632 0.0598 0.0000 +vt 0.1654 0.0817 0.0000 +vt 0.0380 0.3709 0.0000 +vt 0.0719 0.3980 0.0000 +vt 0.0642 0.4281 0.0000 +vt 0.0243 0.3896 0.0000 +vt 0.1665 0.1106 0.0000 +vt 0.1657 0.1470 0.0000 +vt 0.1323 0.1719 0.0000 +vt 0.1265 0.1454 0.0000 +vt 0.1523 0.2980 0.0000 +vt 0.1546 0.3535 0.0000 +vt 0.1143 0.3604 0.0000 +vt 0.1141 0.3048 0.0000 +vt 0.0248 0.2782 0.0000 +vt 0.0221 0.3308 0.0000 +vt 0.5195 0.5937 0.0000 +vt 0.5804 0.5922 0.0000 +vt 0.1148 0.4077 0.0000 +vt 0.1588 0.4001 0.0000 +vt 0.1628 0.4347 0.0000 +vt 0.1135 0.4427 0.0000 +vt 0.0762 0.3544 0.0000 +vt 0.0449 0.3381 0.0000 +vt 0.0493 0.2883 0.0000 +vt 0.0791 0.3008 0.0000 +vt 0.7058 0.5497 0.0000 +vt 0.7017 0.5702 0.0000 +vt 0.6438 0.5716 0.0000 +vt 0.6460 0.5502 0.0000 +vt 0.1978 0.3840 0.0000 +vt 0.2306 0.3699 0.0000 +vt 0.2328 0.4005 0.0000 +vt 0.2030 0.4163 0.0000 +vt 0.2025 0.0878 0.0000 +vt 0.2322 0.0777 0.0000 +vt 0.2309 0.1199 0.0000 +vt 0.1996 0.1288 0.0000 +vt 0.1906 0.2872 0.0000 +vt 0.2277 0.2788 0.0000 +vt 0.2287 0.3288 0.0000 +vt 0.1931 0.3402 0.0000 +vt 0.1276 0.8214 0.0000 +vt 0.1584 0.8212 0.0000 +vt 0.1588 0.8372 0.0000 +vt 0.1289 0.8378 0.0000 +vt 0.2293 0.1695 0.0000 +vt 0.2280 0.2242 0.0000 +vt 0.1917 0.2312 0.0000 +vt 0.1956 0.1772 0.0000 +vt 0.1612 0.1911 0.0000 +vt 0.1549 0.2421 0.0000 +vt 0.1194 0.2508 0.0000 +vt 0.1293 0.2053 0.0000 +vt 0.1067 0.2042 0.0000 +vt 0.0886 0.2483 0.0000 +vt 0.0638 0.2356 0.0000 +vt 0.0904 0.1878 0.0000 +vt 0.0315 0.8421 0.0000 +vt 0.7640 0.5489 0.0000 +vt 0.0833 0.8221 0.0000 +vt 0.0857 0.8395 0.0000 +vt 0.0311 0.6555 0.0000 +vt 0.0283 0.6827 0.0000 +vt 0.4462 0.5518 0.0000 +vt 0.4530 0.5763 0.0000 +vt 0.5145 0.5734 0.0000 +vt 0.5110 0.5508 0.0000 +vt 0.5804 0.5505 0.0000 +vt 0.5808 0.5724 0.0000 +vt 0.1385 0.6511 0.0000 +vt 0.1390 0.6812 0.0000 +vt 0.0847 0.6816 0.0000 +vt 0.0854 0.6523 0.0000 +vt 0.0639 0.1606 0.0000 +vt 0.0762 0.1718 0.0000 +vt 0.0434 0.2231 0.0000 +vt 0.6395 0.5910 0.0000 +vt 0.2076 0.6509 0.0000 +vt 0.2080 0.6812 0.0000 +vt 0.1805 0.6811 0.0000 +vt 0.1796 0.6508 0.0000 +vt 0.2335 0.0150 0.0000 +vt 0.2331 0.0426 0.0000 +vt 0.2040 0.0542 0.0000 +vt 0.2044 0.0282 0.0000 +vt 0.3728 0.1235 0.0000 +vt 0.3267 0.0817 0.0000 +vt 0.3289 0.0598 0.0000 +vt 0.3798 0.1075 0.0000 +vt 0.4541 0.3709 0.0000 +vt 0.4678 0.3896 0.0000 +vt 0.4278 0.4281 0.0000 +vt 0.4202 0.3980 0.0000 +vt 0.3255 0.1106 0.0000 +vt 0.3656 0.1454 0.0000 +vt 0.3597 0.1719 0.0000 +vt 0.3264 0.1470 0.0000 +vt 0.3397 0.2980 0.0000 +vt 0.3780 0.3048 0.0000 +vt 0.3777 0.3604 0.0000 +vt 0.3374 0.3535 0.0000 +vt 0.4673 0.2782 0.0000 +vt 0.1670 0.4852 0.0000 +vt 0.1062 0.4843 0.0000 +vt 0.4700 0.3308 0.0000 +vt 0.3773 0.4077 0.0000 +vt 0.3786 0.4427 0.0000 +vt 0.3293 0.4347 0.0000 +vt 0.3333 0.4001 0.0000 +vt 0.4159 0.3544 0.0000 +vt 0.4130 0.3008 0.0000 +vt 0.4428 0.2883 0.0000 +vt 0.4471 0.3381 0.0000 +vt 0.2924 0.5287 0.0000 +vt 0.2326 0.5281 0.0000 +vt 0.2305 0.5063 0.0000 +vt 0.2884 0.5080 0.0000 +vt 0.2943 0.3840 0.0000 +vt 0.2891 0.4163 0.0000 +vt 0.2592 0.4005 0.0000 +vt 0.2614 0.3699 0.0000 +vt 0.2896 0.0878 0.0000 +vt 0.2924 0.1288 0.0000 +vt 0.2612 0.1199 0.0000 +vt 0.2598 0.0777 0.0000 +vt 0.3014 0.2872 0.0000 +vt 0.2990 0.3402 0.0000 +vt 0.2634 0.3288 0.0000 +vt 0.2643 0.2788 0.0000 +vt 0.2154 0.8214 0.0000 +vt 0.2141 0.8378 0.0000 +vt 0.1842 0.8372 0.0000 +vt 0.1846 0.8212 0.0000 +vt 0.2628 0.1695 0.0000 +vt 0.2965 0.1772 0.0000 +vt 0.3004 0.2312 0.0000 +vt 0.2641 0.2242 0.0000 +vt 0.3309 0.1911 0.0000 +vt 0.3627 0.2053 0.0000 +vt 0.3727 0.2508 0.0000 +vt 0.3371 0.2421 0.0000 +vt 0.3854 0.2042 0.0000 +vt 0.4016 0.1878 0.0000 +vt 0.4282 0.2356 0.0000 +vt 0.4034 0.2483 0.0000 +vt 0.3114 0.8422 0.0000 +vt 0.2572 0.8395 0.0000 +vt 0.2597 0.8221 0.0000 +vt 0.3506 0.5296 0.0000 +vt 0.4076 0.6555 0.0000 +vt 0.0397 0.5022 0.0000 +vt 0.0328 0.5267 0.0000 +vt 0.4104 0.6827 0.0000 +vt 0.1012 0.5048 0.0000 +vt 0.1674 0.5055 0.0000 +vt 0.1670 0.5278 0.0000 +vt 0.0977 0.5276 0.0000 +vt 0.3003 0.6511 0.0000 +vt 0.3534 0.6523 0.0000 +vt 0.3541 0.6816 0.0000 +vt 0.2997 0.6812 0.0000 +vt 0.4282 0.1606 0.0000 +vt 0.2262 0.4864 0.0000 +vt 0.4486 0.2231 0.0000 +vt 0.4159 0.1718 0.0000 +vt 0.2311 0.6509 0.0000 +vt 0.2591 0.6508 0.0000 +vt 0.2582 0.6811 0.0000 +vt 0.2307 0.6812 0.0000 +vt 0.2585 0.0150 0.0000 +vt 0.2877 0.0282 0.0000 +vt 0.2880 0.0542 0.0000 +vt 0.2589 0.0426 0.0000 +vt 0.8808 0.1235 0.0000 +vt 0.8346 0.0817 0.0000 +vt 0.8368 0.0598 0.0000 +vt 0.8877 0.1075 0.0000 +vt 0.9620 0.3709 0.0000 +vt 0.9757 0.3896 0.0000 +vt 0.9358 0.4281 0.0000 +vt 0.9281 0.3980 0.0000 +vt 0.8335 0.1106 0.0000 +vt 0.8735 0.1454 0.0000 +vt 0.8677 0.1719 0.0000 +vt 0.8343 0.1470 0.0000 +vt 0.8477 0.2980 0.0000 +vt 0.8859 0.3048 0.0000 +vt 0.8857 0.3604 0.0000 +vt 0.8454 0.3535 0.0000 +vt 0.9752 0.2782 0.0000 +vt 0.5804 0.4860 0.0000 +vt 0.5195 0.4846 0.0000 +vt 0.9779 0.3308 0.0000 +vt 0.8852 0.4077 0.0000 +vt 0.8865 0.4427 0.0000 +vt 0.8372 0.4347 0.0000 +vt 0.8412 0.4001 0.0000 +vt 0.9238 0.3544 0.0000 +vt 0.9209 0.3008 0.0000 +vt 0.9507 0.2883 0.0000 +vt 0.9551 0.3381 0.0000 +vt 0.7058 0.5286 0.0000 +vt 0.6460 0.5281 0.0000 +vt 0.6438 0.5067 0.0000 +vt 0.7017 0.5081 0.0000 +vt 0.8022 0.3840 0.0000 +vt 0.7970 0.4163 0.0000 +vt 0.7672 0.4005 0.0000 +vt 0.7694 0.3699 0.0000 +vt 0.7975 0.0878 0.0000 +vt 0.8004 0.1288 0.0000 +vt 0.7691 0.1199 0.0000 +vt 0.7678 0.0777 0.0000 +vt 0.8094 0.2872 0.0000 +vt 0.8069 0.3402 0.0000 +vt 0.7713 0.3288 0.0000 +vt 0.7723 0.2788 0.0000 +vt 0.1276 0.8052 0.0000 +vt 0.1289 0.7888 0.0000 +vt 0.1588 0.7894 0.0000 +vt 0.1584 0.8054 0.0000 +vt 0.7707 0.1695 0.0000 +vt 0.8044 0.1772 0.0000 +vt 0.8083 0.2312 0.0000 +vt 0.7720 0.2242 0.0000 +vt 0.8388 0.1911 0.0000 +vt 0.8707 0.2053 0.0000 +vt 0.8806 0.2508 0.0000 +vt 0.8451 0.2421 0.0000 +vt 0.8933 0.2042 0.0000 +vt 0.9096 0.1878 0.0000 +vt 0.9362 0.2356 0.0000 +vt 0.9114 0.2483 0.0000 +vt 0.0315 0.7845 0.0000 +vt 0.0857 0.7871 0.0000 +vt 0.0833 0.8045 0.0000 +vt 0.7640 0.5294 0.0000 +vt 0.0311 0.7383 0.0000 +vt 0.4530 0.5020 0.0000 +vt 0.4462 0.5264 0.0000 +vt 0.0283 0.7111 0.0000 +vt 0.5145 0.5049 0.0000 +vt 0.5808 0.5059 0.0000 +vt 0.5804 0.5278 0.0000 +vt 0.5110 0.5275 0.0000 +vt 0.1385 0.7427 0.0000 +vt 0.0854 0.7415 0.0000 +vt 0.0847 0.7122 0.0000 +vt 0.1390 0.7126 0.0000 +vt 0.9361 0.1606 0.0000 +vt 0.6395 0.4872 0.0000 +vt 0.9566 0.2231 0.0000 +vt 0.9238 0.1718 0.0000 +vt 0.2076 0.7429 0.0000 +vt 0.1796 0.7430 0.0000 +vt 0.1805 0.7127 0.0000 +vt 0.2080 0.7126 0.0000 +vt 0.7665 0.0150 0.0000 +vt 0.7956 0.0282 0.0000 +vt 0.7960 0.0542 0.0000 +vt 0.7669 0.0426 0.0000 +vt 0.6272 0.1235 0.0000 +vt 0.6202 0.1075 0.0000 +vt 0.6711 0.0598 0.0000 +vt 0.6733 0.0817 0.0000 +vt 0.5459 0.3709 0.0000 +vt 0.5798 0.3980 0.0000 +vt 0.5722 0.4281 0.0000 +vt 0.5322 0.3896 0.0000 +vt 0.6745 0.1106 0.0000 +vt 0.6736 0.1470 0.0000 +vt 0.6403 0.1719 0.0000 +vt 0.6344 0.1454 0.0000 +vt 0.6603 0.2980 0.0000 +vt 0.6626 0.3535 0.0000 +vt 0.6223 0.3604 0.0000 +vt 0.6220 0.3048 0.0000 +vt 0.5327 0.2782 0.0000 +vt 0.5300 0.3308 0.0000 +vt 0.1062 0.5939 0.0000 +vt 0.1670 0.5925 0.0000 +vt 0.6227 0.4077 0.0000 +vt 0.6667 0.4001 0.0000 +vt 0.6707 0.4347 0.0000 +vt 0.6214 0.4427 0.0000 +vt 0.5841 0.3544 0.0000 +vt 0.5529 0.3381 0.0000 +vt 0.5572 0.2883 0.0000 +vt 0.5870 0.3008 0.0000 +vt 0.2924 0.5499 0.0000 +vt 0.2884 0.5705 0.0000 +vt 0.2305 0.5719 0.0000 +vt 0.2326 0.5504 0.0000 +vt 0.7057 0.3840 0.0000 +vt 0.7386 0.3699 0.0000 +vt 0.7408 0.4005 0.0000 +vt 0.7109 0.4163 0.0000 +vt 0.7104 0.0878 0.0000 +vt 0.7402 0.0777 0.0000 +vt 0.7388 0.1199 0.0000 +vt 0.7076 0.1288 0.0000 +vt 0.6986 0.2872 0.0000 +vt 0.7357 0.2788 0.0000 +vt 0.7366 0.3288 0.0000 +vt 0.7010 0.3402 0.0000 +vt 0.2154 0.8052 0.0000 +vt 0.1846 0.8054 0.0000 +vt 0.1842 0.7894 0.0000 +vt 0.2141 0.7888 0.0000 +vt 0.7372 0.1695 0.0000 +vt 0.7359 0.2242 0.0000 +vt 0.6996 0.2312 0.0000 +vt 0.7035 0.1772 0.0000 +vt 0.6691 0.1911 0.0000 +vt 0.6629 0.2421 0.0000 +vt 0.6273 0.2508 0.0000 +vt 0.6373 0.2053 0.0000 +vt 0.6146 0.2042 0.0000 +vt 0.5966 0.2483 0.0000 +vt 0.5718 0.2356 0.0000 +vt 0.5984 0.1878 0.0000 +vt 0.3114 0.7845 0.0000 +vt 0.3506 0.5491 0.0000 +vt 0.2597 0.8045 0.0000 +vt 0.2572 0.7871 0.0000 +vt 0.4076 0.7383 0.0000 +vt 0.4104 0.7111 0.0000 +vt 0.0328 0.5521 0.0000 +vt 0.0397 0.5766 0.0000 +vt 0.1012 0.5737 0.0000 +vt 0.0977 0.5511 0.0000 +vt 0.1670 0.5507 0.0000 +vt 0.1674 0.5726 0.0000 +vt 0.3003 0.7427 0.0000 +vt 0.2997 0.7126 0.0000 +vt 0.3541 0.7122 0.0000 +vt 0.3534 0.7415 0.0000 +vt 0.5718 0.1606 0.0000 +vt 0.5841 0.1718 0.0000 +vt 0.5514 0.2231 0.0000 +vt 0.2262 0.5913 0.0000 +vt 0.2311 0.7429 0.0000 +vt 0.2307 0.7126 0.0000 +vt 0.2582 0.7127 0.0000 +vt 0.2591 0.7430 0.0000 +vt 0.7415 0.0150 0.0000 +vt 0.7411 0.0426 0.0000 +vt 0.7120 0.0542 0.0000 +vt 0.7123 0.0282 0.0000 +vt 0.0967 0.1473 0.0000 +vt 0.1157 0.1148 0.0000 +vt 0.1426 0.1012 0.0000 +vt 0.1229 0.1337 0.0000 +vt 0.0870 0.1340 0.0000 +vt 0.1089 0.1007 0.0000 +vt 0.0343 0.8514 0.0000 +vt 0.1382 0.0822 0.0000 +vt 0.1858 0.0412 0.0000 +vt 0.1644 0.0699 0.0000 +vt 0.1622 0.0503 0.0000 +vt 0.0876 0.8481 0.0000 +vt 0.1862 0.0657 0.0000 +vt 0.1661 0.0952 0.0000 +vt 0.0430 0.3572 0.0000 +vt 0.0532 0.3861 0.0000 +vt 0.0310 0.3813 0.0000 +vt 0.0271 0.3528 0.0000 +vt 0.0746 0.3781 0.0000 +vt 0.0928 0.4055 0.0000 +vt 0.0682 0.4145 0.0000 +vt 0.0599 0.4409 0.0000 +vt 0.0332 0.6424 0.0000 +vt 0.0425 0.4114 0.0000 +vt 0.0882 0.4392 0.0000 +vt 0.0174 0.3972 0.0000 +vt 0.4578 0.5880 0.0000 +vt 0.0077 0.3654 0.0000 +vt 0.4896 0.5948 0.0000 +vt 0.1855 0.0975 0.0000 +vt 0.1664 0.1279 0.0000 +vt 0.1465 0.1268 0.0000 +vt 0.1830 0.1368 0.0000 +vt 0.1640 0.1681 0.0000 +vt 0.1484 0.1590 0.0000 +vt 0.1183 0.1865 0.0000 +vt 0.1298 0.1583 0.0000 +vt 0.1327 0.1870 0.0000 +vt 0.1075 0.1659 0.0000 +vt 0.1717 0.2927 0.0000 +vt 0.1530 0.3263 0.0000 +vt 0.1330 0.3023 0.0000 +vt 0.1529 0.2696 0.0000 +vt 0.1743 0.3472 0.0000 +vt 0.1566 0.3784 0.0000 +vt 0.1345 0.3582 0.0000 +vt 0.0947 0.3593 0.0000 +vt 0.1138 0.3330 0.0000 +vt 0.1149 0.3857 0.0000 +vt 0.0960 0.3045 0.0000 +vt 0.1157 0.2770 0.0000 +vt 0.0364 0.2824 0.0000 +vt 0.0213 0.3057 0.0000 +vt 0.0134 0.2751 0.0000 +vt 0.5798 0.6015 0.0000 +vt 0.0320 0.2502 0.0000 +vt 0.0328 0.3316 0.0000 +vt 0.0115 0.3329 0.0000 +vt 0.5221 0.6030 0.0000 +vt 0.5169 0.5839 0.0000 +vt 0.5497 0.5928 0.0000 +vt 0.5807 0.5826 0.0000 +vt 0.6106 0.5918 0.0000 +vt 0.1371 0.4056 0.0000 +vt 0.1143 0.4266 0.0000 +vt 0.1792 0.3925 0.0000 +vt 0.1609 0.4187 0.0000 +vt 0.1649 0.4494 0.0000 +vt 0.1382 0.6367 0.0000 +vt 0.1388 0.4409 0.0000 +vt 0.1847 0.4260 0.0000 +vt 0.1126 0.4579 0.0000 +vt 0.0859 0.6383 0.0000 +vt 0.0594 0.3467 0.0000 +vt 0.0773 0.3282 0.0000 +vt 0.0463 0.3145 0.0000 +vt 0.0549 0.2614 0.0000 +vt 0.0635 0.2950 0.0000 +vt 0.0826 0.2738 0.0000 +vt 0.7348 0.5493 0.0000 +vt 0.7042 0.5601 0.0000 +vt 0.6763 0.5500 0.0000 +vt 0.7063 0.5391 0.0000 +vt 0.7299 0.5693 0.0000 +vt 0.0033 0.8435 0.0000 +vt 0.6989 0.5802 0.0000 +vt 0.0583 0.1561 0.0000 +vt 0.6732 0.5710 0.0000 +vt 0.6131 0.5721 0.0000 +vt 0.6452 0.5611 0.0000 +vt 0.6420 0.5817 0.0000 +vt 0.6141 0.5503 0.0000 +vt 0.6462 0.5391 0.0000 +vt 0.1952 0.3636 0.0000 +vt 0.2147 0.3759 0.0000 +vt 0.2004 0.4014 0.0000 +vt 0.2296 0.3507 0.0000 +vt 0.2460 0.3675 0.0000 +vt 0.2318 0.3864 0.0000 +vt 0.2340 0.4129 0.0000 +vt 0.2073 0.6363 0.0000 +vt 0.2189 0.4071 0.0000 +vt 0.2460 0.3977 0.0000 +vt 0.2057 0.4297 0.0000 +vt 0.1791 0.6363 0.0000 +vt 0.2034 0.0700 0.0000 +vt 0.2179 0.0813 0.0000 +vt 0.2012 0.1074 0.0000 +vt 0.2327 0.0593 0.0000 +vt 0.2460 0.0766 0.0000 +vt 0.2316 0.0979 0.0000 +vt 0.2301 0.1438 0.0000 +vt 0.2155 0.1232 0.0000 +vt 0.2460 0.1188 0.0000 +vt 0.1977 0.1521 0.0000 +vt 0.1907 0.2592 0.0000 +vt 0.2093 0.2823 0.0000 +vt 0.1915 0.3144 0.0000 +vt 0.2277 0.2518 0.0000 +vt 0.2460 0.2775 0.0000 +vt 0.2281 0.3046 0.0000 +vt 0.2111 0.3336 0.0000 +vt 0.2460 0.3268 0.0000 +vt 0.1273 0.8133 0.0000 +vt 0.1441 0.8213 0.0000 +vt 0.1281 0.8296 0.0000 +vt 0.1075 0.8217 0.0000 +vt 0.1583 0.8133 0.0000 +vt 0.1715 0.8212 0.0000 +vt 0.1586 0.8292 0.0000 +vt 0.1591 0.8453 0.0000 +vt 0.2337 0.0027 0.0000 +vt 0.1451 0.8374 0.0000 +vt 0.1715 0.8372 0.0000 +vt 0.1300 0.8460 0.0000 +vt 0.2046 0.0166 0.0000 +vt 0.1096 0.8385 0.0000 +vt 0.2460 0.1685 0.0000 +vt 0.2286 0.1966 0.0000 +vt 0.2125 0.1725 0.0000 +vt 0.2460 0.2232 0.0000 +vt 0.2099 0.2270 0.0000 +vt 0.1734 0.2364 0.0000 +vt 0.1934 0.2037 0.0000 +vt 0.1784 0.1835 0.0000 +vt 0.1579 0.2158 0.0000 +vt 0.1445 0.1988 0.0000 +vt 0.1368 0.2473 0.0000 +vt 0.1032 0.2514 0.0000 +vt 0.1242 0.2267 0.0000 +vt 0.1166 0.2080 0.0000 +vt 0.0968 0.2250 0.0000 +vt 0.0982 0.1966 0.0000 +vt 0.0756 0.2426 0.0000 +vt 0.0532 0.2287 0.0000 +vt 0.0758 0.2110 0.0000 +vt 0.0831 0.1792 0.0000 +vt 0.0289 0.8328 0.0000 +vt 0.7626 0.5586 0.0000 +vt 0.0593 0.8408 0.0000 +vt 0.7647 0.5391 0.0000 +vt 0.7933 0.5484 0.0000 +vt 0.0567 0.8225 0.0000 +vt 0.0843 0.8308 0.0000 +vt 0.0828 0.8133 0.0000 +vt 0.0577 0.6536 0.0000 +vt 0.0293 0.6688 0.0000 +vt 0.0050 0.6576 0.0000 +vt 0.4243 0.5784 0.0000 +vt 0.0561 0.6821 0.0000 +vt 0.0280 0.6969 0.0000 +vt 0.0009 0.6834 0.0000 +vt 0.4156 0.5526 0.0000 +vt 0.4776 0.5512 0.0000 +vt 0.4488 0.5643 0.0000 +vt 0.4451 0.5391 0.0000 +vt 0.4827 0.5745 0.0000 +vt 0.5125 0.5623 0.0000 +vt 0.5475 0.5728 0.0000 +vt 0.5105 0.5391 0.0000 +vt 0.5457 0.5506 0.0000 +vt 0.5806 0.5616 0.0000 +vt 0.5803 0.5391 0.0000 +vt 0.1613 0.6509 0.0000 +vt 0.1389 0.6658 0.0000 +vt 0.1128 0.6515 0.0000 +vt 0.1620 0.6811 0.0000 +vt 0.1391 0.6969 0.0000 +vt 0.1128 0.6813 0.0000 +vt 0.0849 0.6667 0.0000 +vt 0.0846 0.6969 0.0000 +vt 0.0697 0.1656 0.0000 +vt 0.0418 0.1872 0.0000 +vt 0.6678 0.5902 0.0000 +vt 0.0581 0.1970 0.0000 +vt 0.0338 0.2181 0.0000 +vt 0.6369 0.6001 0.0000 +vt 0.2194 0.6509 0.0000 +vt 0.2079 0.6658 0.0000 +vt 0.1948 0.6509 0.0000 +vt 0.2194 0.6812 0.0000 +vt 0.2080 0.6969 0.0000 +vt 0.1954 0.6812 0.0000 +vt 0.1802 0.6657 0.0000 +vt 0.1805 0.6969 0.0000 +vt 0.2460 0.0135 0.0000 +vt 0.2334 0.0279 0.0000 +vt 0.2200 0.0194 0.0000 +vt 0.2460 0.0414 0.0000 +vt 0.2194 0.0467 0.0000 +vt 0.2043 0.0402 0.0000 +vt 0.3692 0.1337 0.0000 +vt 0.3495 0.1012 0.0000 +vt 0.3763 0.1148 0.0000 +vt 0.3953 0.1473 0.0000 +vt 0.3260 0.0952 0.0000 +vt 0.3059 0.0657 0.0000 +vt 0.3277 0.0699 0.0000 +vt 0.3299 0.0503 0.0000 +vt 0.2553 0.8481 0.0000 +vt 0.3538 0.0822 0.0000 +vt 0.3062 0.0412 0.0000 +vt 0.3832 0.1007 0.0000 +vt 0.3086 0.8515 0.0000 +vt 0.4050 0.1340 0.0000 +vt 0.4650 0.3528 0.0000 +vt 0.4610 0.3813 0.0000 +vt 0.4389 0.3861 0.0000 +vt 0.4490 0.3572 0.0000 +vt 0.4843 0.3654 0.0000 +vt 0.0762 0.4836 0.0000 +vt 0.4747 0.3972 0.0000 +vt 0.0445 0.4904 0.0000 +vt 0.4496 0.4114 0.0000 +vt 0.4038 0.4392 0.0000 +vt 0.4238 0.4145 0.0000 +vt 0.4322 0.4409 0.0000 +vt 0.4055 0.6424 0.0000 +vt 0.3993 0.4055 0.0000 +vt 0.4174 0.3781 0.0000 +vt 0.3456 0.1268 0.0000 +vt 0.3256 0.1279 0.0000 +vt 0.3066 0.0975 0.0000 +vt 0.3846 0.1659 0.0000 +vt 0.3623 0.1583 0.0000 +vt 0.3593 0.1870 0.0000 +vt 0.3436 0.1590 0.0000 +vt 0.3738 0.1865 0.0000 +vt 0.3281 0.1681 0.0000 +vt 0.3090 0.1368 0.0000 +vt 0.3392 0.2696 0.0000 +vt 0.3591 0.3023 0.0000 +vt 0.3390 0.3263 0.0000 +vt 0.3204 0.2927 0.0000 +vt 0.3763 0.2770 0.0000 +vt 0.3961 0.3045 0.0000 +vt 0.3782 0.3330 0.0000 +vt 0.3772 0.3857 0.0000 +vt 0.3576 0.3582 0.0000 +vt 0.3973 0.3593 0.0000 +vt 0.3354 0.3784 0.0000 +vt 0.3178 0.3472 0.0000 +vt 0.4601 0.2502 0.0000 +vt 0.4787 0.2751 0.0000 +vt 0.1665 0.4757 0.0000 +vt 0.4708 0.3057 0.0000 +vt 0.4556 0.2824 0.0000 +vt 0.1973 0.4856 0.0000 +vt 0.1674 0.4950 0.0000 +vt 0.1363 0.4849 0.0000 +vt 0.1088 0.4748 0.0000 +vt 0.4806 0.3329 0.0000 +vt 0.1035 0.4942 0.0000 +vt 0.4593 0.3316 0.0000 +vt 0.3778 0.4266 0.0000 +vt 0.3550 0.4056 0.0000 +vt 0.3795 0.4579 0.0000 +vt 0.3528 0.6383 0.0000 +vt 0.3533 0.4409 0.0000 +vt 0.3074 0.4260 0.0000 +vt 0.3312 0.4187 0.0000 +vt 0.3272 0.4494 0.0000 +vt 0.3005 0.6367 0.0000 +vt 0.3128 0.3925 0.0000 +vt 0.4148 0.3282 0.0000 +vt 0.4327 0.3467 0.0000 +vt 0.4095 0.2738 0.0000 +vt 0.4285 0.2950 0.0000 +vt 0.4458 0.3145 0.0000 +vt 0.4371 0.2614 0.0000 +vt 0.2930 0.5393 0.0000 +vt 0.2630 0.5284 0.0000 +vt 0.2909 0.5182 0.0000 +vt 0.3215 0.5291 0.0000 +vt 0.2329 0.5393 0.0000 +vt 0.2008 0.5279 0.0000 +vt 0.2318 0.5170 0.0000 +vt 0.2287 0.4960 0.0000 +vt 0.2599 0.5070 0.0000 +vt 0.1998 0.5058 0.0000 +vt 0.2855 0.4979 0.0000 +vt 0.4337 0.1561 0.0000 +vt 0.3166 0.5091 0.0000 +vt 0.3396 0.8436 0.0000 +vt 0.2917 0.4014 0.0000 +vt 0.2773 0.3759 0.0000 +vt 0.2968 0.3636 0.0000 +vt 0.2863 0.4297 0.0000 +vt 0.2596 0.6363 0.0000 +vt 0.2732 0.4071 0.0000 +vt 0.2603 0.3864 0.0000 +vt 0.2581 0.4129 0.0000 +vt 0.2314 0.6363 0.0000 +vt 0.2625 0.3507 0.0000 +vt 0.2909 0.1074 0.0000 +vt 0.2742 0.0813 0.0000 +vt 0.2886 0.0700 0.0000 +vt 0.2943 0.1521 0.0000 +vt 0.2766 0.1232 0.0000 +vt 0.2605 0.0979 0.0000 +vt 0.2620 0.1438 0.0000 +vt 0.2593 0.0593 0.0000 +vt 0.3006 0.3144 0.0000 +vt 0.2828 0.2823 0.0000 +vt 0.3014 0.2592 0.0000 +vt 0.2809 0.3336 0.0000 +vt 0.2640 0.3046 0.0000 +vt 0.2644 0.2518 0.0000 +vt 0.2354 0.8217 0.0000 +vt 0.2148 0.8296 0.0000 +vt 0.1988 0.8213 0.0000 +vt 0.2156 0.8133 0.0000 +vt 0.2334 0.8385 0.0000 +vt 0.2129 0.8460 0.0000 +vt 0.2875 0.0166 0.0000 +vt 0.1979 0.8374 0.0000 +vt 0.1844 0.8292 0.0000 +vt 0.1838 0.8453 0.0000 +vt 0.2584 0.0027 0.0000 +vt 0.1847 0.8133 0.0000 +vt 0.2796 0.1725 0.0000 +vt 0.2635 0.1966 0.0000 +vt 0.3136 0.1835 0.0000 +vt 0.2986 0.2037 0.0000 +vt 0.2822 0.2270 0.0000 +vt 0.3187 0.2364 0.0000 +vt 0.3475 0.1988 0.0000 +vt 0.3341 0.2158 0.0000 +vt 0.3755 0.2080 0.0000 +vt 0.3678 0.2267 0.0000 +vt 0.3553 0.2473 0.0000 +vt 0.3889 0.2514 0.0000 +vt 0.3938 0.1966 0.0000 +vt 0.3952 0.2250 0.0000 +vt 0.4090 0.1792 0.0000 +vt 0.4163 0.2110 0.0000 +vt 0.4165 0.2426 0.0000 +vt 0.4389 0.2287 0.0000 +vt 0.2837 0.8408 0.0000 +vt 0.3141 0.8328 0.0000 +vt 0.3492 0.5199 0.0000 +vt 0.2587 0.8308 0.0000 +vt 0.2601 0.8133 0.0000 +vt 0.2863 0.8225 0.0000 +vt 0.3799 0.5302 0.0000 +vt 0.3514 0.5394 0.0000 +vt 0.4337 0.6576 0.0000 +vt 0.0110 0.5001 0.0000 +vt 0.4094 0.6688 0.0000 +vt 0.3810 0.6536 0.0000 +vt 0.0694 0.5038 0.0000 +vt 0.0355 0.5142 0.0000 +vt 0.0318 0.5394 0.0000 +vt 0.0023 0.5259 0.0000 +vt 0.4378 0.6834 0.0000 +vt 0.0643 0.5273 0.0000 +vt 0.4108 0.6969 0.0000 +vt 0.3826 0.6821 0.0000 +vt 0.1342 0.5053 0.0000 +vt 0.0992 0.5160 0.0000 +vt 0.1673 0.5165 0.0000 +vt 0.1669 0.5393 0.0000 +vt 0.1323 0.5277 0.0000 +vt 0.0972 0.5393 0.0000 +vt 0.3259 0.6515 0.0000 +vt 0.2999 0.6658 0.0000 +vt 0.2775 0.6509 0.0000 +vt 0.3538 0.6667 0.0000 +vt 0.3542 0.6969 0.0000 +vt 0.3259 0.6813 0.0000 +vt 0.2997 0.6969 0.0000 +vt 0.2767 0.6811 0.0000 +vt 0.4502 0.1872 0.0000 +vt 0.2545 0.4874 0.0000 +vt 0.4224 0.1656 0.0000 +vt 0.2236 0.4771 0.0000 +vt 0.4583 0.2181 0.0000 +vt 0.4339 0.1970 0.0000 +vt 0.2439 0.6509 0.0000 +vt 0.2309 0.6658 0.0000 +vt 0.2585 0.6657 0.0000 +vt 0.2582 0.6969 0.0000 +vt 0.2433 0.6812 0.0000 +vt 0.2307 0.6969 0.0000 +vt 0.2720 0.0194 0.0000 +vt 0.2587 0.0279 0.0000 +vt 0.2877 0.0402 0.0000 +vt 0.2727 0.0467 0.0000 +vt 0.8771 0.1337 0.0000 +vt 0.8574 0.1012 0.0000 +vt 0.8843 0.1148 0.0000 +vt 0.9033 0.1473 0.0000 +vt 0.8339 0.0952 0.0000 +vt 0.8138 0.0657 0.0000 +vt 0.8356 0.0699 0.0000 +vt 0.8378 0.0503 0.0000 +vt 0.0876 0.7785 0.0000 +vt 0.8618 0.0822 0.0000 +vt 0.8142 0.0412 0.0000 +vt 0.8911 0.1007 0.0000 +vt 0.0343 0.7752 0.0000 +vt 0.9130 0.1340 0.0000 +vt 0.9729 0.3528 0.0000 +vt 0.9690 0.3813 0.0000 +vt 0.9468 0.3861 0.0000 +vt 0.9570 0.3572 0.0000 +vt 0.9923 0.3654 0.0000 +vt 0.4896 0.4835 0.0000 +vt 0.9826 0.3972 0.0000 +vt 0.4578 0.4902 0.0000 +vt 0.9575 0.4114 0.0000 +vt 0.9118 0.4392 0.0000 +vt 0.9318 0.4145 0.0000 +vt 0.9401 0.4409 0.0000 +vt 0.0332 0.7514 0.0000 +vt 0.9072 0.4055 0.0000 +vt 0.9254 0.3781 0.0000 +vt 0.8535 0.1268 0.0000 +vt 0.8336 0.1279 0.0000 +vt 0.8145 0.0975 0.0000 +vt 0.8925 0.1659 0.0000 +vt 0.8702 0.1583 0.0000 +vt 0.8673 0.1870 0.0000 +vt 0.8516 0.1590 0.0000 +vt 0.8817 0.1865 0.0000 +vt 0.8360 0.1681 0.0000 +vt 0.8170 0.1368 0.0000 +vt 0.8471 0.2696 0.0000 +vt 0.8670 0.3023 0.0000 +vt 0.8470 0.3263 0.0000 +vt 0.8283 0.2927 0.0000 +vt 0.8843 0.2770 0.0000 +vt 0.9040 0.3045 0.0000 +vt 0.8862 0.3330 0.0000 +vt 0.8851 0.3857 0.0000 +vt 0.8655 0.3582 0.0000 +vt 0.9053 0.3593 0.0000 +vt 0.8434 0.3784 0.0000 +vt 0.8257 0.3472 0.0000 +vt 0.9680 0.2502 0.0000 +vt 0.9866 0.2751 0.0000 +vt 0.5798 0.4768 0.0000 +vt 0.9787 0.3057 0.0000 +vt 0.9636 0.2824 0.0000 +vt 0.6106 0.4865 0.0000 +vt 0.5807 0.4956 0.0000 +vt 0.5497 0.4855 0.0000 +vt 0.5221 0.4753 0.0000 +vt 0.9885 0.3329 0.0000 +vt 0.5169 0.4944 0.0000 +vt 0.9672 0.3316 0.0000 +vt 0.8857 0.4266 0.0000 +vt 0.8629 0.4056 0.0000 +vt 0.8874 0.4579 0.0000 +vt 0.0859 0.7555 0.0000 +vt 0.8612 0.4409 0.0000 +vt 0.8153 0.4260 0.0000 +vt 0.8391 0.4187 0.0000 +vt 0.8351 0.4494 0.0000 +vt 0.1382 0.7571 0.0000 +vt 0.8208 0.3925 0.0000 +vt 0.9227 0.3282 0.0000 +vt 0.9406 0.3467 0.0000 +vt 0.9174 0.2738 0.0000 +vt 0.9365 0.2950 0.0000 +vt 0.9537 0.3145 0.0000 +vt 0.9451 0.2614 0.0000 +vt 0.6763 0.5283 0.0000 +vt 0.7042 0.5182 0.0000 +vt 0.7348 0.5289 0.0000 +vt 0.6141 0.5279 0.0000 +vt 0.6452 0.5172 0.0000 +vt 0.6420 0.4966 0.0000 +vt 0.6732 0.5073 0.0000 +vt 0.6131 0.5062 0.0000 +vt 0.6989 0.4981 0.0000 +vt 0.9417 0.1561 0.0000 +vt 0.7299 0.5089 0.0000 +vt 0.0033 0.7831 0.0000 +vt 0.7996 0.4014 0.0000 +vt 0.7853 0.3759 0.0000 +vt 0.8048 0.3636 0.0000 +vt 0.7943 0.4297 0.0000 +vt 0.1791 0.7575 0.0000 +vt 0.7811 0.4071 0.0000 +vt 0.7540 0.3977 0.0000 +vt 0.7682 0.3864 0.0000 +vt 0.7660 0.4129 0.0000 +vt 0.2073 0.7575 0.0000 +vt 0.7540 0.3675 0.0000 +vt 0.7704 0.3507 0.0000 +vt 0.7988 0.1074 0.0000 +vt 0.7821 0.0813 0.0000 +vt 0.7966 0.0700 0.0000 +vt 0.8023 0.1521 0.0000 +vt 0.7845 0.1232 0.0000 +vt 0.7540 0.1188 0.0000 +vt 0.7684 0.0979 0.0000 +vt 0.7699 0.1438 0.0000 +vt 0.7540 0.0766 0.0000 +vt 0.7673 0.0593 0.0000 +vt 0.8085 0.3144 0.0000 +vt 0.7907 0.2823 0.0000 +vt 0.8093 0.2592 0.0000 +vt 0.7889 0.3336 0.0000 +vt 0.7540 0.3268 0.0000 +vt 0.7719 0.3046 0.0000 +vt 0.7540 0.2775 0.0000 +vt 0.7723 0.2518 0.0000 +vt 0.1075 0.8049 0.0000 +vt 0.1281 0.7970 0.0000 +vt 0.1441 0.8053 0.0000 +vt 0.1096 0.7881 0.0000 +vt 0.1300 0.7806 0.0000 +vt 0.7954 0.0166 0.0000 +vt 0.1451 0.7892 0.0000 +vt 0.1715 0.7894 0.0000 +vt 0.1586 0.7974 0.0000 +vt 0.1591 0.7813 0.0000 +vt 0.7663 0.0027 0.0000 +vt 0.1715 0.8054 0.0000 +vt 0.7875 0.1725 0.0000 +vt 0.7714 0.1966 0.0000 +vt 0.7540 0.1685 0.0000 +vt 0.8216 0.1835 0.0000 +vt 0.8066 0.2037 0.0000 +vt 0.7901 0.2270 0.0000 +vt 0.8266 0.2364 0.0000 +vt 0.7540 0.2232 0.0000 +vt 0.8555 0.1988 0.0000 +vt 0.8421 0.2158 0.0000 +vt 0.8834 0.2080 0.0000 +vt 0.8758 0.2267 0.0000 +vt 0.8632 0.2473 0.0000 +vt 0.8968 0.2514 0.0000 +vt 0.9018 0.1966 0.0000 +vt 0.9032 0.2250 0.0000 +vt 0.9169 0.1792 0.0000 +vt 0.9242 0.2110 0.0000 +vt 0.9244 0.2426 0.0000 +vt 0.9468 0.2287 0.0000 +vt 0.0593 0.7858 0.0000 +vt 0.0289 0.7938 0.0000 +vt 0.7626 0.5196 0.0000 +vt 0.0843 0.7958 0.0000 +vt 0.0567 0.8041 0.0000 +vt 0.7933 0.5299 0.0000 +vt 0.0050 0.7362 0.0000 +vt 0.4243 0.4999 0.0000 +vt 0.0293 0.7250 0.0000 +vt 0.0577 0.7402 0.0000 +vt 0.4827 0.5037 0.0000 +vt 0.4488 0.5140 0.0000 +vt 0.4156 0.5257 0.0000 +vt 0.0009 0.7104 0.0000 +vt 0.4776 0.5271 0.0000 +vt 0.0561 0.7117 0.0000 +vt 0.5475 0.5055 0.0000 +vt 0.5125 0.5160 0.0000 +vt 0.5806 0.5167 0.0000 +vt 0.5457 0.5277 0.0000 +vt 0.1128 0.7423 0.0000 +vt 0.1389 0.7280 0.0000 +vt 0.1613 0.7429 0.0000 +vt 0.0849 0.7271 0.0000 +vt 0.1128 0.7125 0.0000 +vt 0.1620 0.7127 0.0000 +vt 0.9582 0.1872 0.0000 +vt 0.6678 0.4880 0.0000 +vt 0.9303 0.1656 0.0000 +vt 0.6369 0.4782 0.0000 +vt 0.9662 0.2181 0.0000 +vt 0.9419 0.1970 0.0000 +vt 0.1948 0.7429 0.0000 +vt 0.2079 0.7280 0.0000 +vt 0.2194 0.7429 0.0000 +vt 0.1802 0.7281 0.0000 +vt 0.1954 0.7126 0.0000 +vt 0.2194 0.7126 0.0000 +vt 0.7800 0.0194 0.0000 +vt 0.7666 0.0279 0.0000 +vt 0.7540 0.0135 0.0000 +vt 0.7957 0.0402 0.0000 +vt 0.7806 0.0467 0.0000 +vt 0.7540 0.0414 0.0000 +vt 0.6047 0.1473 0.0000 +vt 0.6237 0.1148 0.0000 +vt 0.6505 0.1012 0.0000 +vt 0.6308 0.1337 0.0000 +vt 0.5950 0.1340 0.0000 +vt 0.6168 0.1007 0.0000 +vt 0.3086 0.7752 0.0000 +vt 0.6462 0.0822 0.0000 +vt 0.6938 0.0412 0.0000 +vt 0.6723 0.0699 0.0000 +vt 0.6701 0.0503 0.0000 +vt 0.2553 0.7785 0.0000 +vt 0.6941 0.0657 0.0000 +vt 0.6740 0.0952 0.0000 +vt 0.5510 0.3572 0.0000 +vt 0.5611 0.3861 0.0000 +vt 0.5390 0.3813 0.0000 +vt 0.5350 0.3528 0.0000 +vt 0.5826 0.3781 0.0000 +vt 0.6007 0.4055 0.0000 +vt 0.5762 0.4145 0.0000 +vt 0.5678 0.4409 0.0000 +vt 0.4055 0.7514 0.0000 +vt 0.5504 0.4114 0.0000 +vt 0.5962 0.4392 0.0000 +vt 0.5253 0.3972 0.0000 +vt 0.0445 0.5883 0.0000 +vt 0.5157 0.3654 0.0000 +vt 0.0762 0.5950 0.0000 +vt 0.6934 0.0975 0.0000 +vt 0.6744 0.1279 0.0000 +vt 0.6544 0.1268 0.0000 +vt 0.6910 0.1368 0.0000 +vt 0.6719 0.1681 0.0000 +vt 0.6564 0.1590 0.0000 +vt 0.6262 0.1865 0.0000 +vt 0.6377 0.1583 0.0000 +vt 0.6407 0.1870 0.0000 +vt 0.6154 0.1659 0.0000 +vt 0.6796 0.2927 0.0000 +vt 0.6610 0.3263 0.0000 +vt 0.6409 0.3023 0.0000 +vt 0.6608 0.2696 0.0000 +vt 0.6822 0.3472 0.0000 +vt 0.6646 0.3784 0.0000 +vt 0.6424 0.3582 0.0000 +vt 0.6027 0.3593 0.0000 +vt 0.6218 0.3330 0.0000 +vt 0.6228 0.3857 0.0000 +vt 0.6039 0.3045 0.0000 +vt 0.6237 0.2770 0.0000 +vt 0.5444 0.2824 0.0000 +vt 0.5292 0.3057 0.0000 +vt 0.5213 0.2751 0.0000 +vt 0.1665 0.6018 0.0000 +vt 0.5399 0.2502 0.0000 +vt 0.5407 0.3316 0.0000 +vt 0.5194 0.3329 0.0000 +vt 0.1088 0.6033 0.0000 +vt 0.1035 0.5842 0.0000 +vt 0.1363 0.5930 0.0000 +vt 0.1674 0.5829 0.0000 +vt 0.1973 0.5920 0.0000 +vt 0.6450 0.4056 0.0000 +vt 0.6222 0.4266 0.0000 +vt 0.6872 0.3925 0.0000 +vt 0.6688 0.4187 0.0000 +vt 0.6728 0.4494 0.0000 +vt 0.3005 0.7571 0.0000 +vt 0.6467 0.4409 0.0000 +vt 0.6926 0.4260 0.0000 +vt 0.6205 0.4579 0.0000 +vt 0.3528 0.7555 0.0000 +vt 0.5673 0.3467 0.0000 +vt 0.5852 0.3282 0.0000 +vt 0.5542 0.3145 0.0000 +vt 0.5629 0.2614 0.0000 +vt 0.5715 0.2950 0.0000 +vt 0.5905 0.2738 0.0000 +vt 0.3215 0.5496 0.0000 +vt 0.2909 0.5604 0.0000 +vt 0.2630 0.5502 0.0000 +vt 0.3166 0.5696 0.0000 +vt 0.3396 0.7831 0.0000 +vt 0.2855 0.5805 0.0000 +vt 0.5663 0.1561 0.0000 +vt 0.2599 0.5713 0.0000 +vt 0.1998 0.5723 0.0000 +vt 0.2318 0.5613 0.0000 +vt 0.2287 0.5819 0.0000 +vt 0.2008 0.5505 0.0000 +vt 0.7032 0.3636 0.0000 +vt 0.7227 0.3759 0.0000 +vt 0.7083 0.4014 0.0000 +vt 0.7375 0.3507 0.0000 +vt 0.7397 0.3864 0.0000 +vt 0.7419 0.4129 0.0000 +vt 0.2314 0.7575 0.0000 +vt 0.7268 0.4071 0.0000 +vt 0.7137 0.4297 0.0000 +vt 0.2596 0.7575 0.0000 +vt 0.7114 0.0700 0.0000 +vt 0.7258 0.0813 0.0000 +vt 0.7091 0.1074 0.0000 +vt 0.7407 0.0593 0.0000 +vt 0.7395 0.0979 0.0000 +vt 0.7380 0.1438 0.0000 +vt 0.7234 0.1232 0.0000 +vt 0.7057 0.1521 0.0000 +vt 0.6986 0.2592 0.0000 +vt 0.7172 0.2823 0.0000 +vt 0.6994 0.3144 0.0000 +vt 0.7356 0.2518 0.0000 +vt 0.7360 0.3046 0.0000 +vt 0.7191 0.3336 0.0000 +vt 0.1988 0.8053 0.0000 +vt 0.2148 0.7970 0.0000 +vt 0.2354 0.8049 0.0000 +vt 0.1844 0.7974 0.0000 +vt 0.1838 0.7813 0.0000 +vt 0.7416 0.0027 0.0000 +vt 0.1979 0.7892 0.0000 +vt 0.2129 0.7806 0.0000 +vt 0.7125 0.0166 0.0000 +vt 0.2334 0.7881 0.0000 +vt 0.7365 0.1966 0.0000 +vt 0.7204 0.1725 0.0000 +vt 0.7178 0.2270 0.0000 +vt 0.6813 0.2364 0.0000 +vt 0.7014 0.2037 0.0000 +vt 0.6864 0.1835 0.0000 +vt 0.6659 0.2158 0.0000 +vt 0.6525 0.1988 0.0000 +vt 0.6447 0.2473 0.0000 +vt 0.6111 0.2514 0.0000 +vt 0.6322 0.2267 0.0000 +vt 0.6245 0.2080 0.0000 +vt 0.6048 0.2250 0.0000 +vt 0.6062 0.1966 0.0000 +vt 0.5835 0.2426 0.0000 +vt 0.5611 0.2287 0.0000 +vt 0.5837 0.2110 0.0000 +vt 0.5910 0.1792 0.0000 +vt 0.3141 0.7938 0.0000 +vt 0.3492 0.5589 0.0000 +vt 0.2837 0.7858 0.0000 +vt 0.3799 0.5487 0.0000 +vt 0.2863 0.8041 0.0000 +vt 0.2587 0.7958 0.0000 +vt 0.3810 0.7402 0.0000 +vt 0.4094 0.7250 0.0000 +vt 0.4337 0.7362 0.0000 +vt 0.0110 0.5787 0.0000 +vt 0.3826 0.7117 0.0000 +vt 0.4378 0.7104 0.0000 +vt 0.0023 0.5529 0.0000 +vt 0.0643 0.5515 0.0000 +vt 0.0355 0.5646 0.0000 +vt 0.0694 0.5748 0.0000 +vt 0.0992 0.5626 0.0000 +vt 0.1342 0.5730 0.0000 +vt 0.1323 0.5508 0.0000 +vt 0.1673 0.5618 0.0000 +vt 0.2775 0.7429 0.0000 +vt 0.2999 0.7280 0.0000 +vt 0.3259 0.7423 0.0000 +vt 0.2767 0.7127 0.0000 +vt 0.3259 0.7125 0.0000 +vt 0.3538 0.7271 0.0000 +vt 0.5776 0.1656 0.0000 +vt 0.5498 0.1872 0.0000 +vt 0.2545 0.5905 0.0000 +vt 0.5661 0.1970 0.0000 +vt 0.5417 0.2181 0.0000 +vt 0.2236 0.6004 0.0000 +vt 0.2309 0.7280 0.0000 +vt 0.2439 0.7429 0.0000 +vt 0.2433 0.7126 0.0000 +vt 0.2585 0.7281 0.0000 +vt 0.7413 0.0279 0.0000 +vt 0.7280 0.0194 0.0000 +vt 0.7273 0.0467 0.0000 +vt 0.7123 0.0402 0.0000 +vt 0.1100 0.1397 0.0000 +vt 0.1056 0.1311 0.0000 +vt 0.1295 0.1072 0.0000 +vt 0.1323 0.1174 0.0000 +vt 0.1015 0.1239 0.0000 +vt 0.0973 0.1176 0.0000 +vt 0.1240 0.0907 0.0000 +vt 0.1266 0.0985 0.0000 +vt 0.1749 0.0445 0.0000 +vt 0.1752 0.0552 0.0000 +vt 0.1517 0.0752 0.0000 +vt 0.1501 0.0661 0.0000 +vt 0.1759 0.0667 0.0000 +vt 0.1762 0.0801 0.0000 +vt 0.1548 0.0972 0.0000 +vt 0.1534 0.0853 0.0000 +vt 0.0353 0.3575 0.0000 +vt 0.0476 0.3715 0.0000 +vt 0.0422 0.3853 0.0000 +vt 0.0277 0.3668 0.0000 +vt 0.0640 0.3836 0.0000 +vt 0.0833 0.3924 0.0000 +vt 0.0807 0.4115 0.0000 +vt 0.0600 0.4006 0.0000 +vt 0.0743 0.4418 0.0000 +vt 0.0502 0.4265 0.0000 +vt 0.0555 0.4143 0.0000 +vt 0.0777 0.4273 0.0000 +vt 0.0296 0.4058 0.0000 +vt 0.0123 0.3806 0.0000 +vt 0.0195 0.3745 0.0000 +vt 0.0362 0.3961 0.0000 +vt 0.1763 0.0953 0.0000 +vt 0.1760 0.1124 0.0000 +vt 0.1570 0.1263 0.0000 +vt 0.1561 0.1109 0.0000 +vt 0.1751 0.1314 0.0000 +vt 0.1735 0.1523 0.0000 +vt 0.1564 0.1626 0.0000 +vt 0.1572 0.1436 0.0000 +vt 0.1264 0.1846 0.0000 +vt 0.1232 0.1730 0.0000 +vt 0.1396 0.1574 0.0000 +vt 0.1403 0.1736 0.0000 +vt 0.1190 0.1612 0.0000 +vt 0.1145 0.1499 0.0000 +vt 0.1351 0.1293 0.0000 +vt 0.1376 0.1428 0.0000 +vt 0.1620 0.2811 0.0000 +vt 0.1623 0.3096 0.0000 +vt 0.1428 0.3146 0.0000 +vt 0.1428 0.2861 0.0000 +vt 0.1636 0.3373 0.0000 +vt 0.1656 0.3632 0.0000 +vt 0.1454 0.3690 0.0000 +vt 0.1438 0.3426 0.0000 +vt 0.1045 0.3732 0.0000 +vt 0.1043 0.3469 0.0000 +vt 0.1239 0.3461 0.0000 +vt 0.1249 0.3727 0.0000 +vt 0.1045 0.3191 0.0000 +vt 0.1057 0.2911 0.0000 +vt 0.1239 0.2897 0.0000 +vt 0.1234 0.3180 0.0000 +vt 0.0335 0.2663 0.0000 +vt 0.0284 0.2937 0.0000 +vt 0.0165 0.2910 0.0000 +vt 0.0222 0.2622 0.0000 +vt 0.0268 0.3192 0.0000 +vt 0.0286 0.3408 0.0000 +vt 0.0188 0.3444 0.0000 +vt 0.0153 0.3186 0.0000 +vt 0.5027 0.5894 0.0000 +vt 0.5336 0.5884 0.0000 +vt 0.5353 0.5978 0.0000 +vt 0.5063 0.5989 0.0000 +vt 0.5649 0.5877 0.0000 +vt 0.5961 0.5873 0.0000 +vt 0.5952 0.5967 0.0000 +vt 0.5650 0.5971 0.0000 +vt 0.1042 0.3967 0.0000 +vt 0.1257 0.3965 0.0000 +vt 0.1261 0.4170 0.0000 +vt 0.1031 0.4169 0.0000 +vt 0.1472 0.3926 0.0000 +vt 0.1680 0.3862 0.0000 +vt 0.1705 0.4061 0.0000 +vt 0.1488 0.4130 0.0000 +vt 0.1756 0.4378 0.0000 +vt 0.1517 0.4460 0.0000 +vt 0.1503 0.4303 0.0000 +vt 0.1729 0.4230 0.0000 +vt 0.1263 0.4502 0.0000 +vt 0.0998 0.4497 0.0000 +vt 0.1016 0.4339 0.0000 +vt 0.1262 0.4345 0.0000 +vt 0.0849 0.3698 0.0000 +vt 0.0667 0.3627 0.0000 +vt 0.0682 0.3382 0.0000 +vt 0.0856 0.3442 0.0000 +vt 0.0509 0.3532 0.0000 +vt 0.0384 0.3439 0.0000 +vt 0.0389 0.3233 0.0000 +vt 0.0526 0.3306 0.0000 +vt 0.0453 0.2716 0.0000 +vt 0.0584 0.2782 0.0000 +vt 0.0546 0.3050 0.0000 +vt 0.0408 0.2984 0.0000 +vt 0.0729 0.2845 0.0000 +vt 0.0886 0.2893 0.0000 +vt 0.0866 0.3169 0.0000 +vt 0.0699 0.3117 0.0000 +vt 0.7207 0.5443 0.0000 +vt 0.7197 0.5547 0.0000 +vt 0.6905 0.5551 0.0000 +vt 0.6915 0.5445 0.0000 +vt 0.7174 0.5648 0.0000 +vt 0.7142 0.5747 0.0000 +vt 0.6864 0.5757 0.0000 +vt 0.6887 0.5655 0.0000 +vt 0.6280 0.5770 0.0000 +vt 0.6292 0.5666 0.0000 +vt 0.6595 0.5661 0.0000 +vt 0.6577 0.5765 0.0000 +vt 0.6300 0.5558 0.0000 +vt 0.6304 0.5447 0.0000 +vt 0.6616 0.5446 0.0000 +vt 0.6609 0.5555 0.0000 +vt 0.1874 0.3783 0.0000 +vt 0.2052 0.3701 0.0000 +vt 0.2076 0.3887 0.0000 +vt 0.1901 0.3975 0.0000 +vt 0.2220 0.3632 0.0000 +vt 0.2381 0.3589 0.0000 +vt 0.2386 0.3767 0.0000 +vt 0.2236 0.3812 0.0000 +vt 0.2398 0.4044 0.0000 +vt 0.2270 0.4098 0.0000 +vt 0.2252 0.3966 0.0000 +vt 0.2392 0.3919 0.0000 +vt 0.2125 0.4180 0.0000 +vt 0.1959 0.4282 0.0000 +vt 0.1928 0.4138 0.0000 +vt 0.2100 0.4045 0.0000 +vt 0.1946 0.0833 0.0000 +vt 0.2109 0.0749 0.0000 +vt 0.2098 0.0938 0.0000 +vt 0.1937 0.1016 0.0000 +vt 0.2255 0.0697 0.0000 +vt 0.2393 0.0674 0.0000 +vt 0.2390 0.0867 0.0000 +vt 0.2247 0.0890 0.0000 +vt 0.2383 0.1308 0.0000 +vt 0.2227 0.1330 0.0000 +vt 0.2238 0.1100 0.0000 +vt 0.2387 0.1078 0.0000 +vt 0.2068 0.1373 0.0000 +vt 0.1905 0.1437 0.0000 +vt 0.1923 0.1217 0.0000 +vt 0.2084 0.1146 0.0000 +vt 0.1811 0.2758 0.0000 +vt 0.1999 0.2708 0.0000 +vt 0.2003 0.2982 0.0000 +vt 0.1815 0.3038 0.0000 +vt 0.2184 0.2668 0.0000 +vt 0.2368 0.2645 0.0000 +vt 0.2369 0.2908 0.0000 +vt 0.2187 0.2936 0.0000 +vt 0.2376 0.3385 0.0000 +vt 0.2206 0.3423 0.0000 +vt 0.2194 0.3189 0.0000 +vt 0.2372 0.3156 0.0000 +vt 0.2031 0.3486 0.0000 +vt 0.1849 0.3560 0.0000 +vt 0.1828 0.3309 0.0000 +vt 0.2014 0.3244 0.0000 +vt 0.1179 0.8174 0.0000 +vt 0.1361 0.8173 0.0000 +vt 0.1364 0.8254 0.0000 +vt 0.1184 0.8257 0.0000 +vt 0.1514 0.8173 0.0000 +vt 0.1650 0.8173 0.0000 +vt 0.1651 0.8252 0.0000 +vt 0.1516 0.8252 0.0000 +vt 0.1653 0.8412 0.0000 +vt 0.1525 0.8413 0.0000 +vt 0.1519 0.8333 0.0000 +vt 0.1652 0.8332 0.0000 +vt 0.1378 0.8416 0.0000 +vt 0.1206 0.8422 0.0000 +vt 0.1192 0.8340 0.0000 +vt 0.1370 0.8335 0.0000 +vt 0.2379 0.1557 0.0000 +vt 0.2375 0.1822 0.0000 +vt 0.2203 0.1841 0.0000 +vt 0.2215 0.1577 0.0000 +vt 0.2371 0.2096 0.0000 +vt 0.2369 0.2373 0.0000 +vt 0.2187 0.2393 0.0000 +vt 0.2193 0.2115 0.0000 +vt 0.1818 0.2476 0.0000 +vt 0.1835 0.2199 0.0000 +vt 0.2015 0.2151 0.0000 +vt 0.2003 0.2429 0.0000 +vt 0.1858 0.1931 0.0000 +vt 0.1883 0.1676 0.0000 +vt 0.2050 0.1617 0.0000 +vt 0.2031 0.1879 0.0000 +vt 0.1712 0.1751 0.0000 +vt 0.1683 0.1997 0.0000 +vt 0.1510 0.2068 0.0000 +vt 0.1543 0.1837 0.0000 +vt 0.1654 0.2257 0.0000 +vt 0.1631 0.2530 0.0000 +vt 0.1444 0.2582 0.0000 +vt 0.1474 0.2317 0.0000 +vt 0.1088 0.2642 0.0000 +vt 0.1138 0.2394 0.0000 +vt 0.1300 0.2367 0.0000 +vt 0.1262 0.2623 0.0000 +vt 0.1197 0.2172 0.0000 +vt 0.1252 0.1986 0.0000 +vt 0.1385 0.1921 0.0000 +vt 0.1345 0.2132 0.0000 +vt 0.1157 0.1982 0.0000 +vt 0.1070 0.2165 0.0000 +vt 0.0965 0.2111 0.0000 +vt 0.1087 0.1909 0.0000 +vt 0.0991 0.2383 0.0000 +vt 0.0928 0.2628 0.0000 +vt 0.0782 0.2582 0.0000 +vt 0.0863 0.2337 0.0000 +vt 0.0532 0.2450 0.0000 +vt 0.0644 0.2195 0.0000 +vt 0.0748 0.2269 0.0000 +vt 0.0651 0.2518 0.0000 +vt 0.0786 0.1951 0.0000 +vt 0.0954 0.1719 0.0000 +vt 0.1020 0.1815 0.0000 +vt 0.0871 0.2034 0.0000 +vt 0.0190 0.8476 0.0000 +vt 0.0159 0.8381 0.0000 +vt 0.0444 0.8369 0.0000 +vt 0.0468 0.8460 0.0000 +vt 0.7487 0.5541 0.0000 +vt 0.7498 0.5441 0.0000 +vt 0.7792 0.5439 0.0000 +vt 0.7779 0.5534 0.0000 +vt 0.0956 0.8176 0.0000 +vt 0.0963 0.8262 0.0000 +vt 0.0706 0.8268 0.0000 +vt 0.0697 0.8178 0.0000 +vt 0.0973 0.8347 0.0000 +vt 0.0992 0.8432 0.0000 +vt 0.0737 0.8445 0.0000 +vt 0.0719 0.8357 0.0000 +vt 0.0450 0.6477 0.0000 +vt 0.0436 0.6613 0.0000 +vt 0.0168 0.6629 0.0000 +vt 0.0194 0.6502 0.0000 +vt 0.0425 0.6752 0.0000 +vt 0.0419 0.6896 0.0000 +vt 0.0142 0.6900 0.0000 +vt 0.0151 0.6762 0.0000 +vt 0.4611 0.5453 0.0000 +vt 0.4627 0.5576 0.0000 +vt 0.4320 0.5587 0.0000 +vt 0.4299 0.5457 0.0000 +vt 0.4658 0.5696 0.0000 +vt 0.4695 0.5810 0.0000 +vt 0.4414 0.5834 0.0000 +vt 0.4359 0.5713 0.0000 +vt 0.4996 0.5793 0.0000 +vt 0.4971 0.5683 0.0000 +vt 0.5301 0.5676 0.0000 +vt 0.5318 0.5783 0.0000 +vt 0.4949 0.5569 0.0000 +vt 0.4936 0.5451 0.0000 +vt 0.5280 0.5449 0.0000 +vt 0.5288 0.5564 0.0000 +vt 0.5974 0.5448 0.0000 +vt 0.5974 0.5560 0.0000 +vt 0.5633 0.5561 0.0000 +vt 0.5629 0.5448 0.0000 +vt 0.5973 0.5669 0.0000 +vt 0.5969 0.5774 0.0000 +vt 0.5645 0.5778 0.0000 +vt 0.5639 0.5672 0.0000 +vt 0.1504 0.6437 0.0000 +vt 0.1505 0.6583 0.0000 +vt 0.1260 0.6585 0.0000 +vt 0.1259 0.6441 0.0000 +vt 0.1509 0.6734 0.0000 +vt 0.1511 0.6890 0.0000 +vt 0.1262 0.6890 0.0000 +vt 0.1262 0.6735 0.0000 +vt 0.0702 0.6893 0.0000 +vt 0.0705 0.6744 0.0000 +vt 0.0989 0.6738 0.0000 +vt 0.0988 0.6891 0.0000 +vt 0.0711 0.6599 0.0000 +vt 0.0718 0.6459 0.0000 +vt 0.0994 0.6448 0.0000 +vt 0.0991 0.6591 0.0000 +vt 0.0725 0.1448 0.0000 +vt 0.0779 0.1499 0.0000 +vt 0.0558 0.1760 0.0000 +vt 0.0498 0.1719 0.0000 +vt 0.0833 0.1560 0.0000 +vt 0.0892 0.1632 0.0000 +vt 0.0707 0.1876 0.0000 +vt 0.0628 0.1812 0.0000 +vt 0.0424 0.2390 0.0000 +vt 0.0319 0.2341 0.0000 +vt 0.0457 0.2071 0.0000 +vt 0.0549 0.2128 0.0000 +vt 0.6242 0.5960 0.0000 +vt 0.6262 0.5867 0.0000 +vt 0.6552 0.5861 0.0000 +vt 0.6521 0.5951 0.0000 +vt 0.2134 0.6436 0.0000 +vt 0.2136 0.6583 0.0000 +vt 0.2016 0.6583 0.0000 +vt 0.2013 0.6436 0.0000 +vt 0.2137 0.6735 0.0000 +vt 0.2138 0.6890 0.0000 +vt 0.2020 0.6890 0.0000 +vt 0.2019 0.6734 0.0000 +vt 0.1718 0.6890 0.0000 +vt 0.1717 0.6733 0.0000 +vt 0.1882 0.6734 0.0000 +vt 0.1884 0.6890 0.0000 +vt 0.1712 0.6582 0.0000 +vt 0.1709 0.6436 0.0000 +vt 0.1873 0.6435 0.0000 +vt 0.1878 0.6582 0.0000 +vt 0.2398 0.0076 0.0000 +vt 0.2398 0.0203 0.0000 +vt 0.2269 0.0231 0.0000 +vt 0.2272 0.0104 0.0000 +vt 0.2397 0.0341 0.0000 +vt 0.2395 0.0498 0.0000 +vt 0.2262 0.0523 0.0000 +vt 0.2266 0.0367 0.0000 +vt 0.1953 0.0669 0.0000 +vt 0.1956 0.0524 0.0000 +vt 0.2122 0.0426 0.0000 +vt 0.2117 0.0578 0.0000 +vt 0.1955 0.0399 0.0000 +vt 0.1958 0.0282 0.0000 +vt 0.2127 0.0172 0.0000 +vt 0.2124 0.0294 0.0000 +vt 0.3821 0.1397 0.0000 +vt 0.3597 0.1174 0.0000 +vt 0.3626 0.1072 0.0000 +vt 0.3864 0.1311 0.0000 +vt 0.3372 0.0972 0.0000 +vt 0.3158 0.0801 0.0000 +vt 0.3162 0.0667 0.0000 +vt 0.3387 0.0853 0.0000 +vt 0.3171 0.0445 0.0000 +vt 0.3419 0.0661 0.0000 +vt 0.3403 0.0752 0.0000 +vt 0.3168 0.0552 0.0000 +vt 0.3681 0.0907 0.0000 +vt 0.3948 0.1176 0.0000 +vt 0.3905 0.1239 0.0000 +vt 0.3654 0.0985 0.0000 +vt 0.4568 0.3575 0.0000 +vt 0.4644 0.3668 0.0000 +vt 0.4498 0.3853 0.0000 +vt 0.4445 0.3715 0.0000 +vt 0.4725 0.3745 0.0000 +vt 0.4798 0.3806 0.0000 +vt 0.4624 0.4058 0.0000 +vt 0.4559 0.3961 0.0000 +vt 0.4178 0.4418 0.0000 +vt 0.4144 0.4273 0.0000 +vt 0.4366 0.4143 0.0000 +vt 0.4418 0.4265 0.0000 +vt 0.4113 0.4115 0.0000 +vt 0.4087 0.3924 0.0000 +vt 0.4280 0.3836 0.0000 +vt 0.4320 0.4006 0.0000 +vt 0.3158 0.0953 0.0000 +vt 0.3360 0.1109 0.0000 +vt 0.3351 0.1263 0.0000 +vt 0.3161 0.1124 0.0000 +vt 0.3570 0.1293 0.0000 +vt 0.3776 0.1499 0.0000 +vt 0.3731 0.1612 0.0000 +vt 0.3544 0.1428 0.0000 +vt 0.3657 0.1846 0.0000 +vt 0.3518 0.1736 0.0000 +vt 0.3525 0.1574 0.0000 +vt 0.3689 0.1730 0.0000 +vt 0.3356 0.1626 0.0000 +vt 0.3185 0.1523 0.0000 +vt 0.3170 0.1314 0.0000 +vt 0.3349 0.1436 0.0000 +vt 0.3300 0.2811 0.0000 +vt 0.3492 0.2861 0.0000 +vt 0.3493 0.3146 0.0000 +vt 0.3297 0.3096 0.0000 +vt 0.3681 0.2897 0.0000 +vt 0.3864 0.2911 0.0000 +vt 0.3876 0.3191 0.0000 +vt 0.3687 0.3180 0.0000 +vt 0.3875 0.3732 0.0000 +vt 0.3672 0.3727 0.0000 +vt 0.3682 0.3461 0.0000 +vt 0.3877 0.3469 0.0000 +vt 0.3466 0.3690 0.0000 +vt 0.3265 0.3632 0.0000 +vt 0.3285 0.3373 0.0000 +vt 0.3483 0.3426 0.0000 +vt 0.4585 0.2663 0.0000 +vt 0.4699 0.2622 0.0000 +vt 0.4755 0.2910 0.0000 +vt 0.4637 0.2937 0.0000 +vt 0.1818 0.4805 0.0000 +vt 0.1828 0.4902 0.0000 +vt 0.1516 0.4899 0.0000 +vt 0.1517 0.4803 0.0000 +vt 0.0894 0.4888 0.0000 +vt 0.0930 0.4792 0.0000 +vt 0.1220 0.4799 0.0000 +vt 0.1203 0.4895 0.0000 +vt 0.4732 0.3444 0.0000 +vt 0.4634 0.3408 0.0000 +vt 0.4652 0.3192 0.0000 +vt 0.4767 0.3186 0.0000 +vt 0.3879 0.3967 0.0000 +vt 0.3890 0.4169 0.0000 +vt 0.3660 0.4170 0.0000 +vt 0.3664 0.3965 0.0000 +vt 0.3904 0.4339 0.0000 +vt 0.3923 0.4497 0.0000 +vt 0.3658 0.4502 0.0000 +vt 0.3659 0.4345 0.0000 +vt 0.3165 0.4378 0.0000 +vt 0.3192 0.4230 0.0000 +vt 0.3418 0.4303 0.0000 +vt 0.3403 0.4460 0.0000 +vt 0.3216 0.4061 0.0000 +vt 0.3241 0.3862 0.0000 +vt 0.3449 0.3926 0.0000 +vt 0.3432 0.4130 0.0000 +vt 0.4072 0.3698 0.0000 +vt 0.4064 0.3442 0.0000 +vt 0.4239 0.3382 0.0000 +vt 0.4254 0.3627 0.0000 +vt 0.4055 0.3169 0.0000 +vt 0.4034 0.2893 0.0000 +vt 0.4192 0.2845 0.0000 +vt 0.4222 0.3117 0.0000 +vt 0.4467 0.2716 0.0000 +vt 0.4513 0.2984 0.0000 +vt 0.4375 0.3050 0.0000 +vt 0.4336 0.2782 0.0000 +vt 0.4532 0.3233 0.0000 +vt 0.4536 0.3439 0.0000 +vt 0.4411 0.3532 0.0000 +vt 0.4395 0.3306 0.0000 +vt 0.3074 0.5341 0.0000 +vt 0.2782 0.5339 0.0000 +vt 0.2772 0.5232 0.0000 +vt 0.3063 0.5237 0.0000 +vt 0.2482 0.5337 0.0000 +vt 0.2171 0.5336 0.0000 +vt 0.2167 0.5224 0.0000 +vt 0.2476 0.5227 0.0000 +vt 0.2147 0.5008 0.0000 +vt 0.2444 0.5014 0.0000 +vt 0.2462 0.5119 0.0000 +vt 0.2159 0.5114 0.0000 +vt 0.2730 0.5023 0.0000 +vt 0.3009 0.5036 0.0000 +vt 0.3040 0.5135 0.0000 +vt 0.2754 0.5127 0.0000 +vt 0.3047 0.3783 0.0000 +vt 0.3020 0.3975 0.0000 +vt 0.2845 0.3887 0.0000 +vt 0.2868 0.3701 0.0000 +vt 0.2993 0.4138 0.0000 +vt 0.2962 0.4282 0.0000 +vt 0.2796 0.4180 0.0000 +vt 0.2821 0.4045 0.0000 +vt 0.2523 0.4044 0.0000 +vt 0.2528 0.3919 0.0000 +vt 0.2669 0.3966 0.0000 +vt 0.2651 0.4098 0.0000 +vt 0.2534 0.3767 0.0000 +vt 0.2540 0.3589 0.0000 +vt 0.2701 0.3632 0.0000 +vt 0.2685 0.3812 0.0000 +vt 0.2974 0.0833 0.0000 +vt 0.2984 0.1016 0.0000 +vt 0.2823 0.0938 0.0000 +vt 0.2812 0.0749 0.0000 +vt 0.2998 0.1217 0.0000 +vt 0.3016 0.1437 0.0000 +vt 0.2853 0.1373 0.0000 +vt 0.2837 0.1146 0.0000 +vt 0.2538 0.1308 0.0000 +vt 0.2534 0.1078 0.0000 +vt 0.2683 0.1100 0.0000 +vt 0.2694 0.1330 0.0000 +vt 0.2531 0.0867 0.0000 +vt 0.2528 0.0674 0.0000 +vt 0.2665 0.0697 0.0000 +vt 0.2673 0.0890 0.0000 +vt 0.3109 0.2758 0.0000 +vt 0.3105 0.3038 0.0000 +vt 0.2918 0.2982 0.0000 +vt 0.2922 0.2708 0.0000 +vt 0.3092 0.3309 0.0000 +vt 0.3072 0.3560 0.0000 +vt 0.2890 0.3486 0.0000 +vt 0.2907 0.3244 0.0000 +vt 0.2545 0.3385 0.0000 +vt 0.2549 0.3156 0.0000 +vt 0.2726 0.3189 0.0000 +vt 0.2715 0.3423 0.0000 +vt 0.2551 0.2908 0.0000 +vt 0.2552 0.2645 0.0000 +vt 0.2736 0.2668 0.0000 +vt 0.2733 0.2936 0.0000 +vt 0.2251 0.8174 0.0000 +vt 0.2246 0.8257 0.0000 +vt 0.2065 0.8254 0.0000 +vt 0.2069 0.8173 0.0000 +vt 0.2238 0.8340 0.0000 +vt 0.2223 0.8422 0.0000 +vt 0.2051 0.8416 0.0000 +vt 0.2060 0.8335 0.0000 +vt 0.1777 0.8412 0.0000 +vt 0.1778 0.8332 0.0000 +vt 0.1911 0.8333 0.0000 +vt 0.1904 0.8413 0.0000 +vt 0.1779 0.8252 0.0000 +vt 0.1780 0.8173 0.0000 +vt 0.1916 0.8173 0.0000 +vt 0.1914 0.8252 0.0000 +vt 0.2542 0.1557 0.0000 +vt 0.2706 0.1577 0.0000 +vt 0.2717 0.1841 0.0000 +vt 0.2546 0.1822 0.0000 +vt 0.2871 0.1617 0.0000 +vt 0.3038 0.1676 0.0000 +vt 0.3063 0.1931 0.0000 +vt 0.2889 0.1879 0.0000 +vt 0.3102 0.2476 0.0000 +vt 0.2918 0.2429 0.0000 +vt 0.2906 0.2151 0.0000 +vt 0.3085 0.2199 0.0000 +vt 0.2734 0.2393 0.0000 +vt 0.2551 0.2373 0.0000 +vt 0.2549 0.2096 0.0000 +vt 0.2727 0.2115 0.0000 +vt 0.3209 0.1751 0.0000 +vt 0.3378 0.1837 0.0000 +vt 0.3411 0.2068 0.0000 +vt 0.3238 0.1997 0.0000 +vt 0.3536 0.1921 0.0000 +vt 0.3669 0.1986 0.0000 +vt 0.3724 0.2172 0.0000 +vt 0.3575 0.2132 0.0000 +vt 0.3833 0.2642 0.0000 +vt 0.3659 0.2623 0.0000 +vt 0.3621 0.2367 0.0000 +vt 0.3783 0.2394 0.0000 +vt 0.3476 0.2582 0.0000 +vt 0.3289 0.2530 0.0000 +vt 0.3267 0.2257 0.0000 +vt 0.3447 0.2317 0.0000 +vt 0.3763 0.1982 0.0000 +vt 0.3833 0.1909 0.0000 +vt 0.3956 0.2111 0.0000 +vt 0.3850 0.2165 0.0000 +vt 0.3901 0.1815 0.0000 +vt 0.3966 0.1719 0.0000 +vt 0.4135 0.1951 0.0000 +vt 0.4049 0.2034 0.0000 +vt 0.4389 0.2450 0.0000 +vt 0.4270 0.2518 0.0000 +vt 0.4173 0.2269 0.0000 +vt 0.4277 0.2195 0.0000 +vt 0.4138 0.2582 0.0000 +vt 0.3993 0.2628 0.0000 +vt 0.3929 0.2383 0.0000 +vt 0.4058 0.2337 0.0000 +vt 0.3240 0.8477 0.0000 +vt 0.2962 0.8461 0.0000 +vt 0.2986 0.8369 0.0000 +vt 0.3270 0.8381 0.0000 +vt 0.2692 0.8445 0.0000 +vt 0.2438 0.8432 0.0000 +vt 0.2456 0.8347 0.0000 +vt 0.2711 0.8357 0.0000 +vt 0.2474 0.8176 0.0000 +vt 0.2733 0.8178 0.0000 +vt 0.2724 0.8268 0.0000 +vt 0.2467 0.8262 0.0000 +vt 0.3659 0.5347 0.0000 +vt 0.3365 0.5344 0.0000 +vt 0.3354 0.5244 0.0000 +vt 0.3646 0.5251 0.0000 +vt 0.3937 0.6477 0.0000 +vt 0.4194 0.6502 0.0000 +vt 0.4219 0.6629 0.0000 +vt 0.3951 0.6613 0.0000 +vt 0.0281 0.4951 0.0000 +vt 0.0562 0.4974 0.0000 +vt 0.0524 0.5089 0.0000 +vt 0.0226 0.5072 0.0000 +vt 0.0477 0.5332 0.0000 +vt 0.0166 0.5329 0.0000 +vt 0.0187 0.5198 0.0000 +vt 0.0494 0.5209 0.0000 +vt 0.4245 0.6900 0.0000 +vt 0.3968 0.6896 0.0000 +vt 0.3963 0.6752 0.0000 +vt 0.4237 0.6762 0.0000 +vt 0.0863 0.4990 0.0000 +vt 0.1185 0.4997 0.0000 +vt 0.1168 0.5106 0.0000 +vt 0.0838 0.5100 0.0000 +vt 0.1512 0.5001 0.0000 +vt 0.1836 0.5003 0.0000 +vt 0.1839 0.5110 0.0000 +vt 0.1506 0.5109 0.0000 +vt 0.1841 0.5335 0.0000 +vt 0.1496 0.5335 0.0000 +vt 0.1500 0.5221 0.0000 +vt 0.1841 0.5222 0.0000 +vt 0.1146 0.5335 0.0000 +vt 0.0803 0.5334 0.0000 +vt 0.0815 0.5215 0.0000 +vt 0.1154 0.5219 0.0000 +vt 0.2883 0.6437 0.0000 +vt 0.3129 0.6441 0.0000 +vt 0.3127 0.6585 0.0000 +vt 0.2882 0.6583 0.0000 +vt 0.3393 0.6448 0.0000 +vt 0.3669 0.6459 0.0000 +vt 0.3676 0.6599 0.0000 +vt 0.3397 0.6591 0.0000 +vt 0.3685 0.6893 0.0000 +vt 0.3399 0.6891 0.0000 +vt 0.3398 0.6738 0.0000 +vt 0.3682 0.6744 0.0000 +vt 0.3125 0.6890 0.0000 +vt 0.2877 0.6890 0.0000 +vt 0.2878 0.6734 0.0000 +vt 0.3125 0.6735 0.0000 +vt 0.4195 0.1448 0.0000 +vt 0.4422 0.1719 0.0000 +vt 0.4362 0.1760 0.0000 +vt 0.4142 0.1499 0.0000 +vt 0.2419 0.4915 0.0000 +vt 0.2129 0.4907 0.0000 +vt 0.2109 0.4812 0.0000 +vt 0.2388 0.4823 0.0000 +vt 0.4496 0.2390 0.0000 +vt 0.4371 0.2128 0.0000 +vt 0.4463 0.2071 0.0000 +vt 0.4601 0.2341 0.0000 +vt 0.4214 0.1876 0.0000 +vt 0.4029 0.1632 0.0000 +vt 0.4088 0.1560 0.0000 +vt 0.4292 0.1812 0.0000 +vt 0.2253 0.6436 0.0000 +vt 0.2374 0.6436 0.0000 +vt 0.2372 0.6583 0.0000 +vt 0.2251 0.6583 0.0000 +vt 0.2514 0.6435 0.0000 +vt 0.2678 0.6436 0.0000 +vt 0.2676 0.6582 0.0000 +vt 0.2509 0.6582 0.0000 +vt 0.2669 0.6890 0.0000 +vt 0.2503 0.6890 0.0000 +vt 0.2505 0.6734 0.0000 +vt 0.2671 0.6733 0.0000 +vt 0.2368 0.6890 0.0000 +vt 0.2250 0.6890 0.0000 +vt 0.2250 0.6735 0.0000 +vt 0.2369 0.6734 0.0000 +vt 0.2522 0.0076 0.0000 +vt 0.2648 0.0104 0.0000 +vt 0.2652 0.0231 0.0000 +vt 0.2523 0.0203 0.0000 +vt 0.2793 0.0172 0.0000 +vt 0.2962 0.0282 0.0000 +vt 0.2965 0.0399 0.0000 +vt 0.2796 0.0294 0.0000 +vt 0.2968 0.0669 0.0000 +vt 0.2804 0.0578 0.0000 +vt 0.2799 0.0426 0.0000 +vt 0.2965 0.0524 0.0000 +vt 0.2659 0.0523 0.0000 +vt 0.2525 0.0498 0.0000 +vt 0.2524 0.0341 0.0000 +vt 0.2654 0.0367 0.0000 +vt 0.8900 0.1397 0.0000 +vt 0.8677 0.1174 0.0000 +vt 0.8705 0.1072 0.0000 +vt 0.8944 0.1311 0.0000 +vt 0.8452 0.0972 0.0000 +vt 0.8238 0.0801 0.0000 +vt 0.8241 0.0667 0.0000 +vt 0.8466 0.0853 0.0000 +vt 0.8251 0.0445 0.0000 +vt 0.8499 0.0661 0.0000 +vt 0.8483 0.0752 0.0000 +vt 0.8248 0.0552 0.0000 +vt 0.8760 0.0907 0.0000 +vt 0.9027 0.1176 0.0000 +vt 0.8985 0.1239 0.0000 +vt 0.8734 0.0985 0.0000 +vt 0.9647 0.3575 0.0000 +vt 0.9723 0.3668 0.0000 +vt 0.9578 0.3853 0.0000 +vt 0.9524 0.3715 0.0000 +vt 0.9805 0.3745 0.0000 +vt 0.9877 0.3806 0.0000 +vt 0.9704 0.4058 0.0000 +vt 0.9638 0.3961 0.0000 +vt 0.9257 0.4418 0.0000 +vt 0.9223 0.4273 0.0000 +vt 0.9445 0.4143 0.0000 +vt 0.9498 0.4265 0.0000 +vt 0.9193 0.4115 0.0000 +vt 0.9167 0.3924 0.0000 +vt 0.9360 0.3836 0.0000 +vt 0.9400 0.4006 0.0000 +vt 0.8237 0.0953 0.0000 +vt 0.8439 0.1109 0.0000 +vt 0.8430 0.1263 0.0000 +vt 0.8240 0.1124 0.0000 +vt 0.8649 0.1293 0.0000 +vt 0.8855 0.1499 0.0000 +vt 0.8810 0.1612 0.0000 +vt 0.8624 0.1428 0.0000 +vt 0.8736 0.1846 0.0000 +vt 0.8597 0.1736 0.0000 +vt 0.8604 0.1574 0.0000 +vt 0.8768 0.1730 0.0000 +vt 0.8436 0.1626 0.0000 +vt 0.8265 0.1523 0.0000 +vt 0.8249 0.1314 0.0000 +vt 0.8428 0.1436 0.0000 +vt 0.8380 0.2811 0.0000 +vt 0.8572 0.2861 0.0000 +vt 0.8572 0.3146 0.0000 +vt 0.8377 0.3096 0.0000 +vt 0.8761 0.2897 0.0000 +vt 0.8943 0.2911 0.0000 +vt 0.8955 0.3191 0.0000 +vt 0.8766 0.3180 0.0000 +vt 0.8955 0.3732 0.0000 +vt 0.8751 0.3727 0.0000 +vt 0.8761 0.3461 0.0000 +vt 0.8957 0.3469 0.0000 +vt 0.8546 0.3690 0.0000 +vt 0.8344 0.3632 0.0000 +vt 0.8364 0.3373 0.0000 +vt 0.8562 0.3426 0.0000 +vt 0.9665 0.2663 0.0000 +vt 0.9778 0.2622 0.0000 +vt 0.9835 0.2910 0.0000 +vt 0.9716 0.2937 0.0000 +vt 0.5952 0.4816 0.0000 +vt 0.5961 0.4910 0.0000 +vt 0.5649 0.4905 0.0000 +vt 0.5650 0.4812 0.0000 +vt 0.5027 0.4889 0.0000 +vt 0.5063 0.4794 0.0000 +vt 0.5353 0.4804 0.0000 +vt 0.5336 0.4899 0.0000 +vt 0.9812 0.3444 0.0000 +vt 0.9714 0.3408 0.0000 +vt 0.9732 0.3192 0.0000 +vt 0.9847 0.3186 0.0000 +vt 0.8958 0.3967 0.0000 +vt 0.8969 0.4169 0.0000 +vt 0.8739 0.4170 0.0000 +vt 0.8743 0.3965 0.0000 +vt 0.8984 0.4339 0.0000 +vt 0.9002 0.4497 0.0000 +vt 0.8737 0.4502 0.0000 +vt 0.8738 0.4345 0.0000 +vt 0.8244 0.4378 0.0000 +vt 0.8271 0.4230 0.0000 +vt 0.8497 0.4303 0.0000 +vt 0.8483 0.4460 0.0000 +vt 0.8295 0.4061 0.0000 +vt 0.8320 0.3862 0.0000 +vt 0.8528 0.3926 0.0000 +vt 0.8512 0.4130 0.0000 +vt 0.9151 0.3698 0.0000 +vt 0.9144 0.3442 0.0000 +vt 0.9318 0.3382 0.0000 +vt 0.9333 0.3627 0.0000 +vt 0.9134 0.3169 0.0000 +vt 0.9114 0.2893 0.0000 +vt 0.9271 0.2845 0.0000 +vt 0.9301 0.3117 0.0000 +vt 0.9547 0.2716 0.0000 +vt 0.9592 0.2984 0.0000 +vt 0.9454 0.3050 0.0000 +vt 0.9416 0.2782 0.0000 +vt 0.9611 0.3233 0.0000 +vt 0.9616 0.3439 0.0000 +vt 0.9491 0.3532 0.0000 +vt 0.9474 0.3306 0.0000 +vt 0.7207 0.5339 0.0000 +vt 0.6915 0.5338 0.0000 +vt 0.6905 0.5231 0.0000 +vt 0.7197 0.5236 0.0000 +vt 0.6616 0.5337 0.0000 +vt 0.6304 0.5336 0.0000 +vt 0.6300 0.5225 0.0000 +vt 0.6609 0.5228 0.0000 +vt 0.6280 0.5013 0.0000 +vt 0.6577 0.5018 0.0000 +vt 0.6595 0.5121 0.0000 +vt 0.6292 0.5117 0.0000 +vt 0.6864 0.5026 0.0000 +vt 0.7142 0.5036 0.0000 +vt 0.7174 0.5134 0.0000 +vt 0.6887 0.5127 0.0000 +vt 0.8126 0.3783 0.0000 +vt 0.8099 0.3975 0.0000 +vt 0.7924 0.3887 0.0000 +vt 0.7948 0.3701 0.0000 +vt 0.8072 0.4138 0.0000 +vt 0.8041 0.4282 0.0000 +vt 0.7875 0.4180 0.0000 +vt 0.7900 0.4045 0.0000 +vt 0.7602 0.4044 0.0000 +vt 0.7608 0.3919 0.0000 +vt 0.7748 0.3966 0.0000 +vt 0.7730 0.4098 0.0000 +vt 0.7614 0.3767 0.0000 +vt 0.7619 0.3589 0.0000 +vt 0.7780 0.3632 0.0000 +vt 0.7764 0.3812 0.0000 +vt 0.8054 0.0833 0.0000 +vt 0.8063 0.1016 0.0000 +vt 0.7902 0.0938 0.0000 +vt 0.7891 0.0749 0.0000 +vt 0.8077 0.1217 0.0000 +vt 0.8095 0.1437 0.0000 +vt 0.7932 0.1373 0.0000 +vt 0.7916 0.1146 0.0000 +vt 0.7617 0.1308 0.0000 +vt 0.7613 0.1078 0.0000 +vt 0.7762 0.1100 0.0000 +vt 0.7773 0.1330 0.0000 +vt 0.7610 0.0867 0.0000 +vt 0.7607 0.0674 0.0000 +vt 0.7745 0.0697 0.0000 +vt 0.7753 0.0890 0.0000 +vt 0.8189 0.2758 0.0000 +vt 0.8185 0.3038 0.0000 +vt 0.7997 0.2982 0.0000 +vt 0.8001 0.2708 0.0000 +vt 0.8172 0.3309 0.0000 +vt 0.8151 0.3560 0.0000 +vt 0.7969 0.3486 0.0000 +vt 0.7986 0.3244 0.0000 +vt 0.7624 0.3385 0.0000 +vt 0.7628 0.3156 0.0000 +vt 0.7806 0.3189 0.0000 +vt 0.7794 0.3423 0.0000 +vt 0.7631 0.2908 0.0000 +vt 0.7632 0.2645 0.0000 +vt 0.7816 0.2668 0.0000 +vt 0.7813 0.2936 0.0000 +vt 0.1179 0.8092 0.0000 +vt 0.1184 0.8009 0.0000 +vt 0.1364 0.8012 0.0000 +vt 0.1361 0.8093 0.0000 +vt 0.1192 0.7926 0.0000 +vt 0.1206 0.7844 0.0000 +vt 0.1378 0.7850 0.0000 +vt 0.1370 0.7931 0.0000 +vt 0.1653 0.7854 0.0000 +vt 0.1652 0.7934 0.0000 +vt 0.1519 0.7933 0.0000 +vt 0.1525 0.7853 0.0000 +vt 0.1651 0.8014 0.0000 +vt 0.1650 0.8093 0.0000 +vt 0.1514 0.8093 0.0000 +vt 0.1516 0.8014 0.0000 +vt 0.7621 0.1557 0.0000 +vt 0.7785 0.1577 0.0000 +vt 0.7797 0.1841 0.0000 +vt 0.7625 0.1822 0.0000 +vt 0.7950 0.1617 0.0000 +vt 0.8117 0.1676 0.0000 +vt 0.8142 0.1931 0.0000 +vt 0.7969 0.1879 0.0000 +vt 0.8182 0.2476 0.0000 +vt 0.7997 0.2429 0.0000 +vt 0.7985 0.2151 0.0000 +vt 0.8165 0.2199 0.0000 +vt 0.7813 0.2393 0.0000 +vt 0.7631 0.2373 0.0000 +vt 0.7629 0.2096 0.0000 +vt 0.7807 0.2115 0.0000 +vt 0.8288 0.1751 0.0000 +vt 0.8457 0.1837 0.0000 +vt 0.8490 0.2068 0.0000 +vt 0.8317 0.1997 0.0000 +vt 0.8615 0.1921 0.0000 +vt 0.8748 0.1986 0.0000 +vt 0.8803 0.2172 0.0000 +vt 0.8655 0.2132 0.0000 +vt 0.8912 0.2642 0.0000 +vt 0.8738 0.2623 0.0000 +vt 0.8700 0.2367 0.0000 +vt 0.8862 0.2394 0.0000 +vt 0.8556 0.2582 0.0000 +vt 0.8369 0.2530 0.0000 +vt 0.8346 0.2257 0.0000 +vt 0.8526 0.2317 0.0000 +vt 0.8843 0.1982 0.0000 +vt 0.8913 0.1909 0.0000 +vt 0.9035 0.2111 0.0000 +vt 0.8930 0.2165 0.0000 +vt 0.8980 0.1815 0.0000 +vt 0.9046 0.1719 0.0000 +vt 0.9214 0.1951 0.0000 +vt 0.9129 0.2034 0.0000 +vt 0.9468 0.2450 0.0000 +vt 0.9349 0.2518 0.0000 +vt 0.9252 0.2269 0.0000 +vt 0.9356 0.2195 0.0000 +vt 0.9218 0.2582 0.0000 +vt 0.9072 0.2628 0.0000 +vt 0.9009 0.2383 0.0000 +vt 0.9137 0.2337 0.0000 +vt 0.0190 0.7791 0.0000 +vt 0.0468 0.7806 0.0000 +vt 0.0444 0.7897 0.0000 +vt 0.0159 0.7885 0.0000 +vt 0.0737 0.7821 0.0000 +vt 0.0992 0.7834 0.0000 +vt 0.0973 0.7919 0.0000 +vt 0.0719 0.7909 0.0000 +vt 0.0956 0.8090 0.0000 +vt 0.0697 0.8088 0.0000 +vt 0.0706 0.7998 0.0000 +vt 0.0963 0.8004 0.0000 +vt 0.7792 0.5344 0.0000 +vt 0.7498 0.5342 0.0000 +vt 0.7487 0.5241 0.0000 +vt 0.7779 0.5249 0.0000 +vt 0.0450 0.7461 0.0000 +vt 0.0194 0.7436 0.0000 +vt 0.0168 0.7309 0.0000 +vt 0.0436 0.7325 0.0000 +vt 0.4414 0.4949 0.0000 +vt 0.4695 0.4972 0.0000 +vt 0.4658 0.5087 0.0000 +vt 0.4359 0.5070 0.0000 +vt 0.4611 0.5329 0.0000 +vt 0.4299 0.5326 0.0000 +vt 0.4320 0.5196 0.0000 +vt 0.4627 0.5207 0.0000 +vt 0.0142 0.7038 0.0000 +vt 0.0419 0.7042 0.0000 +vt 0.0425 0.7186 0.0000 +vt 0.0151 0.7176 0.0000 +vt 0.4996 0.4990 0.0000 +vt 0.5318 0.5000 0.0000 +vt 0.5301 0.5107 0.0000 +vt 0.4971 0.5099 0.0000 +vt 0.5645 0.5005 0.0000 +vt 0.5969 0.5009 0.0000 +vt 0.5973 0.5114 0.0000 +vt 0.5639 0.5111 0.0000 +vt 0.5974 0.5335 0.0000 +vt 0.5629 0.5334 0.0000 +vt 0.5633 0.5221 0.0000 +vt 0.5974 0.5223 0.0000 +vt 0.5280 0.5334 0.0000 +vt 0.4936 0.5332 0.0000 +vt 0.4949 0.5214 0.0000 +vt 0.5288 0.5219 0.0000 +vt 0.1504 0.7501 0.0000 +vt 0.1259 0.7497 0.0000 +vt 0.1260 0.7352 0.0000 +vt 0.1505 0.7355 0.0000 +vt 0.0994 0.7490 0.0000 +vt 0.0718 0.7479 0.0000 +vt 0.0711 0.7339 0.0000 +vt 0.0991 0.7347 0.0000 +vt 0.0702 0.7045 0.0000 +vt 0.0988 0.7046 0.0000 +vt 0.0989 0.7200 0.0000 +vt 0.0705 0.7194 0.0000 +vt 0.1262 0.7047 0.0000 +vt 0.1511 0.7048 0.0000 +vt 0.1509 0.7204 0.0000 +vt 0.1262 0.7203 0.0000 +vt 0.9275 0.1448 0.0000 +vt 0.9502 0.1719 0.0000 +vt 0.9442 0.1760 0.0000 +vt 0.9221 0.1499 0.0000 +vt 0.6552 0.4922 0.0000 +vt 0.6262 0.4915 0.0000 +vt 0.6242 0.4822 0.0000 +vt 0.6521 0.4832 0.0000 +vt 0.9576 0.2390 0.0000 +vt 0.9451 0.2128 0.0000 +vt 0.9543 0.2071 0.0000 +vt 0.9681 0.2341 0.0000 +vt 0.9293 0.1876 0.0000 +vt 0.9108 0.1632 0.0000 +vt 0.9167 0.1560 0.0000 +vt 0.9372 0.1812 0.0000 +vt 0.2134 0.7502 0.0000 +vt 0.2013 0.7502 0.0000 +vt 0.2016 0.7355 0.0000 +vt 0.2136 0.7355 0.0000 +vt 0.1873 0.7503 0.0000 +vt 0.1709 0.7502 0.0000 +vt 0.1712 0.7356 0.0000 +vt 0.1878 0.7356 0.0000 +vt 0.1718 0.7048 0.0000 +vt 0.1884 0.7048 0.0000 +vt 0.1882 0.7204 0.0000 +vt 0.1717 0.7204 0.0000 +vt 0.2020 0.7048 0.0000 +vt 0.2138 0.7048 0.0000 +vt 0.2137 0.7203 0.0000 +vt 0.2019 0.7204 0.0000 +vt 0.7602 0.0076 0.0000 +vt 0.7728 0.0104 0.0000 +vt 0.7731 0.0231 0.0000 +vt 0.7602 0.0203 0.0000 +vt 0.7873 0.0172 0.0000 +vt 0.8042 0.0282 0.0000 +vt 0.8045 0.0399 0.0000 +vt 0.7876 0.0294 0.0000 +vt 0.8047 0.0669 0.0000 +vt 0.7883 0.0578 0.0000 +vt 0.7878 0.0426 0.0000 +vt 0.8044 0.0524 0.0000 +vt 0.7738 0.0523 0.0000 +vt 0.7605 0.0498 0.0000 +vt 0.7603 0.0341 0.0000 +vt 0.7734 0.0367 0.0000 +vt 0.6179 0.1397 0.0000 +vt 0.6136 0.1311 0.0000 +vt 0.6374 0.1072 0.0000 +vt 0.6403 0.1174 0.0000 +vt 0.6095 0.1239 0.0000 +vt 0.6052 0.1176 0.0000 +vt 0.6319 0.0907 0.0000 +vt 0.6346 0.0985 0.0000 +vt 0.6829 0.0445 0.0000 +vt 0.6832 0.0552 0.0000 +vt 0.6597 0.0752 0.0000 +vt 0.6581 0.0661 0.0000 +vt 0.6838 0.0667 0.0000 +vt 0.6842 0.0801 0.0000 +vt 0.6628 0.0972 0.0000 +vt 0.6613 0.0853 0.0000 +vt 0.5432 0.3575 0.0000 +vt 0.5555 0.3715 0.0000 +vt 0.5502 0.3853 0.0000 +vt 0.5356 0.3668 0.0000 +vt 0.5720 0.3836 0.0000 +vt 0.5913 0.3924 0.0000 +vt 0.5887 0.4115 0.0000 +vt 0.5680 0.4006 0.0000 +vt 0.5822 0.4418 0.0000 +vt 0.5582 0.4265 0.0000 +vt 0.5634 0.4143 0.0000 +vt 0.5856 0.4273 0.0000 +vt 0.5376 0.4058 0.0000 +vt 0.5202 0.3806 0.0000 +vt 0.5275 0.3745 0.0000 +vt 0.5441 0.3961 0.0000 +vt 0.6842 0.0953 0.0000 +vt 0.6839 0.1124 0.0000 +vt 0.6649 0.1263 0.0000 +vt 0.6640 0.1109 0.0000 +vt 0.6830 0.1314 0.0000 +vt 0.6815 0.1523 0.0000 +vt 0.6644 0.1626 0.0000 +vt 0.6651 0.1436 0.0000 +vt 0.6343 0.1846 0.0000 +vt 0.6311 0.1730 0.0000 +vt 0.6475 0.1574 0.0000 +vt 0.6482 0.1736 0.0000 +vt 0.6269 0.1612 0.0000 +vt 0.6224 0.1499 0.0000 +vt 0.6430 0.1293 0.0000 +vt 0.6456 0.1428 0.0000 +vt 0.6700 0.2811 0.0000 +vt 0.6703 0.3096 0.0000 +vt 0.6507 0.3146 0.0000 +vt 0.6508 0.2861 0.0000 +vt 0.6715 0.3373 0.0000 +vt 0.6735 0.3632 0.0000 +vt 0.6534 0.3690 0.0000 +vt 0.6517 0.3426 0.0000 +vt 0.6125 0.3732 0.0000 +vt 0.6123 0.3469 0.0000 +vt 0.6318 0.3461 0.0000 +vt 0.6328 0.3727 0.0000 +vt 0.6124 0.3191 0.0000 +vt 0.6136 0.2911 0.0000 +vt 0.6319 0.2897 0.0000 +vt 0.6313 0.3180 0.0000 +vt 0.5415 0.2663 0.0000 +vt 0.5363 0.2937 0.0000 +vt 0.5245 0.2910 0.0000 +vt 0.5301 0.2622 0.0000 +vt 0.5348 0.3192 0.0000 +vt 0.5366 0.3408 0.0000 +vt 0.5268 0.3444 0.0000 +vt 0.5233 0.3186 0.0000 +vt 0.0894 0.5897 0.0000 +vt 0.1203 0.5887 0.0000 +vt 0.1220 0.5981 0.0000 +vt 0.0930 0.5992 0.0000 +vt 0.1516 0.5880 0.0000 +vt 0.1828 0.5876 0.0000 +vt 0.1818 0.5969 0.0000 +vt 0.1517 0.5974 0.0000 +vt 0.6121 0.3967 0.0000 +vt 0.6336 0.3965 0.0000 +vt 0.6340 0.4170 0.0000 +vt 0.6110 0.4169 0.0000 +vt 0.6551 0.3926 0.0000 +vt 0.6759 0.3862 0.0000 +vt 0.6784 0.4061 0.0000 +vt 0.6568 0.4130 0.0000 +vt 0.6835 0.4378 0.0000 +vt 0.6597 0.4460 0.0000 +vt 0.6582 0.4303 0.0000 +vt 0.6808 0.4230 0.0000 +vt 0.6342 0.4502 0.0000 +vt 0.6077 0.4497 0.0000 +vt 0.6096 0.4339 0.0000 +vt 0.6341 0.4345 0.0000 +vt 0.5928 0.3698 0.0000 +vt 0.5746 0.3627 0.0000 +vt 0.5761 0.3382 0.0000 +vt 0.5936 0.3442 0.0000 +vt 0.5589 0.3532 0.0000 +vt 0.5464 0.3439 0.0000 +vt 0.5468 0.3233 0.0000 +vt 0.5605 0.3306 0.0000 +vt 0.5533 0.2716 0.0000 +vt 0.5664 0.2782 0.0000 +vt 0.5625 0.3050 0.0000 +vt 0.5487 0.2984 0.0000 +vt 0.5808 0.2845 0.0000 +vt 0.5966 0.2893 0.0000 +vt 0.5945 0.3169 0.0000 +vt 0.5778 0.3117 0.0000 +vt 0.3074 0.5446 0.0000 +vt 0.3063 0.5550 0.0000 +vt 0.2772 0.5554 0.0000 +vt 0.2782 0.5447 0.0000 +vt 0.3040 0.5651 0.0000 +vt 0.3009 0.5750 0.0000 +vt 0.2730 0.5760 0.0000 +vt 0.2754 0.5658 0.0000 +vt 0.2147 0.5772 0.0000 +vt 0.2159 0.5669 0.0000 +vt 0.2462 0.5664 0.0000 +vt 0.2444 0.5767 0.0000 +vt 0.2167 0.5560 0.0000 +vt 0.2171 0.5449 0.0000 +vt 0.2482 0.5448 0.0000 +vt 0.2476 0.5557 0.0000 +vt 0.6953 0.3783 0.0000 +vt 0.7132 0.3701 0.0000 +vt 0.7155 0.3887 0.0000 +vt 0.6980 0.3975 0.0000 +vt 0.7299 0.3632 0.0000 +vt 0.7460 0.3589 0.0000 +vt 0.7466 0.3767 0.0000 +vt 0.7315 0.3812 0.0000 +vt 0.7477 0.4044 0.0000 +vt 0.7349 0.4098 0.0000 +vt 0.7331 0.3966 0.0000 +vt 0.7472 0.3919 0.0000 +vt 0.7204 0.4180 0.0000 +vt 0.7038 0.4282 0.0000 +vt 0.7007 0.4138 0.0000 +vt 0.7179 0.4045 0.0000 +vt 0.7026 0.0833 0.0000 +vt 0.7188 0.0749 0.0000 +vt 0.7177 0.0938 0.0000 +vt 0.7016 0.1016 0.0000 +vt 0.7335 0.0697 0.0000 +vt 0.7472 0.0674 0.0000 +vt 0.7469 0.0867 0.0000 +vt 0.7327 0.0890 0.0000 +vt 0.7462 0.1308 0.0000 +vt 0.7306 0.1330 0.0000 +vt 0.7317 0.1100 0.0000 +vt 0.7466 0.1078 0.0000 +vt 0.7147 0.1373 0.0000 +vt 0.6984 0.1437 0.0000 +vt 0.7002 0.1217 0.0000 +vt 0.7163 0.1146 0.0000 +vt 0.6891 0.2758 0.0000 +vt 0.7078 0.2708 0.0000 +vt 0.7082 0.2982 0.0000 +vt 0.6895 0.3038 0.0000 +vt 0.7264 0.2668 0.0000 +vt 0.7448 0.2645 0.0000 +vt 0.7449 0.2908 0.0000 +vt 0.7267 0.2936 0.0000 +vt 0.7455 0.3385 0.0000 +vt 0.7285 0.3423 0.0000 +vt 0.7274 0.3189 0.0000 +vt 0.7451 0.3156 0.0000 +vt 0.7110 0.3486 0.0000 +vt 0.6928 0.3560 0.0000 +vt 0.6908 0.3309 0.0000 +vt 0.7093 0.3244 0.0000 +vt 0.2251 0.8092 0.0000 +vt 0.2069 0.8093 0.0000 +vt 0.2065 0.8012 0.0000 +vt 0.2246 0.8009 0.0000 +vt 0.1916 0.8093 0.0000 +vt 0.1780 0.8093 0.0000 +vt 0.1779 0.8014 0.0000 +vt 0.1914 0.8014 0.0000 +vt 0.1777 0.7854 0.0000 +vt 0.1904 0.7853 0.0000 +vt 0.1911 0.7933 0.0000 +vt 0.1778 0.7934 0.0000 +vt 0.2051 0.7850 0.0000 +vt 0.2223 0.7844 0.0000 +vt 0.2238 0.7926 0.0000 +vt 0.2060 0.7931 0.0000 +vt 0.7458 0.1557 0.0000 +vt 0.7454 0.1822 0.0000 +vt 0.7283 0.1841 0.0000 +vt 0.7294 0.1577 0.0000 +vt 0.7451 0.2096 0.0000 +vt 0.7449 0.2373 0.0000 +vt 0.7266 0.2393 0.0000 +vt 0.7273 0.2115 0.0000 +vt 0.6898 0.2476 0.0000 +vt 0.6915 0.2199 0.0000 +vt 0.7094 0.2151 0.0000 +vt 0.7082 0.2429 0.0000 +vt 0.6937 0.1931 0.0000 +vt 0.6962 0.1676 0.0000 +vt 0.7129 0.1617 0.0000 +vt 0.7111 0.1879 0.0000 +vt 0.6791 0.1751 0.0000 +vt 0.6762 0.1997 0.0000 +vt 0.6589 0.2068 0.0000 +vt 0.6622 0.1837 0.0000 +vt 0.6733 0.2257 0.0000 +vt 0.6711 0.2530 0.0000 +vt 0.6524 0.2582 0.0000 +vt 0.6553 0.2317 0.0000 +vt 0.6167 0.2642 0.0000 +vt 0.6217 0.2394 0.0000 +vt 0.6379 0.2367 0.0000 +vt 0.6341 0.2623 0.0000 +vt 0.6276 0.2172 0.0000 +vt 0.6331 0.1986 0.0000 +vt 0.6464 0.1921 0.0000 +vt 0.6425 0.2132 0.0000 +vt 0.6237 0.1982 0.0000 +vt 0.6150 0.2165 0.0000 +vt 0.6044 0.2111 0.0000 +vt 0.6167 0.1909 0.0000 +vt 0.6071 0.2383 0.0000 +vt 0.6007 0.2628 0.0000 +vt 0.5862 0.2582 0.0000 +vt 0.5942 0.2337 0.0000 +vt 0.5611 0.2450 0.0000 +vt 0.5723 0.2195 0.0000 +vt 0.5827 0.2269 0.0000 +vt 0.5730 0.2518 0.0000 +vt 0.5865 0.1951 0.0000 +vt 0.6034 0.1719 0.0000 +vt 0.6099 0.1815 0.0000 +vt 0.5951 0.2034 0.0000 +vt 0.3240 0.7791 0.0000 +vt 0.3270 0.7885 0.0000 +vt 0.2986 0.7897 0.0000 +vt 0.2962 0.7806 0.0000 +vt 0.3354 0.5544 0.0000 +vt 0.3365 0.5444 0.0000 +vt 0.3659 0.5442 0.0000 +vt 0.3646 0.5537 0.0000 +vt 0.2474 0.8090 0.0000 +vt 0.2467 0.8004 0.0000 +vt 0.2724 0.7998 0.0000 +vt 0.2733 0.8088 0.0000 +vt 0.2456 0.7919 0.0000 +vt 0.2438 0.7834 0.0000 +vt 0.2692 0.7821 0.0000 +vt 0.2711 0.7909 0.0000 +vt 0.3937 0.7461 0.0000 +vt 0.3951 0.7325 0.0000 +vt 0.4219 0.7309 0.0000 +vt 0.4194 0.7436 0.0000 +vt 0.3963 0.7186 0.0000 +vt 0.3968 0.7042 0.0000 +vt 0.4245 0.7038 0.0000 +vt 0.4237 0.7176 0.0000 +vt 0.0477 0.5456 0.0000 +vt 0.0494 0.5579 0.0000 +vt 0.0187 0.5590 0.0000 +vt 0.0166 0.5459 0.0000 +vt 0.0524 0.5698 0.0000 +vt 0.0562 0.5813 0.0000 +vt 0.0281 0.5837 0.0000 +vt 0.0226 0.5715 0.0000 +vt 0.0863 0.5796 0.0000 +vt 0.0838 0.5686 0.0000 +vt 0.1168 0.5679 0.0000 +vt 0.1185 0.5786 0.0000 +vt 0.0815 0.5571 0.0000 +vt 0.0803 0.5453 0.0000 +vt 0.1146 0.5451 0.0000 +vt 0.1154 0.5567 0.0000 +vt 0.1841 0.5449 0.0000 +vt 0.1841 0.5562 0.0000 +vt 0.1500 0.5564 0.0000 +vt 0.1496 0.5450 0.0000 +vt 0.1839 0.5672 0.0000 +vt 0.1836 0.5777 0.0000 +vt 0.1512 0.5780 0.0000 +vt 0.1506 0.5675 0.0000 +vt 0.2883 0.7501 0.0000 +vt 0.2882 0.7355 0.0000 +vt 0.3127 0.7352 0.0000 +vt 0.3129 0.7497 0.0000 +vt 0.2878 0.7204 0.0000 +vt 0.2877 0.7048 0.0000 +vt 0.3125 0.7047 0.0000 +vt 0.3125 0.7203 0.0000 +vt 0.3685 0.7045 0.0000 +vt 0.3682 0.7194 0.0000 +vt 0.3398 0.7200 0.0000 +vt 0.3399 0.7046 0.0000 +vt 0.3676 0.7339 0.0000 +vt 0.3669 0.7479 0.0000 +vt 0.3393 0.7490 0.0000 +vt 0.3397 0.7347 0.0000 +vt 0.5805 0.1448 0.0000 +vt 0.5858 0.1499 0.0000 +vt 0.5638 0.1760 0.0000 +vt 0.5578 0.1719 0.0000 +vt 0.5912 0.1560 0.0000 +vt 0.5971 0.1632 0.0000 +vt 0.5786 0.1876 0.0000 +vt 0.5708 0.1812 0.0000 +vt 0.5504 0.2390 0.0000 +vt 0.5399 0.2341 0.0000 +vt 0.5537 0.2071 0.0000 +vt 0.5629 0.2128 0.0000 +vt 0.2109 0.5963 0.0000 +vt 0.2129 0.5870 0.0000 +vt 0.2419 0.5864 0.0000 +vt 0.2388 0.5954 0.0000 +vt 0.2253 0.7502 0.0000 +vt 0.2251 0.7355 0.0000 +vt 0.2372 0.7355 0.0000 +vt 0.2374 0.7502 0.0000 +vt 0.2250 0.7203 0.0000 +vt 0.2250 0.7048 0.0000 +vt 0.2368 0.7048 0.0000 +vt 0.2369 0.7204 0.0000 +vt 0.2669 0.7048 0.0000 +vt 0.2671 0.7204 0.0000 +vt 0.2505 0.7204 0.0000 +vt 0.2503 0.7048 0.0000 +vt 0.2676 0.7356 0.0000 +vt 0.2678 0.7502 0.0000 +vt 0.2514 0.7503 0.0000 +vt 0.2509 0.7356 0.0000 +vt 0.7478 0.0076 0.0000 +vt 0.7477 0.0203 0.0000 +vt 0.7348 0.0231 0.0000 +vt 0.7352 0.0104 0.0000 +vt 0.7476 0.0341 0.0000 +vt 0.7475 0.0498 0.0000 +vt 0.7341 0.0523 0.0000 +vt 0.7346 0.0367 0.0000 +vt 0.7032 0.0669 0.0000 +vt 0.7035 0.0524 0.0000 +vt 0.7201 0.0426 0.0000 +vt 0.7196 0.0578 0.0000 +vt 0.7035 0.0399 0.0000 +vt 0.7038 0.0282 0.0000 +vt 0.7207 0.0172 0.0000 +vt 0.7204 0.0294 0.0000 +vt 0.0993 0.1514 0.0000 +vt 0.1078 0.1352 0.0000 +vt 0.1211 0.1284 0.0000 +vt 0.1122 0.1446 0.0000 +vt 0.1035 0.1273 0.0000 +vt 0.1175 0.1189 0.0000 +vt 0.0942 0.1435 0.0000 +vt 0.1415 0.0959 0.0000 +vt 0.1309 0.1121 0.0000 +vt 0.1281 0.1027 0.0000 +vt 0.1337 0.1231 0.0000 +vt 0.1436 0.1070 0.0000 +vt 0.0894 0.1369 0.0000 +vt 0.0994 0.1207 0.0000 +vt 0.1140 0.1110 0.0000 +vt 0.0950 0.1147 0.0000 +vt 0.0205 0.8523 0.0000 +vt 0.1106 0.1041 0.0000 +vt 0.0845 0.1313 0.0000 +vt 0.1372 0.0779 0.0000 +vt 0.1253 0.0946 0.0000 +vt 0.1227 0.0868 0.0000 +vt 0.0482 0.8506 0.0000 +vt 0.1393 0.0865 0.0000 +vt 0.1862 0.0353 0.0000 +vt 0.1749 0.0499 0.0000 +vt 0.1627 0.0550 0.0000 +vt 0.1750 0.0390 0.0000 +vt 0.1005 0.8474 0.0000 +vt 0.1756 0.0607 0.0000 +vt 0.1638 0.0647 0.0000 +vt 0.1859 0.0469 0.0000 +vt 0.1509 0.0706 0.0000 +vt 0.1526 0.0801 0.0000 +vt 0.1494 0.0615 0.0000 +vt 0.0748 0.8489 0.0000 +vt 0.1862 0.0589 0.0000 +vt 0.1761 0.0732 0.0000 +vt 0.1649 0.0756 0.0000 +vt 0.1763 0.0875 0.0000 +vt 0.1658 0.0882 0.0000 +vt 0.1861 0.0729 0.0000 +vt 0.1541 0.0911 0.0000 +vt 0.1555 0.1038 0.0000 +vt 0.0376 0.3517 0.0000 +vt 0.0408 0.3646 0.0000 +vt 0.0319 0.3622 0.0000 +vt 0.0311 0.3497 0.0000 +vt 0.0554 0.3779 0.0000 +vt 0.0451 0.3789 0.0000 +vt 0.0496 0.3630 0.0000 +vt 0.0392 0.3910 0.0000 +vt 0.0346 0.3764 0.0000 +vt 0.0507 0.3934 0.0000 +vt 0.0222 0.3562 0.0000 +vt 0.0234 0.3710 0.0000 +vt 0.0656 0.3737 0.0000 +vt 0.0734 0.3885 0.0000 +vt 0.0622 0.3925 0.0000 +vt 0.0936 0.3952 0.0000 +vt 0.0821 0.4024 0.0000 +vt 0.0842 0.3816 0.0000 +vt 0.0792 0.4198 0.0000 +vt 0.0701 0.4066 0.0000 +vt 0.0918 0.4149 0.0000 +vt 0.0578 0.4078 0.0000 +vt 0.0724 0.4492 0.0000 +vt 0.0458 0.6410 0.0000 +vt 0.0621 0.4346 0.0000 +vt 0.0760 0.4345 0.0000 +vt 0.0868 0.4472 0.0000 +vt 0.0392 0.4171 0.0000 +vt 0.0530 0.4205 0.0000 +vt 0.0474 0.4326 0.0000 +vt 0.0207 0.6438 0.0000 +vt 0.0663 0.4215 0.0000 +vt 0.0454 0.4058 0.0000 +vt 0.0895 0.4315 0.0000 +vt 0.0261 0.4107 0.0000 +vt 0.4443 0.5894 0.0000 +vt 0.0209 0.3934 0.0000 +vt 0.0330 0.4010 0.0000 +vt 0.0039 0.3677 0.0000 +vt 0.4872 0.5900 0.0000 +vt 0.0159 0.3776 0.0000 +vt 0.0087 0.3836 0.0000 +vt 0.4714 0.5867 0.0000 +vt 0.0276 0.3856 0.0000 +vt 0.0116 0.3631 0.0000 +vt 0.4919 0.5995 0.0000 +vt 0.1858 0.0888 0.0000 +vt 0.1762 0.1036 0.0000 +vt 0.1664 0.1027 0.0000 +vt 0.1756 0.1217 0.0000 +vt 0.1666 0.1190 0.0000 +vt 0.1850 0.1066 0.0000 +vt 0.1473 0.1343 0.0000 +vt 0.1566 0.1184 0.0000 +vt 0.1572 0.1347 0.0000 +vt 0.1456 0.1198 0.0000 +vt 0.1838 0.1262 0.0000 +vt 0.1744 0.1416 0.0000 +vt 0.1662 0.1372 0.0000 +vt 0.1725 0.1635 0.0000 +vt 0.1649 0.1573 0.0000 +vt 0.1821 0.1477 0.0000 +vt 0.1482 0.1681 0.0000 +vt 0.1570 0.1528 0.0000 +vt 0.1556 0.1729 0.0000 +vt 0.1483 0.1503 0.0000 +vt 0.1206 0.1907 0.0000 +vt 0.1250 0.1789 0.0000 +vt 0.1329 0.1792 0.0000 +vt 0.1266 0.1910 0.0000 +vt 0.1211 0.1671 0.0000 +vt 0.1312 0.1650 0.0000 +vt 0.1157 0.1816 0.0000 +vt 0.1402 0.1653 0.0000 +vt 0.1387 0.1500 0.0000 +vt 0.1398 0.1825 0.0000 +vt 0.1102 0.1712 0.0000 +vt 0.1168 0.1555 0.0000 +vt 0.1282 0.1518 0.0000 +vt 0.1247 0.1394 0.0000 +vt 0.1047 0.1608 0.0000 +vt 0.1364 0.1359 0.0000 +vt 0.1716 0.2785 0.0000 +vt 0.1620 0.2954 0.0000 +vt 0.1524 0.2837 0.0000 +vt 0.1624 0.2670 0.0000 +vt 0.1629 0.3236 0.0000 +vt 0.1526 0.3122 0.0000 +vt 0.1720 0.3068 0.0000 +vt 0.1330 0.3166 0.0000 +vt 0.1426 0.3003 0.0000 +vt 0.1432 0.3287 0.0000 +vt 0.1434 0.2720 0.0000 +vt 0.1333 0.2881 0.0000 +vt 0.1733 0.3341 0.0000 +vt 0.1645 0.3505 0.0000 +vt 0.1537 0.3401 0.0000 +vt 0.1668 0.3751 0.0000 +vt 0.1556 0.3663 0.0000 +vt 0.1754 0.3597 0.0000 +vt 0.1352 0.3712 0.0000 +vt 0.1446 0.3561 0.0000 +vt 0.1463 0.3812 0.0000 +vt 0.1338 0.3446 0.0000 +vt 0.0946 0.3721 0.0000 +vt 0.1044 0.3603 0.0000 +vt 0.1146 0.3734 0.0000 +vt 0.1045 0.3854 0.0000 +vt 0.1043 0.3331 0.0000 +vt 0.1140 0.3469 0.0000 +vt 0.0949 0.3460 0.0000 +vt 0.1244 0.3596 0.0000 +vt 0.1235 0.3322 0.0000 +vt 0.1254 0.3850 0.0000 +vt 0.0954 0.3184 0.0000 +vt 0.1049 0.3050 0.0000 +vt 0.1138 0.3189 0.0000 +vt 0.1070 0.2774 0.0000 +vt 0.1147 0.2907 0.0000 +vt 0.0970 0.2906 0.0000 +vt 0.1235 0.3038 0.0000 +vt 0.1248 0.2758 0.0000 +vt 0.0393 0.2687 0.0000 +vt 0.0305 0.2801 0.0000 +vt 0.0279 0.2641 0.0000 +vt 0.0375 0.2525 0.0000 +vt 0.0272 0.3068 0.0000 +vt 0.0225 0.2921 0.0000 +vt 0.0344 0.2957 0.0000 +vt 0.0104 0.2900 0.0000 +vt 0.5650 0.6017 0.0000 +vt 0.0191 0.2766 0.0000 +vt 0.0151 0.3050 0.0000 +vt 0.0263 0.2479 0.0000 +vt 0.0164 0.2603 0.0000 +vt 0.5947 0.6013 0.0000 +vt 0.0327 0.3207 0.0000 +vt 0.0273 0.3306 0.0000 +vt 0.0211 0.3186 0.0000 +vt 0.0239 0.3422 0.0000 +vt 0.0333 0.3410 0.0000 +vt 0.0135 0.3468 0.0000 +vt 0.5081 0.6036 0.0000 +vt 0.0168 0.3316 0.0000 +vt 0.0095 0.3189 0.0000 +vt 0.5361 0.6024 0.0000 +vt 0.5010 0.5845 0.0000 +vt 0.5182 0.5889 0.0000 +vt 0.5045 0.5942 0.0000 +vt 0.5492 0.5880 0.0000 +vt 0.5345 0.5932 0.0000 +vt 0.5327 0.5835 0.0000 +vt 0.5208 0.5984 0.0000 +vt 0.5500 0.5974 0.0000 +vt 0.5647 0.5828 0.0000 +vt 0.5806 0.5875 0.0000 +vt 0.5650 0.5925 0.0000 +vt 0.6114 0.5870 0.0000 +vt 0.5956 0.5920 0.0000 +vt 0.5965 0.5824 0.0000 +vt 0.5801 0.5969 0.0000 +vt 0.6100 0.5964 0.0000 +vt 0.1149 0.3971 0.0000 +vt 0.1037 0.4072 0.0000 +vt 0.1365 0.3949 0.0000 +vt 0.1259 0.4071 0.0000 +vt 0.1262 0.4261 0.0000 +vt 0.1146 0.4176 0.0000 +vt 0.1376 0.4154 0.0000 +vt 0.1024 0.4258 0.0000 +vt 0.1577 0.3897 0.0000 +vt 0.1480 0.4032 0.0000 +vt 0.1779 0.3824 0.0000 +vt 0.1692 0.3965 0.0000 +vt 0.1717 0.4149 0.0000 +vt 0.1599 0.4098 0.0000 +vt 0.1806 0.4019 0.0000 +vt 0.1496 0.4220 0.0000 +vt 0.1772 0.4449 0.0000 +vt 0.1505 0.6365 0.0000 +vt 0.1638 0.4421 0.0000 +vt 0.1741 0.4305 0.0000 +vt 0.1865 0.4332 0.0000 +vt 0.1393 0.4490 0.0000 +vt 0.1510 0.4382 0.0000 +vt 0.1525 0.4538 0.0000 +vt 0.1259 0.6369 0.0000 +vt 0.1618 0.4269 0.0000 +vt 0.1384 0.4329 0.0000 +vt 0.1832 0.4185 0.0000 +vt 0.1264 0.4580 0.0000 +vt 0.0997 0.6377 0.0000 +vt 0.1130 0.4503 0.0000 +vt 0.1262 0.4424 0.0000 +vt 0.1008 0.4417 0.0000 +vt 0.0988 0.4577 0.0000 +vt 0.0721 0.6389 0.0000 +vt 0.1139 0.4349 0.0000 +vt 0.0755 0.3666 0.0000 +vt 0.0853 0.3573 0.0000 +vt 0.0584 0.3582 0.0000 +vt 0.0675 0.3508 0.0000 +vt 0.0689 0.3251 0.0000 +vt 0.0767 0.3415 0.0000 +vt 0.0601 0.3345 0.0000 +vt 0.0860 0.3306 0.0000 +vt 0.0442 0.3483 0.0000 +vt 0.0518 0.3424 0.0000 +vt 0.0386 0.3343 0.0000 +vt 0.0395 0.3113 0.0000 +vt 0.0455 0.3267 0.0000 +vt 0.0534 0.3181 0.0000 +vt 0.0488 0.2582 0.0000 +vt 0.0517 0.2748 0.0000 +vt 0.0427 0.2852 0.0000 +vt 0.0655 0.2815 0.0000 +vt 0.0562 0.2917 0.0000 +vt 0.0614 0.2648 0.0000 +vt 0.0475 0.3016 0.0000 +vt 0.0620 0.3085 0.0000 +vt 0.0752 0.2712 0.0000 +vt 0.0806 0.2872 0.0000 +vt 0.0711 0.2981 0.0000 +vt 0.0874 0.3030 0.0000 +vt 0.0904 0.2758 0.0000 +vt 0.0780 0.3145 0.0000 +vt 0.7353 0.5442 0.0000 +vt 0.7203 0.5495 0.0000 +vt 0.7062 0.5444 0.0000 +vt 0.7209 0.5391 0.0000 +vt 0.7187 0.5598 0.0000 +vt 0.7051 0.5549 0.0000 +vt 0.7342 0.5545 0.0000 +vt 0.6758 0.5553 0.0000 +vt 0.6911 0.5498 0.0000 +vt 0.6897 0.5604 0.0000 +vt 0.6916 0.5391 0.0000 +vt 0.6766 0.5446 0.0000 +vt 0.7317 0.5645 0.0000 +vt 0.0017 0.8387 0.0000 +vt 0.7158 0.5698 0.0000 +vt 0.7031 0.5652 0.0000 +vt 0.7126 0.5796 0.0000 +vt 0.0698 0.1424 0.0000 +vt 0.7003 0.5752 0.0000 +vt 0.7281 0.5742 0.0000 +vt 0.0050 0.8483 0.0000 +vt 0.6722 0.5762 0.0000 +vt 0.6876 0.5706 0.0000 +vt 0.6851 0.5808 0.0000 +vt 0.0469 0.1699 0.0000 +vt 0.6742 0.5659 0.0000 +vt 0.6127 0.5772 0.0000 +vt 0.6287 0.5718 0.0000 +vt 0.6430 0.5767 0.0000 +vt 0.6272 0.5819 0.0000 +vt 0.6297 0.5612 0.0000 +vt 0.6446 0.5664 0.0000 +vt 0.6135 0.5668 0.0000 +vt 0.6587 0.5713 0.0000 +vt 0.6603 0.5609 0.0000 +vt 0.6566 0.5814 0.0000 +vt 0.6140 0.5559 0.0000 +vt 0.6303 0.5503 0.0000 +vt 0.6456 0.5557 0.0000 +vt 0.6304 0.5391 0.0000 +vt 0.6462 0.5447 0.0000 +vt 0.6142 0.5448 0.0000 +vt 0.6613 0.5501 0.0000 +vt 0.6616 0.5391 0.0000 +vt 0.1861 0.3675 0.0000 +vt 0.1965 0.3742 0.0000 +vt 0.1887 0.3883 0.0000 +vt 0.2137 0.3664 0.0000 +vt 0.2064 0.3798 0.0000 +vt 0.2041 0.3597 0.0000 +vt 0.2088 0.3969 0.0000 +vt 0.1991 0.3930 0.0000 +vt 0.2157 0.3847 0.0000 +vt 0.1915 0.4060 0.0000 +vt 0.2212 0.3531 0.0000 +vt 0.2301 0.3606 0.0000 +vt 0.2228 0.3725 0.0000 +vt 0.2460 0.3583 0.0000 +vt 0.2384 0.3681 0.0000 +vt 0.2378 0.3490 0.0000 +vt 0.2389 0.3846 0.0000 +vt 0.2312 0.3785 0.0000 +vt 0.2460 0.3760 0.0000 +vt 0.2244 0.3893 0.0000 +vt 0.2400 0.4100 0.0000 +vt 0.2134 0.6363 0.0000 +vt 0.2334 0.4068 0.0000 +vt 0.2395 0.3985 0.0000 +vt 0.2460 0.4033 0.0000 +vt 0.2201 0.4134 0.0000 +vt 0.2260 0.4035 0.0000 +vt 0.2280 0.4159 0.0000 +vt 0.2013 0.6363 0.0000 +vt 0.2323 0.3938 0.0000 +vt 0.2178 0.4003 0.0000 +vt 0.2460 0.3912 0.0000 +vt 0.2139 0.4243 0.0000 +vt 0.1872 0.6363 0.0000 +vt 0.2043 0.4231 0.0000 +vt 0.2112 0.4115 0.0000 +vt 0.1942 0.4212 0.0000 +vt 0.1976 0.4351 0.0000 +vt 0.1710 0.6363 0.0000 +vt 0.2017 0.4091 0.0000 +vt 0.1950 0.0748 0.0000 +vt 0.2030 0.0787 0.0000 +vt 0.1942 0.0922 0.0000 +vt 0.2183 0.0720 0.0000 +vt 0.2103 0.0841 0.0000 +vt 0.2113 0.0661 0.0000 +vt 0.2091 0.1040 0.0000 +vt 0.2019 0.0973 0.0000 +vt 0.2174 0.0911 0.0000 +vt 0.1930 0.1114 0.0000 +vt 0.2259 0.0608 0.0000 +vt 0.2325 0.0682 0.0000 +vt 0.2251 0.0791 0.0000 +vt 0.2460 0.0671 0.0000 +vt 0.2392 0.0768 0.0000 +vt 0.2394 0.0584 0.0000 +vt 0.2388 0.0970 0.0000 +vt 0.2319 0.0875 0.0000 +vt 0.2460 0.0864 0.0000 +vt 0.2243 0.0993 0.0000 +vt 0.2381 0.1430 0.0000 +vt 0.2305 0.1316 0.0000 +vt 0.2385 0.1191 0.0000 +vt 0.2460 0.1305 0.0000 +vt 0.2148 0.1348 0.0000 +vt 0.2232 0.1213 0.0000 +vt 0.2221 0.1451 0.0000 +vt 0.2312 0.1086 0.0000 +vt 0.2161 0.1120 0.0000 +vt 0.2460 0.1076 0.0000 +vt 0.2059 0.1493 0.0000 +vt 0.1987 0.1402 0.0000 +vt 0.2076 0.1257 0.0000 +vt 0.1914 0.1325 0.0000 +vt 0.1894 0.1554 0.0000 +vt 0.2004 0.1178 0.0000 +vt 0.1813 0.2617 0.0000 +vt 0.1905 0.2732 0.0000 +vt 0.1812 0.2899 0.0000 +vt 0.2092 0.2687 0.0000 +vt 0.2000 0.2846 0.0000 +vt 0.2000 0.2569 0.0000 +vt 0.2008 0.3115 0.0000 +vt 0.1910 0.3010 0.0000 +vt 0.2095 0.2957 0.0000 +vt 0.1821 0.3175 0.0000 +vt 0.2185 0.2531 0.0000 +vt 0.2276 0.2654 0.0000 +vt 0.2185 0.2804 0.0000 +vt 0.2460 0.2642 0.0000 +vt 0.2369 0.2778 0.0000 +vt 0.2369 0.2510 0.0000 +vt 0.2371 0.3034 0.0000 +vt 0.2278 0.2919 0.0000 +vt 0.2460 0.2904 0.0000 +vt 0.2190 0.3065 0.0000 +vt 0.2291 0.3400 0.0000 +vt 0.2374 0.3273 0.0000 +vt 0.2460 0.3379 0.0000 +vt 0.2119 0.3452 0.0000 +vt 0.2200 0.3309 0.0000 +vt 0.2283 0.3169 0.0000 +vt 0.2105 0.3215 0.0000 +vt 0.2460 0.3152 0.0000 +vt 0.1941 0.3522 0.0000 +vt 0.2022 0.3368 0.0000 +vt 0.1838 0.3437 0.0000 +vt 0.1922 0.3276 0.0000 +vt 0.1178 0.8133 0.0000 +vt 0.1274 0.8174 0.0000 +vt 0.1181 0.8216 0.0000 +vt 0.1073 0.8175 0.0000 +vt 0.1440 0.8173 0.0000 +vt 0.1362 0.8214 0.0000 +vt 0.1360 0.8133 0.0000 +vt 0.1367 0.8294 0.0000 +vt 0.1278 0.8255 0.0000 +vt 0.1443 0.8253 0.0000 +vt 0.1079 0.8259 0.0000 +vt 0.1187 0.8298 0.0000 +vt 0.1514 0.8133 0.0000 +vt 0.1583 0.8173 0.0000 +vt 0.1515 0.8213 0.0000 +vt 0.1715 0.8173 0.0000 +vt 0.1650 0.8212 0.0000 +vt 0.1650 0.8133 0.0000 +vt 0.1651 0.8292 0.0000 +vt 0.1585 0.8252 0.0000 +vt 0.1715 0.8252 0.0000 +vt 0.1518 0.8292 0.0000 +vt 0.1653 0.8452 0.0000 +vt 0.2399 0.0014 0.0000 +vt 0.1590 0.8412 0.0000 +vt 0.1652 0.8372 0.0000 +vt 0.1715 0.8412 0.0000 +vt 0.1456 0.8414 0.0000 +vt 0.1522 0.8373 0.0000 +vt 0.1530 0.8453 0.0000 +vt 0.2275 0.0041 0.0000 +vt 0.1587 0.8332 0.0000 +vt 0.1447 0.8334 0.0000 +vt 0.1715 0.8332 0.0000 +vt 0.1384 0.8457 0.0000 +vt 0.2130 0.0111 0.0000 +vt 0.1294 0.8419 0.0000 +vt 0.1373 0.8376 0.0000 +vt 0.1108 0.8426 0.0000 +vt 0.1197 0.8381 0.0000 +vt 0.1217 0.8463 0.0000 +vt 0.1962 0.0222 0.0000 +vt 0.1285 0.8337 0.0000 +vt 0.1088 0.8343 0.0000 +vt 0.2460 0.1554 0.0000 +vt 0.2377 0.1688 0.0000 +vt 0.2297 0.1565 0.0000 +vt 0.2373 0.1958 0.0000 +vt 0.2289 0.1829 0.0000 +vt 0.2460 0.1819 0.0000 +vt 0.2117 0.1858 0.0000 +vt 0.2209 0.1708 0.0000 +vt 0.2198 0.1977 0.0000 +vt 0.2133 0.1595 0.0000 +vt 0.2460 0.2093 0.0000 +vt 0.2370 0.2234 0.0000 +vt 0.2282 0.2103 0.0000 +vt 0.2278 0.2381 0.0000 +vt 0.2460 0.2370 0.0000 +vt 0.2095 0.2409 0.0000 +vt 0.2189 0.2254 0.0000 +vt 0.2104 0.2131 0.0000 +vt 0.1725 0.2502 0.0000 +vt 0.1826 0.2337 0.0000 +vt 0.1911 0.2451 0.0000 +vt 0.1846 0.2064 0.0000 +vt 0.1925 0.2174 0.0000 +vt 0.1745 0.2227 0.0000 +vt 0.2008 0.2289 0.0000 +vt 0.2023 0.2014 0.0000 +vt 0.1771 0.1962 0.0000 +vt 0.1870 0.1802 0.0000 +vt 0.1945 0.1903 0.0000 +vt 0.1967 0.1644 0.0000 +vt 0.1798 0.1711 0.0000 +vt 0.2041 0.1746 0.0000 +vt 0.1698 0.1872 0.0000 +vt 0.1627 0.1793 0.0000 +vt 0.1668 0.2125 0.0000 +vt 0.1596 0.2032 0.0000 +vt 0.1426 0.2102 0.0000 +vt 0.1527 0.1950 0.0000 +vt 0.1491 0.2191 0.0000 +vt 0.1462 0.1880 0.0000 +vt 0.1641 0.2392 0.0000 +vt 0.1563 0.2288 0.0000 +vt 0.1537 0.2557 0.0000 +vt 0.1352 0.2605 0.0000 +vt 0.1458 0.2448 0.0000 +vt 0.1386 0.2344 0.0000 +vt 0.1006 0.2640 0.0000 +vt 0.1111 0.2515 0.0000 +vt 0.1173 0.2636 0.0000 +vt 0.1167 0.2279 0.0000 +vt 0.1217 0.2384 0.0000 +vt 0.1062 0.2394 0.0000 +vt 0.1279 0.2493 0.0000 +vt 0.1322 0.2247 0.0000 +vt 0.1130 0.2175 0.0000 +vt 0.1226 0.2073 0.0000 +vt 0.1269 0.2156 0.0000 +vt 0.1314 0.1957 0.0000 +vt 0.1199 0.1997 0.0000 +vt 0.1367 0.2023 0.0000 +vt 0.1113 0.2068 0.0000 +vt 0.1122 0.1949 0.0000 +vt 0.1029 0.2271 0.0000 +vt 0.1015 0.2142 0.0000 +vt 0.0917 0.2074 0.0000 +vt 0.1023 0.2007 0.0000 +vt 0.0911 0.2221 0.0000 +vt 0.1053 0.1863 0.0000 +vt 0.0957 0.2503 0.0000 +vt 0.0925 0.2364 0.0000 +vt 0.0853 0.2608 0.0000 +vt 0.0715 0.2552 0.0000 +vt 0.0819 0.2457 0.0000 +vt 0.0804 0.2304 0.0000 +vt 0.0477 0.2418 0.0000 +vt 0.0584 0.2321 0.0000 +vt 0.0590 0.2484 0.0000 +vt 0.0711 0.2072 0.0000 +vt 0.0694 0.2232 0.0000 +vt 0.0596 0.2160 0.0000 +vt 0.0696 0.2392 0.0000 +vt 0.0806 0.2150 0.0000 +vt 0.0746 0.1912 0.0000 +vt 0.0867 0.1834 0.0000 +vt 0.0828 0.1993 0.0000 +vt 0.0987 0.1767 0.0000 +vt 0.0922 0.1674 0.0000 +vt 0.0943 0.1923 0.0000 +vt 0.0175 0.8428 0.0000 +vt 0.0329 0.8468 0.0000 +vt 0.0144 0.8333 0.0000 +vt 0.7480 0.5591 0.0000 +vt 0.0302 0.8375 0.0000 +vt 0.0583 0.8363 0.0000 +vt 0.0455 0.8414 0.0000 +vt 0.0433 0.8323 0.0000 +vt 0.7771 0.5581 0.0000 +vt 0.0605 0.8453 0.0000 +vt 0.7494 0.5491 0.0000 +vt 0.7633 0.5538 0.0000 +vt 0.7500 0.5391 0.0000 +vt 0.7645 0.5440 0.0000 +vt 0.7941 0.5438 0.0000 +vt 0.0561 0.8179 0.0000 +vt 0.7786 0.5486 0.0000 +vt 0.7795 0.5391 0.0000 +vt 0.7925 0.5530 0.0000 +vt 0.0572 0.8272 0.0000 +vt 0.0959 0.8219 0.0000 +vt 0.0830 0.8177 0.0000 +vt 0.0955 0.8133 0.0000 +vt 0.0968 0.8304 0.0000 +vt 0.0837 0.8265 0.0000 +vt 0.0701 0.8223 0.0000 +vt 0.0712 0.8313 0.0000 +vt 0.0695 0.8133 0.0000 +vt 0.0981 0.8390 0.0000 +vt 0.0850 0.8352 0.0000 +vt 0.0867 0.8438 0.0000 +vt 0.0728 0.8401 0.0000 +vt 0.0582 0.6467 0.0000 +vt 0.0443 0.6545 0.0000 +vt 0.0322 0.6489 0.0000 +vt 0.0429 0.6682 0.0000 +vt 0.0302 0.6621 0.0000 +vt 0.0572 0.6605 0.0000 +vt 0.0035 0.6638 0.0000 +vt 0.4211 0.5722 0.0000 +vt 0.0180 0.6565 0.0000 +vt 0.0157 0.6695 0.0000 +vt 0.0066 0.6514 0.0000 +vt 0.4275 0.5846 0.0000 +vt 0.0564 0.6747 0.0000 +vt 0.0421 0.6824 0.0000 +vt 0.0287 0.6757 0.0000 +vt 0.0419 0.6969 0.0000 +vt 0.0281 0.6898 0.0000 +vt 0.0560 0.6895 0.0000 +vt 0.0005 0.6902 0.0000 +vt 0.4145 0.5459 0.0000 +vt 0.0146 0.6831 0.0000 +vt 0.0141 0.6969 0.0000 +vt 0.0014 0.6767 0.0000 +vt 0.4168 0.5593 0.0000 +vt 0.4771 0.5452 0.0000 +vt 0.4617 0.5515 0.0000 +vt 0.4454 0.5455 0.0000 +vt 0.4608 0.5391 0.0000 +vt 0.4641 0.5636 0.0000 +vt 0.4473 0.5581 0.0000 +vt 0.4785 0.5572 0.0000 +vt 0.4309 0.5522 0.0000 +vt 0.4336 0.5651 0.0000 +vt 0.4295 0.5391 0.0000 +vt 0.4811 0.5689 0.0000 +vt 0.4676 0.5754 0.0000 +vt 0.4508 0.5704 0.0000 +vt 0.4554 0.5822 0.0000 +vt 0.4841 0.5800 0.0000 +vt 0.4386 0.5774 0.0000 +vt 0.4984 0.5739 0.0000 +vt 0.5157 0.5787 0.0000 +vt 0.4959 0.5627 0.0000 +vt 0.5135 0.5679 0.0000 +vt 0.5470 0.5674 0.0000 +vt 0.5310 0.5730 0.0000 +vt 0.5294 0.5621 0.0000 +vt 0.5481 0.5780 0.0000 +vt 0.4941 0.5510 0.0000 +vt 0.5117 0.5566 0.0000 +vt 0.4935 0.5391 0.0000 +vt 0.5106 0.5450 0.0000 +vt 0.5454 0.5449 0.0000 +vt 0.5283 0.5507 0.0000 +vt 0.5278 0.5391 0.0000 +vt 0.5460 0.5563 0.0000 +vt 0.5974 0.5504 0.0000 +vt 0.5803 0.5448 0.0000 +vt 0.5974 0.5391 0.0000 +vt 0.5974 0.5615 0.0000 +vt 0.5805 0.5561 0.0000 +vt 0.5631 0.5505 0.0000 +vt 0.5636 0.5617 0.0000 +vt 0.5628 0.5391 0.0000 +vt 0.5971 0.5722 0.0000 +vt 0.5807 0.5670 0.0000 +vt 0.5808 0.5776 0.0000 +vt 0.5642 0.5726 0.0000 +vt 0.1614 0.6436 0.0000 +vt 0.1503 0.6510 0.0000 +vt 0.1383 0.6439 0.0000 +vt 0.1508 0.6658 0.0000 +vt 0.1387 0.6584 0.0000 +vt 0.1614 0.6582 0.0000 +vt 0.1128 0.6588 0.0000 +vt 0.1259 0.6513 0.0000 +vt 0.1261 0.6659 0.0000 +vt 0.1129 0.6443 0.0000 +vt 0.1619 0.6734 0.0000 +vt 0.1510 0.6811 0.0000 +vt 0.1390 0.6734 0.0000 +vt 0.1511 0.6969 0.0000 +vt 0.1391 0.6890 0.0000 +vt 0.1620 0.6890 0.0000 +vt 0.1128 0.6891 0.0000 +vt 0.1262 0.6812 0.0000 +vt 0.1262 0.6969 0.0000 +vt 0.1128 0.6737 0.0000 +vt 0.0703 0.6818 0.0000 +vt 0.0846 0.6892 0.0000 +vt 0.0702 0.6969 0.0000 +vt 0.0708 0.6671 0.0000 +vt 0.0848 0.6741 0.0000 +vt 0.0989 0.6814 0.0000 +vt 0.0990 0.6664 0.0000 +vt 0.0988 0.6969 0.0000 +vt 0.0715 0.6529 0.0000 +vt 0.0851 0.6594 0.0000 +vt 0.0856 0.6453 0.0000 +vt 0.0992 0.6519 0.0000 +vt 0.0752 0.1473 0.0000 +vt 0.0611 0.1583 0.0000 +vt 0.0805 0.1528 0.0000 +vt 0.0667 0.1630 0.0000 +vt 0.0450 0.1890 0.0000 +vt 0.6660 0.5947 0.0000 +vt 0.0528 0.1739 0.0000 +vt 0.0591 0.1784 0.0000 +vt 0.0386 0.1854 0.0000 +vt 0.6696 0.5858 0.0000 +vt 0.0862 0.1594 0.0000 +vt 0.0729 0.1685 0.0000 +vt 0.0796 0.1753 0.0000 +vt 0.0624 0.2001 0.0000 +vt 0.0668 0.1843 0.0000 +vt 0.0537 0.1940 0.0000 +vt 0.0372 0.2365 0.0000 +vt 0.0482 0.2258 0.0000 +vt 0.0266 0.2317 0.0000 +vt 0.6232 0.6006 0.0000 +vt 0.0386 0.2206 0.0000 +vt 0.0504 0.2099 0.0000 +vt 0.0410 0.2044 0.0000 +vt 0.6505 0.5996 0.0000 +vt 0.6252 0.5914 0.0000 +vt 0.6382 0.5956 0.0000 +vt 0.6408 0.5864 0.0000 +vt 0.6537 0.5906 0.0000 +vt 0.2194 0.6436 0.0000 +vt 0.2135 0.6509 0.0000 +vt 0.2075 0.6436 0.0000 +vt 0.2137 0.6658 0.0000 +vt 0.2077 0.6583 0.0000 +vt 0.2194 0.6583 0.0000 +vt 0.1950 0.6582 0.0000 +vt 0.2014 0.6509 0.0000 +vt 0.2018 0.6658 0.0000 +vt 0.1947 0.6435 0.0000 +vt 0.2194 0.6735 0.0000 +vt 0.2138 0.6812 0.0000 +vt 0.2079 0.6734 0.0000 +vt 0.2138 0.6969 0.0000 +vt 0.2080 0.6890 0.0000 +vt 0.2194 0.6890 0.0000 +vt 0.1955 0.6890 0.0000 +vt 0.2019 0.6812 0.0000 +vt 0.2020 0.6969 0.0000 +vt 0.1954 0.6734 0.0000 +vt 0.1718 0.6811 0.0000 +vt 0.1805 0.6890 0.0000 +vt 0.1718 0.6969 0.0000 +vt 0.1715 0.6657 0.0000 +vt 0.1804 0.6734 0.0000 +vt 0.1883 0.6811 0.0000 +vt 0.1881 0.6657 0.0000 +vt 0.1884 0.6969 0.0000 +vt 0.1709 0.6509 0.0000 +vt 0.1799 0.6582 0.0000 +vt 0.1793 0.6436 0.0000 +vt 0.1875 0.6508 0.0000 +vt 0.2460 0.0071 0.0000 +vt 0.2398 0.0139 0.0000 +vt 0.2336 0.0088 0.0000 +vt 0.2398 0.0269 0.0000 +vt 0.2334 0.0213 0.0000 +vt 0.2460 0.0199 0.0000 +vt 0.2199 0.0257 0.0000 +vt 0.2270 0.0168 0.0000 +vt 0.2268 0.0296 0.0000 +vt 0.2204 0.0130 0.0000 +vt 0.2460 0.0338 0.0000 +vt 0.2396 0.0417 0.0000 +vt 0.2333 0.0350 0.0000 +vt 0.2329 0.0507 0.0000 +vt 0.2460 0.0496 0.0000 +vt 0.2191 0.0546 0.0000 +vt 0.2264 0.0443 0.0000 +vt 0.2196 0.0392 0.0000 +vt 0.1955 0.0594 0.0000 +vt 0.2038 0.0619 0.0000 +vt 0.1956 0.0459 0.0000 +vt 0.2042 0.0470 0.0000 +vt 0.2120 0.0499 0.0000 +vt 0.2123 0.0357 0.0000 +vt 0.1956 0.0341 0.0000 +vt 0.2044 0.0340 0.0000 +vt 0.2045 0.0224 0.0000 +vt 0.2125 0.0233 0.0000 +vt 0.3798 0.1446 0.0000 +vt 0.3710 0.1284 0.0000 +vt 0.3843 0.1352 0.0000 +vt 0.3927 0.1514 0.0000 +vt 0.3484 0.1070 0.0000 +vt 0.3612 0.1121 0.0000 +vt 0.3583 0.1231 0.0000 +vt 0.3640 0.1027 0.0000 +vt 0.3746 0.1189 0.0000 +vt 0.3505 0.0959 0.0000 +vt 0.3979 0.1435 0.0000 +vt 0.3885 0.1273 0.0000 +vt 0.3366 0.1038 0.0000 +vt 0.3263 0.0882 0.0000 +vt 0.3379 0.0911 0.0000 +vt 0.3059 0.0729 0.0000 +vt 0.3160 0.0732 0.0000 +vt 0.3157 0.0875 0.0000 +vt 0.3165 0.0607 0.0000 +vt 0.3272 0.0756 0.0000 +vt 0.3059 0.0589 0.0000 +vt 0.3395 0.0801 0.0000 +vt 0.3171 0.0390 0.0000 +vt 0.2425 0.8474 0.0000 +vt 0.3294 0.0550 0.0000 +vt 0.3171 0.0499 0.0000 +vt 0.3059 0.0353 0.0000 +vt 0.3548 0.0779 0.0000 +vt 0.3411 0.0706 0.0000 +vt 0.3427 0.0615 0.0000 +vt 0.2682 0.8489 0.0000 +vt 0.3283 0.0647 0.0000 +vt 0.3528 0.0865 0.0000 +vt 0.3062 0.0469 0.0000 +vt 0.3693 0.0868 0.0000 +vt 0.2948 0.8506 0.0000 +vt 0.3815 0.1041 0.0000 +vt 0.3668 0.0946 0.0000 +vt 0.4076 0.1313 0.0000 +vt 0.3926 0.1207 0.0000 +vt 0.3970 0.1147 0.0000 +vt 0.3225 0.8524 0.0000 +vt 0.3781 0.1110 0.0000 +vt 0.4027 0.1369 0.0000 +vt 0.4609 0.3497 0.0000 +vt 0.4602 0.3622 0.0000 +vt 0.4512 0.3646 0.0000 +vt 0.4545 0.3517 0.0000 +vt 0.4687 0.3710 0.0000 +vt 0.4575 0.3764 0.0000 +vt 0.4699 0.3562 0.0000 +vt 0.4414 0.3934 0.0000 +vt 0.4470 0.3789 0.0000 +vt 0.4528 0.3910 0.0000 +vt 0.4425 0.3630 0.0000 +vt 0.4367 0.3779 0.0000 +vt 0.4805 0.3631 0.0000 +vt 0.0785 0.4788 0.0000 +vt 0.4762 0.3776 0.0000 +vt 0.4644 0.3856 0.0000 +vt 0.4834 0.3836 0.0000 +vt 0.0581 0.4917 0.0000 +vt 0.4712 0.3934 0.0000 +vt 0.4882 0.3677 0.0000 +vt 0.0739 0.4883 0.0000 +vt 0.4528 0.4171 0.0000 +vt 0.4590 0.4010 0.0000 +vt 0.4659 0.4107 0.0000 +vt 0.0309 0.4891 0.0000 +vt 0.4467 0.4058 0.0000 +vt 0.4053 0.4472 0.0000 +vt 0.4160 0.4345 0.0000 +vt 0.4300 0.4346 0.0000 +vt 0.4196 0.4492 0.0000 +vt 0.3930 0.6410 0.0000 +vt 0.4128 0.4198 0.0000 +vt 0.4258 0.4215 0.0000 +vt 0.4026 0.4315 0.0000 +vt 0.4391 0.4205 0.0000 +vt 0.4343 0.4078 0.0000 +vt 0.4447 0.4326 0.0000 +vt 0.4180 0.6438 0.0000 +vt 0.4003 0.4149 0.0000 +vt 0.4099 0.4024 0.0000 +vt 0.4219 0.4066 0.0000 +vt 0.4078 0.3816 0.0000 +vt 0.4187 0.3885 0.0000 +vt 0.3984 0.3952 0.0000 +vt 0.4299 0.3925 0.0000 +vt 0.4265 0.3737 0.0000 +vt 0.3257 0.1027 0.0000 +vt 0.3159 0.1036 0.0000 +vt 0.3063 0.0888 0.0000 +vt 0.3464 0.1198 0.0000 +vt 0.3355 0.1184 0.0000 +vt 0.3349 0.1347 0.0000 +vt 0.3255 0.1190 0.0000 +vt 0.3448 0.1343 0.0000 +vt 0.3070 0.1066 0.0000 +vt 0.3165 0.1217 0.0000 +vt 0.3674 0.1394 0.0000 +vt 0.3556 0.1359 0.0000 +vt 0.3874 0.1608 0.0000 +vt 0.3753 0.1555 0.0000 +vt 0.3709 0.1671 0.0000 +vt 0.3639 0.1518 0.0000 +vt 0.3818 0.1712 0.0000 +vt 0.3533 0.1500 0.0000 +vt 0.3654 0.1910 0.0000 +vt 0.3591 0.1792 0.0000 +vt 0.3671 0.1789 0.0000 +vt 0.3714 0.1907 0.0000 +vt 0.3439 0.1681 0.0000 +vt 0.3519 0.1653 0.0000 +vt 0.3523 0.1825 0.0000 +vt 0.3609 0.1650 0.0000 +vt 0.3438 0.1503 0.0000 +vt 0.3764 0.1816 0.0000 +vt 0.3365 0.1729 0.0000 +vt 0.3271 0.1573 0.0000 +vt 0.3351 0.1528 0.0000 +vt 0.3100 0.1477 0.0000 +vt 0.3177 0.1416 0.0000 +vt 0.3196 0.1635 0.0000 +vt 0.3259 0.1372 0.0000 +vt 0.3082 0.1262 0.0000 +vt 0.3297 0.2670 0.0000 +vt 0.3396 0.2837 0.0000 +vt 0.3300 0.2954 0.0000 +vt 0.3204 0.2785 0.0000 +vt 0.3587 0.2881 0.0000 +vt 0.3494 0.3003 0.0000 +vt 0.3486 0.2720 0.0000 +vt 0.3489 0.3287 0.0000 +vt 0.3395 0.3122 0.0000 +vt 0.3590 0.3166 0.0000 +vt 0.3201 0.3068 0.0000 +vt 0.3292 0.3236 0.0000 +vt 0.3673 0.2758 0.0000 +vt 0.3774 0.2907 0.0000 +vt 0.3686 0.3038 0.0000 +vt 0.3951 0.2906 0.0000 +vt 0.3872 0.3050 0.0000 +vt 0.3851 0.2774 0.0000 +vt 0.3877 0.3331 0.0000 +vt 0.3782 0.3189 0.0000 +vt 0.3967 0.3184 0.0000 +vt 0.3685 0.3322 0.0000 +vt 0.3876 0.3854 0.0000 +vt 0.3774 0.3734 0.0000 +vt 0.3876 0.3603 0.0000 +vt 0.3975 0.3721 0.0000 +vt 0.3569 0.3712 0.0000 +vt 0.3677 0.3596 0.0000 +vt 0.3667 0.3850 0.0000 +vt 0.3780 0.3469 0.0000 +vt 0.3582 0.3446 0.0000 +vt 0.3972 0.3460 0.0000 +vt 0.3457 0.3812 0.0000 +vt 0.3365 0.3663 0.0000 +vt 0.3475 0.3561 0.0000 +vt 0.3167 0.3597 0.0000 +vt 0.3275 0.3505 0.0000 +vt 0.3253 0.3751 0.0000 +vt 0.3383 0.3401 0.0000 +vt 0.3187 0.3341 0.0000 +vt 0.4546 0.2525 0.0000 +vt 0.4642 0.2641 0.0000 +vt 0.4616 0.2801 0.0000 +vt 0.4528 0.2687 0.0000 +vt 0.4757 0.2603 0.0000 +vt 0.1814 0.4758 0.0000 +vt 0.4730 0.2766 0.0000 +vt 0.4658 0.2479 0.0000 +vt 0.4770 0.3050 0.0000 +vt 0.4695 0.2921 0.0000 +vt 0.4816 0.2900 0.0000 +vt 0.1516 0.4757 0.0000 +vt 0.4577 0.2957 0.0000 +vt 0.4649 0.3068 0.0000 +vt 0.1966 0.4808 0.0000 +vt 0.1823 0.4853 0.0000 +vt 0.1668 0.4804 0.0000 +vt 0.1832 0.4952 0.0000 +vt 0.1672 0.4901 0.0000 +vt 0.1980 0.4904 0.0000 +vt 0.1359 0.4898 0.0000 +vt 0.1517 0.4851 0.0000 +vt 0.1514 0.4949 0.0000 +vt 0.1367 0.4802 0.0000 +vt 0.0912 0.4840 0.0000 +vt 0.1048 0.4892 0.0000 +vt 0.0877 0.4937 0.0000 +vt 0.0948 0.4745 0.0000 +vt 0.4786 0.3468 0.0000 +vt 0.1075 0.4796 0.0000 +vt 0.1212 0.4847 0.0000 +vt 0.1228 0.4752 0.0000 +vt 0.4826 0.3189 0.0000 +vt 0.1194 0.4945 0.0000 +vt 0.4681 0.3422 0.0000 +vt 0.4753 0.3316 0.0000 +vt 0.4588 0.3410 0.0000 +vt 0.4647 0.3306 0.0000 +vt 0.4709 0.3186 0.0000 +vt 0.4594 0.3207 0.0000 +vt 0.3883 0.4072 0.0000 +vt 0.3772 0.3971 0.0000 +vt 0.3897 0.4258 0.0000 +vt 0.3775 0.4176 0.0000 +vt 0.3545 0.4154 0.0000 +vt 0.3661 0.4071 0.0000 +vt 0.3659 0.4261 0.0000 +vt 0.3556 0.3949 0.0000 +vt 0.3913 0.4417 0.0000 +vt 0.3782 0.4349 0.0000 +vt 0.3933 0.4577 0.0000 +vt 0.3666 0.6389 0.0000 +vt 0.3790 0.4503 0.0000 +vt 0.3528 0.4490 0.0000 +vt 0.3658 0.4424 0.0000 +vt 0.3657 0.4580 0.0000 +vt 0.3390 0.6377 0.0000 +vt 0.3537 0.4329 0.0000 +vt 0.3056 0.4332 0.0000 +vt 0.3180 0.4305 0.0000 +vt 0.3282 0.4421 0.0000 +vt 0.3149 0.4449 0.0000 +vt 0.2882 0.6365 0.0000 +vt 0.3204 0.4149 0.0000 +vt 0.3302 0.4269 0.0000 +vt 0.3088 0.4185 0.0000 +vt 0.3411 0.4382 0.0000 +vt 0.3425 0.4220 0.0000 +vt 0.3395 0.4538 0.0000 +vt 0.3129 0.6369 0.0000 +vt 0.3115 0.4019 0.0000 +vt 0.3228 0.3965 0.0000 +vt 0.3322 0.4098 0.0000 +vt 0.3343 0.3897 0.0000 +vt 0.3142 0.3824 0.0000 +vt 0.3440 0.4032 0.0000 +vt 0.4068 0.3573 0.0000 +vt 0.4165 0.3666 0.0000 +vt 0.4061 0.3306 0.0000 +vt 0.4153 0.3415 0.0000 +vt 0.4319 0.3345 0.0000 +vt 0.4246 0.3508 0.0000 +vt 0.4231 0.3251 0.0000 +vt 0.4336 0.3582 0.0000 +vt 0.4047 0.3030 0.0000 +vt 0.4140 0.3145 0.0000 +vt 0.4017 0.2758 0.0000 +vt 0.4115 0.2872 0.0000 +vt 0.4266 0.2815 0.0000 +vt 0.4209 0.2981 0.0000 +vt 0.4169 0.2712 0.0000 +vt 0.4300 0.3085 0.0000 +vt 0.4494 0.2852 0.0000 +vt 0.4403 0.2748 0.0000 +vt 0.4432 0.2582 0.0000 +vt 0.4525 0.3113 0.0000 +vt 0.4446 0.3016 0.0000 +vt 0.4358 0.2917 0.0000 +vt 0.4387 0.3181 0.0000 +vt 0.4307 0.2648 0.0000 +vt 0.4535 0.3343 0.0000 +vt 0.4466 0.3267 0.0000 +vt 0.4478 0.3483 0.0000 +vt 0.4402 0.3424 0.0000 +vt 0.3076 0.5394 0.0000 +vt 0.2928 0.5340 0.0000 +vt 0.3070 0.5289 0.0000 +vt 0.3219 0.5343 0.0000 +vt 0.2633 0.5338 0.0000 +vt 0.2778 0.5285 0.0000 +vt 0.2783 0.5393 0.0000 +vt 0.2764 0.5179 0.0000 +vt 0.2918 0.5234 0.0000 +vt 0.2625 0.5229 0.0000 +vt 0.3209 0.5240 0.0000 +vt 0.3054 0.5185 0.0000 +vt 0.2483 0.5393 0.0000 +vt 0.2328 0.5337 0.0000 +vt 0.2480 0.5282 0.0000 +vt 0.2008 0.5336 0.0000 +vt 0.2169 0.5280 0.0000 +vt 0.2171 0.5393 0.0000 +vt 0.2164 0.5168 0.0000 +vt 0.2323 0.5225 0.0000 +vt 0.2006 0.5223 0.0000 +vt 0.2470 0.5173 0.0000 +vt 0.2139 0.4957 0.0000 +vt 0.2297 0.5011 0.0000 +vt 0.2154 0.5060 0.0000 +vt 0.1993 0.5005 0.0000 +vt 0.2589 0.5018 0.0000 +vt 0.2453 0.5066 0.0000 +vt 0.2433 0.4963 0.0000 +vt 0.2312 0.5116 0.0000 +vt 0.2609 0.5123 0.0000 +vt 0.2002 0.5112 0.0000 +vt 0.2718 0.4972 0.0000 +vt 0.4452 0.1699 0.0000 +vt 0.2870 0.5029 0.0000 +vt 0.2742 0.5075 0.0000 +vt 0.3148 0.5042 0.0000 +vt 0.3380 0.8485 0.0000 +vt 0.3025 0.5085 0.0000 +vt 0.2993 0.4986 0.0000 +vt 0.4223 0.1424 0.0000 +vt 0.2897 0.5131 0.0000 +vt 0.3183 0.5139 0.0000 +vt 0.3413 0.8388 0.0000 +vt 0.3033 0.3883 0.0000 +vt 0.2956 0.3742 0.0000 +vt 0.3060 0.3675 0.0000 +vt 0.3006 0.4060 0.0000 +vt 0.2930 0.3930 0.0000 +vt 0.2763 0.3847 0.0000 +vt 0.2857 0.3798 0.0000 +vt 0.2832 0.3969 0.0000 +vt 0.2880 0.3597 0.0000 +vt 0.2784 0.3664 0.0000 +vt 0.2978 0.4212 0.0000 +vt 0.2904 0.4091 0.0000 +vt 0.2944 0.4351 0.0000 +vt 0.2678 0.6363 0.0000 +vt 0.2877 0.4231 0.0000 +vt 0.2719 0.4134 0.0000 +vt 0.2809 0.4115 0.0000 +vt 0.2782 0.4243 0.0000 +vt 0.2515 0.6363 0.0000 +vt 0.2743 0.4003 0.0000 +vt 0.2526 0.3985 0.0000 +vt 0.2586 0.4068 0.0000 +vt 0.2520 0.4100 0.0000 +vt 0.2254 0.6363 0.0000 +vt 0.2531 0.3846 0.0000 +vt 0.2598 0.3938 0.0000 +vt 0.2660 0.4035 0.0000 +vt 0.2677 0.3893 0.0000 +vt 0.2641 0.4159 0.0000 +vt 0.2374 0.6363 0.0000 +vt 0.2537 0.3681 0.0000 +vt 0.2609 0.3785 0.0000 +vt 0.2542 0.3490 0.0000 +vt 0.2620 0.3606 0.0000 +vt 0.2693 0.3725 0.0000 +vt 0.2708 0.3531 0.0000 +vt 0.2979 0.0922 0.0000 +vt 0.2891 0.0787 0.0000 +vt 0.2970 0.0748 0.0000 +vt 0.2990 0.1114 0.0000 +vt 0.2902 0.0973 0.0000 +vt 0.2747 0.0911 0.0000 +vt 0.2817 0.0841 0.0000 +vt 0.2830 0.1040 0.0000 +vt 0.2808 0.0661 0.0000 +vt 0.2737 0.0720 0.0000 +vt 0.3006 0.1325 0.0000 +vt 0.2916 0.1178 0.0000 +vt 0.3026 0.1554 0.0000 +vt 0.2934 0.1402 0.0000 +vt 0.2773 0.1348 0.0000 +vt 0.2844 0.1257 0.0000 +vt 0.2861 0.1493 0.0000 +vt 0.2759 0.1120 0.0000 +vt 0.2536 0.1191 0.0000 +vt 0.2616 0.1316 0.0000 +vt 0.2540 0.1430 0.0000 +vt 0.2532 0.0970 0.0000 +vt 0.2608 0.1086 0.0000 +vt 0.2688 0.1213 0.0000 +vt 0.2678 0.0993 0.0000 +vt 0.2700 0.1451 0.0000 +vt 0.2529 0.0768 0.0000 +vt 0.2601 0.0875 0.0000 +vt 0.2526 0.0584 0.0000 +vt 0.2596 0.0682 0.0000 +vt 0.2669 0.0791 0.0000 +vt 0.2662 0.0608 0.0000 +vt 0.3109 0.2899 0.0000 +vt 0.3015 0.2732 0.0000 +vt 0.3107 0.2617 0.0000 +vt 0.3100 0.3175 0.0000 +vt 0.3011 0.3010 0.0000 +vt 0.2825 0.2957 0.0000 +vt 0.2921 0.2846 0.0000 +vt 0.2913 0.3115 0.0000 +vt 0.2921 0.2569 0.0000 +vt 0.2829 0.2687 0.0000 +vt 0.3083 0.3437 0.0000 +vt 0.2999 0.3276 0.0000 +vt 0.2980 0.3522 0.0000 +vt 0.2802 0.3452 0.0000 +vt 0.2899 0.3368 0.0000 +vt 0.2816 0.3215 0.0000 +vt 0.2547 0.3273 0.0000 +vt 0.2629 0.3400 0.0000 +vt 0.2550 0.3034 0.0000 +vt 0.2637 0.3169 0.0000 +vt 0.2721 0.3309 0.0000 +vt 0.2730 0.3065 0.0000 +vt 0.2552 0.2778 0.0000 +vt 0.2642 0.2919 0.0000 +vt 0.2552 0.2510 0.0000 +vt 0.2644 0.2654 0.0000 +vt 0.2735 0.2804 0.0000 +vt 0.2736 0.2531 0.0000 +vt 0.2357 0.8175 0.0000 +vt 0.2249 0.8216 0.0000 +vt 0.2156 0.8174 0.0000 +vt 0.2252 0.8133 0.0000 +vt 0.2242 0.8298 0.0000 +vt 0.2151 0.8255 0.0000 +vt 0.2351 0.8259 0.0000 +vt 0.1987 0.8253 0.0000 +vt 0.2068 0.8214 0.0000 +vt 0.2063 0.8294 0.0000 +vt 0.2070 0.8133 0.0000 +vt 0.1989 0.8173 0.0000 +vt 0.2341 0.8343 0.0000 +vt 0.2232 0.8381 0.0000 +vt 0.2145 0.8337 0.0000 +vt 0.2213 0.8463 0.0000 +vt 0.2959 0.0222 0.0000 +vt 0.2135 0.8419 0.0000 +vt 0.2322 0.8426 0.0000 +vt 0.1974 0.8414 0.0000 +vt 0.2056 0.8376 0.0000 +vt 0.2045 0.8457 0.0000 +vt 0.2791 0.0111 0.0000 +vt 0.1982 0.8334 0.0000 +vt 0.1778 0.8372 0.0000 +vt 0.1840 0.8412 0.0000 +vt 0.1777 0.8452 0.0000 +vt 0.2522 0.0014 0.0000 +vt 0.1779 0.8292 0.0000 +vt 0.1843 0.8332 0.0000 +vt 0.1908 0.8373 0.0000 +vt 0.1912 0.8292 0.0000 +vt 0.1900 0.8453 0.0000 +vt 0.2645 0.0041 0.0000 +vt 0.1780 0.8212 0.0000 +vt 0.1845 0.8252 0.0000 +vt 0.1780 0.8133 0.0000 +vt 0.1846 0.8173 0.0000 +vt 0.1915 0.8213 0.0000 +vt 0.1916 0.8133 0.0000 +vt 0.2624 0.1565 0.0000 +vt 0.2544 0.1688 0.0000 +vt 0.2788 0.1595 0.0000 +vt 0.2711 0.1708 0.0000 +vt 0.2722 0.1977 0.0000 +vt 0.2631 0.1829 0.0000 +vt 0.2803 0.1858 0.0000 +vt 0.2548 0.1958 0.0000 +vt 0.2954 0.1644 0.0000 +vt 0.2880 0.1746 0.0000 +vt 0.3123 0.1711 0.0000 +vt 0.3050 0.1802 0.0000 +vt 0.3075 0.2064 0.0000 +vt 0.2976 0.1903 0.0000 +vt 0.3150 0.1962 0.0000 +vt 0.2898 0.2014 0.0000 +vt 0.3010 0.2451 0.0000 +vt 0.3095 0.2337 0.0000 +vt 0.3196 0.2502 0.0000 +vt 0.2826 0.2409 0.0000 +vt 0.2912 0.2289 0.0000 +vt 0.2995 0.2174 0.0000 +vt 0.2816 0.2131 0.0000 +vt 0.3176 0.2227 0.0000 +vt 0.2643 0.2381 0.0000 +vt 0.2731 0.2254 0.0000 +vt 0.2550 0.2234 0.0000 +vt 0.2638 0.2103 0.0000 +vt 0.3294 0.1793 0.0000 +vt 0.3223 0.1872 0.0000 +vt 0.3459 0.1880 0.0000 +vt 0.3393 0.1950 0.0000 +vt 0.3429 0.2191 0.0000 +vt 0.3325 0.2032 0.0000 +vt 0.3495 0.2102 0.0000 +vt 0.3253 0.2125 0.0000 +vt 0.3606 0.1957 0.0000 +vt 0.3554 0.2023 0.0000 +vt 0.3722 0.1997 0.0000 +vt 0.3695 0.2073 0.0000 +vt 0.3754 0.2279 0.0000 +vt 0.3652 0.2156 0.0000 +vt 0.3790 0.2175 0.0000 +vt 0.3598 0.2247 0.0000 +vt 0.3747 0.2636 0.0000 +vt 0.3810 0.2515 0.0000 +vt 0.3915 0.2640 0.0000 +vt 0.3568 0.2605 0.0000 +vt 0.3641 0.2493 0.0000 +vt 0.3704 0.2384 0.0000 +vt 0.3535 0.2344 0.0000 +vt 0.3858 0.2394 0.0000 +vt 0.3383 0.2557 0.0000 +vt 0.3463 0.2448 0.0000 +vt 0.3279 0.2392 0.0000 +vt 0.3357 0.2288 0.0000 +vt 0.3799 0.1949 0.0000 +vt 0.3807 0.2068 0.0000 +vt 0.3867 0.1863 0.0000 +vt 0.3897 0.2007 0.0000 +vt 0.4009 0.2221 0.0000 +vt 0.3905 0.2142 0.0000 +vt 0.4003 0.2074 0.0000 +vt 0.3891 0.2271 0.0000 +vt 0.3934 0.1767 0.0000 +vt 0.3978 0.1923 0.0000 +vt 0.3998 0.1674 0.0000 +vt 0.4054 0.1834 0.0000 +vt 0.4209 0.2072 0.0000 +vt 0.4093 0.1993 0.0000 +vt 0.4175 0.1912 0.0000 +vt 0.4114 0.2150 0.0000 +vt 0.4331 0.2484 0.0000 +vt 0.4337 0.2321 0.0000 +vt 0.4444 0.2418 0.0000 +vt 0.4206 0.2552 0.0000 +vt 0.4225 0.2392 0.0000 +vt 0.4226 0.2232 0.0000 +vt 0.4117 0.2304 0.0000 +vt 0.4325 0.2160 0.0000 +vt 0.4067 0.2608 0.0000 +vt 0.4101 0.2457 0.0000 +vt 0.3963 0.2503 0.0000 +vt 0.3995 0.2364 0.0000 +vt 0.3100 0.8469 0.0000 +vt 0.3255 0.8429 0.0000 +vt 0.2825 0.8453 0.0000 +vt 0.2974 0.8415 0.0000 +vt 0.2997 0.8323 0.0000 +vt 0.3638 0.5204 0.0000 +vt 0.3128 0.8375 0.0000 +vt 0.2846 0.8363 0.0000 +vt 0.3285 0.8334 0.0000 +vt 0.3347 0.5193 0.0000 +vt 0.2563 0.8438 0.0000 +vt 0.2702 0.8401 0.0000 +vt 0.2448 0.8390 0.0000 +vt 0.2462 0.8304 0.0000 +vt 0.2580 0.8352 0.0000 +vt 0.2718 0.8313 0.0000 +vt 0.2475 0.8133 0.0000 +vt 0.2600 0.8177 0.0000 +vt 0.2471 0.8219 0.0000 +vt 0.2868 0.8179 0.0000 +vt 0.3807 0.5348 0.0000 +vt 0.2728 0.8223 0.0000 +vt 0.2734 0.8133 0.0000 +vt 0.2592 0.8265 0.0000 +vt 0.2858 0.8272 0.0000 +vt 0.3791 0.5255 0.0000 +vt 0.3662 0.5394 0.0000 +vt 0.3512 0.5345 0.0000 +vt 0.3653 0.5299 0.0000 +vt 0.3361 0.5294 0.0000 +vt 0.3367 0.5394 0.0000 +vt 0.3500 0.5248 0.0000 +vt 0.4066 0.6489 0.0000 +vt 0.3944 0.6545 0.0000 +vt 0.3805 0.6467 0.0000 +vt 0.4321 0.6514 0.0000 +vt 0.0142 0.4939 0.0000 +vt 0.4207 0.6565 0.0000 +vt 0.4230 0.6695 0.0000 +vt 0.4086 0.6621 0.0000 +vt 0.4353 0.6638 0.0000 +vt 0.0078 0.5063 0.0000 +vt 0.3815 0.6605 0.0000 +vt 0.3958 0.6682 0.0000 +vt 0.0421 0.4963 0.0000 +vt 0.0253 0.5012 0.0000 +vt 0.0708 0.4983 0.0000 +vt 0.0543 0.5031 0.0000 +vt 0.0508 0.5148 0.0000 +vt 0.0374 0.5081 0.0000 +vt 0.0678 0.5095 0.0000 +vt 0.0203 0.5134 0.0000 +vt 0.0475 0.5394 0.0000 +vt 0.0321 0.5330 0.0000 +vt 0.0484 0.5270 0.0000 +vt 0.0637 0.5333 0.0000 +vt 0.0012 0.5327 0.0000 +vt 0.4383 0.6902 0.0000 +vt 0.0175 0.5263 0.0000 +vt 0.0162 0.5394 0.0000 +vt 0.0340 0.5204 0.0000 +vt 0.0035 0.5192 0.0000 +vt 0.4373 0.6767 0.0000 +vt 0.0652 0.5213 0.0000 +vt 0.4246 0.6969 0.0000 +vt 0.4107 0.6898 0.0000 +vt 0.4241 0.6831 0.0000 +vt 0.3828 0.6895 0.0000 +vt 0.3966 0.6824 0.0000 +vt 0.3969 0.6969 0.0000 +vt 0.4100 0.6757 0.0000 +vt 0.3824 0.6747 0.0000 +vt 0.1023 0.4994 0.0000 +vt 0.0851 0.5044 0.0000 +vt 0.1348 0.4999 0.0000 +vt 0.1176 0.5051 0.0000 +vt 0.1161 0.5162 0.0000 +vt 0.1001 0.5103 0.0000 +vt 0.1337 0.5107 0.0000 +vt 0.0825 0.5157 0.0000 +vt 0.1674 0.5002 0.0000 +vt 0.1509 0.5054 0.0000 +vt 0.1838 0.5056 0.0000 +vt 0.1840 0.5166 0.0000 +vt 0.1674 0.5109 0.0000 +vt 0.1502 0.5164 0.0000 +vt 0.1841 0.5393 0.0000 +vt 0.1670 0.5335 0.0000 +vt 0.1841 0.5278 0.0000 +vt 0.1321 0.5335 0.0000 +vt 0.1497 0.5278 0.0000 +vt 0.1495 0.5393 0.0000 +vt 0.1671 0.5221 0.0000 +vt 0.1327 0.5220 0.0000 +vt 0.1145 0.5393 0.0000 +vt 0.0973 0.5334 0.0000 +vt 0.1149 0.5277 0.0000 +vt 0.0808 0.5274 0.0000 +vt 0.0801 0.5394 0.0000 +vt 0.0983 0.5218 0.0000 +vt 0.3004 0.6439 0.0000 +vt 0.2884 0.6510 0.0000 +vt 0.2773 0.6436 0.0000 +vt 0.3258 0.6443 0.0000 +vt 0.3128 0.6513 0.0000 +vt 0.3126 0.6659 0.0000 +vt 0.3001 0.6584 0.0000 +vt 0.3260 0.6588 0.0000 +vt 0.2773 0.6582 0.0000 +vt 0.2879 0.6658 0.0000 +vt 0.3531 0.6453 0.0000 +vt 0.3395 0.6519 0.0000 +vt 0.3672 0.6529 0.0000 +vt 0.3679 0.6671 0.0000 +vt 0.3536 0.6594 0.0000 +vt 0.3397 0.6664 0.0000 +vt 0.3685 0.6969 0.0000 +vt 0.3541 0.6892 0.0000 +vt 0.3684 0.6818 0.0000 +vt 0.3260 0.6891 0.0000 +vt 0.3399 0.6814 0.0000 +vt 0.3399 0.6969 0.0000 +vt 0.3540 0.6741 0.0000 +vt 0.3259 0.6737 0.0000 +vt 0.3125 0.6969 0.0000 +vt 0.2997 0.6890 0.0000 +vt 0.3125 0.6812 0.0000 +vt 0.2767 0.6890 0.0000 +vt 0.2877 0.6811 0.0000 +vt 0.2877 0.6969 0.0000 +vt 0.2997 0.6734 0.0000 +vt 0.2768 0.6734 0.0000 +vt 0.4309 0.1583 0.0000 +vt 0.4168 0.1473 0.0000 +vt 0.4534 0.1854 0.0000 +vt 0.2563 0.4919 0.0000 +vt 0.4392 0.1739 0.0000 +vt 0.4330 0.1784 0.0000 +vt 0.4253 0.1630 0.0000 +vt 0.4470 0.1890 0.0000 +vt 0.2527 0.4829 0.0000 +vt 0.4115 0.1528 0.0000 +vt 0.2275 0.4911 0.0000 +vt 0.2404 0.4869 0.0000 +vt 0.2119 0.4859 0.0000 +vt 0.2099 0.4765 0.0000 +vt 0.4655 0.2317 0.0000 +vt 0.2249 0.4817 0.0000 +vt 0.2372 0.4777 0.0000 +vt 0.4511 0.2044 0.0000 +vt 0.4438 0.2258 0.0000 +vt 0.4548 0.2365 0.0000 +vt 0.4296 0.2001 0.0000 +vt 0.4417 0.2099 0.0000 +vt 0.4535 0.2206 0.0000 +vt 0.4384 0.1940 0.0000 +vt 0.4125 0.1753 0.0000 +vt 0.4253 0.1843 0.0000 +vt 0.4059 0.1594 0.0000 +vt 0.4192 0.1685 0.0000 +vt 0.2313 0.6436 0.0000 +vt 0.2252 0.6509 0.0000 +vt 0.2440 0.6435 0.0000 +vt 0.2373 0.6509 0.0000 +vt 0.2370 0.6658 0.0000 +vt 0.2310 0.6583 0.0000 +vt 0.2438 0.6582 0.0000 +vt 0.2250 0.6658 0.0000 +vt 0.2594 0.6436 0.0000 +vt 0.2512 0.6508 0.0000 +vt 0.2678 0.6509 0.0000 +vt 0.2673 0.6657 0.0000 +vt 0.2588 0.6582 0.0000 +vt 0.2507 0.6657 0.0000 +vt 0.2669 0.6969 0.0000 +vt 0.2582 0.6890 0.0000 +vt 0.2670 0.6811 0.0000 +vt 0.2433 0.6890 0.0000 +vt 0.2504 0.6811 0.0000 +vt 0.2503 0.6969 0.0000 +vt 0.2583 0.6734 0.0000 +vt 0.2434 0.6734 0.0000 +vt 0.2368 0.6969 0.0000 +vt 0.2307 0.6890 0.0000 +vt 0.2368 0.6812 0.0000 +vt 0.2250 0.6812 0.0000 +vt 0.2250 0.6969 0.0000 +vt 0.2308 0.6734 0.0000 +vt 0.2585 0.0088 0.0000 +vt 0.2522 0.0139 0.0000 +vt 0.2717 0.0130 0.0000 +vt 0.2651 0.0168 0.0000 +vt 0.2653 0.0296 0.0000 +vt 0.2586 0.0213 0.0000 +vt 0.2722 0.0257 0.0000 +vt 0.2523 0.0269 0.0000 +vt 0.2876 0.0224 0.0000 +vt 0.2795 0.0233 0.0000 +vt 0.2965 0.0341 0.0000 +vt 0.2965 0.0459 0.0000 +vt 0.2877 0.0340 0.0000 +vt 0.2797 0.0357 0.0000 +vt 0.2883 0.0619 0.0000 +vt 0.2966 0.0594 0.0000 +vt 0.2729 0.0546 0.0000 +vt 0.2801 0.0499 0.0000 +vt 0.2878 0.0470 0.0000 +vt 0.2724 0.0392 0.0000 +vt 0.2591 0.0507 0.0000 +vt 0.2656 0.0443 0.0000 +vt 0.2524 0.0417 0.0000 +vt 0.2588 0.0350 0.0000 +vt 0.8878 0.1446 0.0000 +vt 0.8789 0.1284 0.0000 +vt 0.8922 0.1352 0.0000 +vt 0.9007 0.1514 0.0000 +vt 0.8564 0.1070 0.0000 +vt 0.8691 0.1121 0.0000 +vt 0.8663 0.1231 0.0000 +vt 0.8719 0.1027 0.0000 +vt 0.8825 0.1189 0.0000 +vt 0.8585 0.0959 0.0000 +vt 0.9058 0.1435 0.0000 +vt 0.8965 0.1273 0.0000 +vt 0.8445 0.1038 0.0000 +vt 0.8342 0.0882 0.0000 +vt 0.8459 0.0911 0.0000 +vt 0.8139 0.0729 0.0000 +vt 0.8239 0.0732 0.0000 +vt 0.8237 0.0875 0.0000 +vt 0.8244 0.0607 0.0000 +vt 0.8351 0.0756 0.0000 +vt 0.8138 0.0589 0.0000 +vt 0.8474 0.0801 0.0000 +vt 0.8250 0.0390 0.0000 +vt 0.1005 0.7792 0.0000 +vt 0.8373 0.0550 0.0000 +vt 0.8251 0.0499 0.0000 +vt 0.8138 0.0353 0.0000 +vt 0.8628 0.0779 0.0000 +vt 0.8491 0.0706 0.0000 +vt 0.8506 0.0615 0.0000 +vt 0.0748 0.7777 0.0000 +vt 0.8362 0.0647 0.0000 +vt 0.8607 0.0865 0.0000 +vt 0.8141 0.0469 0.0000 +vt 0.8773 0.0868 0.0000 +vt 0.0482 0.7760 0.0000 +vt 0.8894 0.1041 0.0000 +vt 0.8747 0.0946 0.0000 +vt 0.9155 0.1313 0.0000 +vt 0.9006 0.1207 0.0000 +vt 0.9050 0.1147 0.0000 +vt 0.0205 0.7743 0.0000 +vt 0.8860 0.1110 0.0000 +vt 0.9106 0.1369 0.0000 +vt 0.9689 0.3497 0.0000 +vt 0.9681 0.3622 0.0000 +vt 0.9592 0.3646 0.0000 +vt 0.9624 0.3517 0.0000 +vt 0.9766 0.3710 0.0000 +vt 0.9654 0.3764 0.0000 +vt 0.9778 0.3562 0.0000 +vt 0.9493 0.3934 0.0000 +vt 0.9549 0.3789 0.0000 +vt 0.9608 0.3910 0.0000 +vt 0.9504 0.3630 0.0000 +vt 0.9446 0.3779 0.0000 +vt 0.9884 0.3631 0.0000 +vt 0.4919 0.4788 0.0000 +vt 0.9841 0.3776 0.0000 +vt 0.9724 0.3856 0.0000 +vt 0.9913 0.3836 0.0000 +vt 0.4714 0.4916 0.0000 +vt 0.9791 0.3934 0.0000 +vt 0.9961 0.3677 0.0000 +vt 0.4872 0.4883 0.0000 +vt 0.9608 0.4171 0.0000 +vt 0.9670 0.4010 0.0000 +vt 0.9739 0.4107 0.0000 +vt 0.4443 0.4889 0.0000 +vt 0.9546 0.4058 0.0000 +vt 0.9132 0.4472 0.0000 +vt 0.9240 0.4345 0.0000 +vt 0.9379 0.4346 0.0000 +vt 0.9276 0.4492 0.0000 +vt 0.0458 0.7528 0.0000 +vt 0.9208 0.4198 0.0000 +vt 0.9337 0.4215 0.0000 +vt 0.9105 0.4315 0.0000 +vt 0.9470 0.4205 0.0000 +vt 0.9422 0.4078 0.0000 +vt 0.9526 0.4326 0.0000 +vt 0.0207 0.7500 0.0000 +vt 0.9082 0.4149 0.0000 +vt 0.9179 0.4024 0.0000 +vt 0.9299 0.4066 0.0000 +vt 0.9158 0.3816 0.0000 +vt 0.9266 0.3885 0.0000 +vt 0.9064 0.3952 0.0000 +vt 0.9378 0.3925 0.0000 +vt 0.9344 0.3737 0.0000 +vt 0.8336 0.1027 0.0000 +vt 0.8238 0.1036 0.0000 +vt 0.8142 0.0888 0.0000 +vt 0.8544 0.1198 0.0000 +vt 0.8434 0.1184 0.0000 +vt 0.8428 0.1347 0.0000 +vt 0.8334 0.1190 0.0000 +vt 0.8527 0.1343 0.0000 +vt 0.8150 0.1066 0.0000 +vt 0.8244 0.1217 0.0000 +vt 0.8753 0.1394 0.0000 +vt 0.8636 0.1359 0.0000 +vt 0.8953 0.1608 0.0000 +vt 0.8832 0.1555 0.0000 +vt 0.8789 0.1671 0.0000 +vt 0.8718 0.1518 0.0000 +vt 0.8898 0.1712 0.0000 +vt 0.8613 0.1500 0.0000 +vt 0.8734 0.1910 0.0000 +vt 0.8671 0.1792 0.0000 +vt 0.8750 0.1789 0.0000 +vt 0.8794 0.1907 0.0000 +vt 0.8518 0.1681 0.0000 +vt 0.8598 0.1653 0.0000 +vt 0.8602 0.1825 0.0000 +vt 0.8688 0.1650 0.0000 +vt 0.8517 0.1503 0.0000 +vt 0.8843 0.1816 0.0000 +vt 0.8444 0.1729 0.0000 +vt 0.8351 0.1573 0.0000 +vt 0.8430 0.1528 0.0000 +vt 0.8179 0.1477 0.0000 +vt 0.8256 0.1416 0.0000 +vt 0.8275 0.1635 0.0000 +vt 0.8338 0.1372 0.0000 +vt 0.8162 0.1262 0.0000 +vt 0.8376 0.2670 0.0000 +vt 0.8476 0.2837 0.0000 +vt 0.8380 0.2954 0.0000 +vt 0.8284 0.2785 0.0000 +vt 0.8667 0.2881 0.0000 +vt 0.8574 0.3003 0.0000 +vt 0.8566 0.2720 0.0000 +vt 0.8568 0.3287 0.0000 +vt 0.8474 0.3122 0.0000 +vt 0.8670 0.3166 0.0000 +vt 0.8280 0.3068 0.0000 +vt 0.8371 0.3236 0.0000 +vt 0.8752 0.2758 0.0000 +vt 0.8853 0.2907 0.0000 +vt 0.8765 0.3038 0.0000 +vt 0.9030 0.2906 0.0000 +vt 0.8951 0.3050 0.0000 +vt 0.8930 0.2774 0.0000 +vt 0.8957 0.3331 0.0000 +vt 0.8862 0.3189 0.0000 +vt 0.9046 0.3184 0.0000 +vt 0.8765 0.3322 0.0000 +vt 0.8955 0.3854 0.0000 +vt 0.8854 0.3734 0.0000 +vt 0.8956 0.3603 0.0000 +vt 0.9054 0.3721 0.0000 +vt 0.8648 0.3712 0.0000 +vt 0.8756 0.3596 0.0000 +vt 0.8746 0.3850 0.0000 +vt 0.8860 0.3469 0.0000 +vt 0.8662 0.3446 0.0000 +vt 0.9051 0.3460 0.0000 +vt 0.8537 0.3812 0.0000 +vt 0.8444 0.3663 0.0000 +vt 0.8554 0.3561 0.0000 +vt 0.8246 0.3597 0.0000 +vt 0.8355 0.3505 0.0000 +vt 0.8332 0.3751 0.0000 +vt 0.8463 0.3401 0.0000 +vt 0.8267 0.3341 0.0000 +vt 0.9625 0.2525 0.0000 +vt 0.9721 0.2641 0.0000 +vt 0.9695 0.2801 0.0000 +vt 0.9607 0.2687 0.0000 +vt 0.9836 0.2603 0.0000 +vt 0.5947 0.4770 0.0000 +vt 0.9809 0.2766 0.0000 +vt 0.9737 0.2479 0.0000 +vt 0.9849 0.3050 0.0000 +vt 0.9775 0.2921 0.0000 +vt 0.9896 0.2900 0.0000 +vt 0.5650 0.4766 0.0000 +vt 0.9656 0.2957 0.0000 +vt 0.9728 0.3068 0.0000 +vt 0.6100 0.4819 0.0000 +vt 0.5956 0.4863 0.0000 +vt 0.5801 0.4814 0.0000 +vt 0.5965 0.4959 0.0000 +vt 0.5806 0.4908 0.0000 +vt 0.6114 0.4912 0.0000 +vt 0.5492 0.4903 0.0000 +vt 0.5650 0.4858 0.0000 +vt 0.5647 0.4954 0.0000 +vt 0.5500 0.4809 0.0000 +vt 0.5045 0.4841 0.0000 +vt 0.5182 0.4894 0.0000 +vt 0.5010 0.4938 0.0000 +vt 0.5081 0.4747 0.0000 +vt 0.9865 0.3468 0.0000 +vt 0.5208 0.4799 0.0000 +vt 0.5345 0.4851 0.0000 +vt 0.5361 0.4758 0.0000 +vt 0.9905 0.3189 0.0000 +vt 0.5327 0.4948 0.0000 +vt 0.9761 0.3422 0.0000 +vt 0.9832 0.3316 0.0000 +vt 0.9667 0.3410 0.0000 +vt 0.9727 0.3306 0.0000 +vt 0.9789 0.3186 0.0000 +vt 0.9673 0.3207 0.0000 +vt 0.8963 0.4072 0.0000 +vt 0.8851 0.3971 0.0000 +vt 0.8976 0.4258 0.0000 +vt 0.8854 0.4176 0.0000 +vt 0.8624 0.4154 0.0000 +vt 0.8741 0.4071 0.0000 +vt 0.8738 0.4261 0.0000 +vt 0.8635 0.3949 0.0000 +vt 0.8992 0.4417 0.0000 +vt 0.8861 0.4349 0.0000 +vt 0.9012 0.4577 0.0000 +vt 0.0721 0.7549 0.0000 +vt 0.8870 0.4503 0.0000 +vt 0.8607 0.4490 0.0000 +vt 0.8738 0.4424 0.0000 +vt 0.8736 0.4580 0.0000 +vt 0.0997 0.7561 0.0000 +vt 0.8616 0.4329 0.0000 +vt 0.8135 0.4332 0.0000 +vt 0.8259 0.4305 0.0000 +vt 0.8362 0.4421 0.0000 +vt 0.8228 0.4449 0.0000 +vt 0.1505 0.7573 0.0000 +vt 0.8283 0.4149 0.0000 +vt 0.8382 0.4269 0.0000 +vt 0.8168 0.4185 0.0000 +vt 0.8490 0.4382 0.0000 +vt 0.8504 0.4220 0.0000 +vt 0.8475 0.4538 0.0000 +vt 0.1259 0.7569 0.0000 +vt 0.8194 0.4019 0.0000 +vt 0.8308 0.3965 0.0000 +vt 0.8401 0.4098 0.0000 +vt 0.8423 0.3897 0.0000 +vt 0.8221 0.3824 0.0000 +vt 0.8520 0.4032 0.0000 +vt 0.9147 0.3573 0.0000 +vt 0.9245 0.3666 0.0000 +vt 0.9140 0.3306 0.0000 +vt 0.9233 0.3415 0.0000 +vt 0.9399 0.3345 0.0000 +vt 0.9325 0.3508 0.0000 +vt 0.9311 0.3251 0.0000 +vt 0.9416 0.3582 0.0000 +vt 0.9126 0.3030 0.0000 +vt 0.9220 0.3145 0.0000 +vt 0.9096 0.2758 0.0000 +vt 0.9194 0.2872 0.0000 +vt 0.9345 0.2815 0.0000 +vt 0.9289 0.2981 0.0000 +vt 0.9248 0.2712 0.0000 +vt 0.9380 0.3085 0.0000 +vt 0.9573 0.2852 0.0000 +vt 0.9483 0.2748 0.0000 +vt 0.9512 0.2582 0.0000 +vt 0.9605 0.3113 0.0000 +vt 0.9525 0.3016 0.0000 +vt 0.9438 0.2917 0.0000 +vt 0.9466 0.3181 0.0000 +vt 0.9386 0.2648 0.0000 +vt 0.9614 0.3343 0.0000 +vt 0.9545 0.3267 0.0000 +vt 0.9558 0.3483 0.0000 +vt 0.9482 0.3424 0.0000 +vt 0.7062 0.5339 0.0000 +vt 0.7203 0.5288 0.0000 +vt 0.7353 0.5340 0.0000 +vt 0.6766 0.5337 0.0000 +vt 0.6911 0.5284 0.0000 +vt 0.6897 0.5179 0.0000 +vt 0.7051 0.5234 0.0000 +vt 0.6758 0.5229 0.0000 +vt 0.7342 0.5238 0.0000 +vt 0.7187 0.5184 0.0000 +vt 0.6462 0.5336 0.0000 +vt 0.6613 0.5282 0.0000 +vt 0.6142 0.5335 0.0000 +vt 0.6303 0.5280 0.0000 +vt 0.6297 0.5170 0.0000 +vt 0.6456 0.5226 0.0000 +vt 0.6140 0.5224 0.0000 +vt 0.6603 0.5174 0.0000 +vt 0.6272 0.4963 0.0000 +vt 0.6430 0.5016 0.0000 +vt 0.6287 0.5064 0.0000 +vt 0.6127 0.5011 0.0000 +vt 0.6722 0.5021 0.0000 +vt 0.6587 0.5069 0.0000 +vt 0.6566 0.4969 0.0000 +vt 0.6446 0.5119 0.0000 +vt 0.6742 0.5124 0.0000 +vt 0.6135 0.5115 0.0000 +vt 0.6851 0.4975 0.0000 +vt 0.9531 0.1699 0.0000 +vt 0.7003 0.5031 0.0000 +vt 0.6876 0.5076 0.0000 +vt 0.7281 0.5041 0.0000 +vt 0.0050 0.7783 0.0000 +vt 0.7158 0.5085 0.0000 +vt 0.7126 0.4987 0.0000 +vt 0.9302 0.1424 0.0000 +vt 0.7031 0.5131 0.0000 +vt 0.7317 0.5138 0.0000 +vt 0.0017 0.7880 0.0000 +vt 0.8113 0.3883 0.0000 +vt 0.8035 0.3742 0.0000 +vt 0.8139 0.3675 0.0000 +vt 0.8085 0.4060 0.0000 +vt 0.8009 0.3930 0.0000 +vt 0.7843 0.3847 0.0000 +vt 0.7936 0.3798 0.0000 +vt 0.7912 0.3969 0.0000 +vt 0.7959 0.3597 0.0000 +vt 0.7863 0.3664 0.0000 +vt 0.8058 0.4212 0.0000 +vt 0.7983 0.4091 0.0000 +vt 0.8024 0.4351 0.0000 +vt 0.1710 0.7575 0.0000 +vt 0.7957 0.4231 0.0000 +vt 0.7799 0.4134 0.0000 +vt 0.7888 0.4115 0.0000 +vt 0.7861 0.4243 0.0000 +vt 0.1872 0.7575 0.0000 +vt 0.7822 0.4003 0.0000 +vt 0.7540 0.4033 0.0000 +vt 0.7605 0.3985 0.0000 +vt 0.7666 0.4068 0.0000 +vt 0.7600 0.4100 0.0000 +vt 0.2134 0.7575 0.0000 +vt 0.7611 0.3846 0.0000 +vt 0.7677 0.3938 0.0000 +vt 0.7540 0.3912 0.0000 +vt 0.7740 0.4035 0.0000 +vt 0.7756 0.3893 0.0000 +vt 0.7720 0.4159 0.0000 +vt 0.2013 0.7575 0.0000 +vt 0.7540 0.3760 0.0000 +vt 0.7616 0.3681 0.0000 +vt 0.7688 0.3785 0.0000 +vt 0.7622 0.3490 0.0000 +vt 0.7699 0.3606 0.0000 +vt 0.7540 0.3583 0.0000 +vt 0.7772 0.3725 0.0000 +vt 0.7788 0.3531 0.0000 +vt 0.8058 0.0922 0.0000 +vt 0.7970 0.0787 0.0000 +vt 0.8050 0.0748 0.0000 +vt 0.8070 0.1114 0.0000 +vt 0.7981 0.0973 0.0000 +vt 0.7826 0.0911 0.0000 +vt 0.7897 0.0841 0.0000 +vt 0.7909 0.1040 0.0000 +vt 0.7887 0.0661 0.0000 +vt 0.7817 0.0720 0.0000 +vt 0.8086 0.1325 0.0000 +vt 0.7996 0.1178 0.0000 +vt 0.8106 0.1554 0.0000 +vt 0.8013 0.1402 0.0000 +vt 0.7852 0.1348 0.0000 +vt 0.7924 0.1257 0.0000 +vt 0.7941 0.1493 0.0000 +vt 0.7839 0.1120 0.0000 +vt 0.7540 0.1305 0.0000 +vt 0.7615 0.1191 0.0000 +vt 0.7695 0.1316 0.0000 +vt 0.7619 0.1430 0.0000 +vt 0.7612 0.0970 0.0000 +vt 0.7688 0.1086 0.0000 +vt 0.7540 0.1076 0.0000 +vt 0.7768 0.1213 0.0000 +vt 0.7757 0.0993 0.0000 +vt 0.7779 0.1451 0.0000 +vt 0.7540 0.0864 0.0000 +vt 0.7608 0.0768 0.0000 +vt 0.7681 0.0875 0.0000 +vt 0.7606 0.0584 0.0000 +vt 0.7675 0.0682 0.0000 +vt 0.7540 0.0671 0.0000 +vt 0.7749 0.0791 0.0000 +vt 0.7741 0.0608 0.0000 +vt 0.8188 0.2899 0.0000 +vt 0.8095 0.2732 0.0000 +vt 0.8187 0.2617 0.0000 +vt 0.8179 0.3175 0.0000 +vt 0.8090 0.3010 0.0000 +vt 0.7905 0.2957 0.0000 +vt 0.8000 0.2846 0.0000 +vt 0.7992 0.3115 0.0000 +vt 0.8000 0.2569 0.0000 +vt 0.7908 0.2687 0.0000 +vt 0.8162 0.3437 0.0000 +vt 0.8078 0.3276 0.0000 +vt 0.8059 0.3522 0.0000 +vt 0.7881 0.3452 0.0000 +vt 0.7978 0.3368 0.0000 +vt 0.7895 0.3215 0.0000 +vt 0.7540 0.3379 0.0000 +vt 0.7626 0.3273 0.0000 +vt 0.7709 0.3400 0.0000 +vt 0.7629 0.3034 0.0000 +vt 0.7717 0.3169 0.0000 +vt 0.7540 0.3152 0.0000 +vt 0.7800 0.3309 0.0000 +vt 0.7810 0.3065 0.0000 +vt 0.7540 0.2904 0.0000 +vt 0.7631 0.2778 0.0000 +vt 0.7722 0.2919 0.0000 +vt 0.7631 0.2510 0.0000 +vt 0.7724 0.2654 0.0000 +vt 0.7540 0.2642 0.0000 +vt 0.7815 0.2804 0.0000 +vt 0.7815 0.2531 0.0000 +vt 0.1073 0.8091 0.0000 +vt 0.1181 0.8050 0.0000 +vt 0.1274 0.8092 0.0000 +vt 0.1187 0.7968 0.0000 +vt 0.1278 0.8011 0.0000 +vt 0.1079 0.8007 0.0000 +vt 0.1443 0.8013 0.0000 +vt 0.1362 0.8052 0.0000 +vt 0.1367 0.7972 0.0000 +vt 0.1440 0.8093 0.0000 +vt 0.1088 0.7923 0.0000 +vt 0.1197 0.7885 0.0000 +vt 0.1285 0.7929 0.0000 +vt 0.1217 0.7803 0.0000 +vt 0.8038 0.0222 0.0000 +vt 0.1294 0.7847 0.0000 +vt 0.1108 0.7840 0.0000 +vt 0.1456 0.7852 0.0000 +vt 0.1373 0.7890 0.0000 +vt 0.1384 0.7809 0.0000 +vt 0.7870 0.0111 0.0000 +vt 0.1447 0.7932 0.0000 +vt 0.1715 0.7854 0.0000 +vt 0.1652 0.7894 0.0000 +vt 0.1590 0.7854 0.0000 +vt 0.1653 0.7814 0.0000 +vt 0.7601 0.0014 0.0000 +vt 0.1651 0.7974 0.0000 +vt 0.1587 0.7934 0.0000 +vt 0.1715 0.7934 0.0000 +vt 0.1522 0.7893 0.0000 +vt 0.1518 0.7974 0.0000 +vt 0.1530 0.7813 0.0000 +vt 0.7725 0.0041 0.0000 +vt 0.1715 0.8014 0.0000 +vt 0.1650 0.8054 0.0000 +vt 0.1585 0.8014 0.0000 +vt 0.1583 0.8093 0.0000 +vt 0.1715 0.8094 0.0000 +vt 0.1515 0.8054 0.0000 +vt 0.7703 0.1565 0.0000 +vt 0.7623 0.1688 0.0000 +vt 0.7540 0.1554 0.0000 +vt 0.7867 0.1595 0.0000 +vt 0.7791 0.1708 0.0000 +vt 0.7802 0.1977 0.0000 +vt 0.7711 0.1829 0.0000 +vt 0.7883 0.1858 0.0000 +vt 0.7540 0.1819 0.0000 +vt 0.7627 0.1958 0.0000 +vt 0.8033 0.1644 0.0000 +vt 0.7959 0.1746 0.0000 +vt 0.8202 0.1711 0.0000 +vt 0.8130 0.1802 0.0000 +vt 0.8154 0.2064 0.0000 +vt 0.8055 0.1903 0.0000 +vt 0.8229 0.1962 0.0000 +vt 0.7977 0.2014 0.0000 +vt 0.8089 0.2451 0.0000 +vt 0.8174 0.2337 0.0000 +vt 0.8275 0.2502 0.0000 +vt 0.7905 0.2409 0.0000 +vt 0.7992 0.2289 0.0000 +vt 0.8075 0.2174 0.0000 +vt 0.7896 0.2131 0.0000 +vt 0.8255 0.2227 0.0000 +vt 0.7722 0.2381 0.0000 +vt 0.7811 0.2254 0.0000 +vt 0.7540 0.2370 0.0000 +vt 0.7630 0.2234 0.0000 +vt 0.7718 0.2103 0.0000 +vt 0.7540 0.2093 0.0000 +vt 0.8373 0.1793 0.0000 +vt 0.8302 0.1872 0.0000 +vt 0.8538 0.1880 0.0000 +vt 0.8473 0.1950 0.0000 +vt 0.8509 0.2191 0.0000 +vt 0.8404 0.2032 0.0000 +vt 0.8574 0.2102 0.0000 +vt 0.8332 0.2125 0.0000 +vt 0.8686 0.1957 0.0000 +vt 0.8633 0.2023 0.0000 +vt 0.8801 0.1997 0.0000 +vt 0.8774 0.2073 0.0000 +vt 0.8833 0.2279 0.0000 +vt 0.8731 0.2156 0.0000 +vt 0.8870 0.2175 0.0000 +vt 0.8678 0.2247 0.0000 +vt 0.8827 0.2636 0.0000 +vt 0.8889 0.2515 0.0000 +vt 0.8994 0.2640 0.0000 +vt 0.8648 0.2605 0.0000 +vt 0.8721 0.2493 0.0000 +vt 0.8783 0.2384 0.0000 +vt 0.8614 0.2344 0.0000 +vt 0.8938 0.2394 0.0000 +vt 0.8463 0.2557 0.0000 +vt 0.8542 0.2448 0.0000 +vt 0.8359 0.2392 0.0000 +vt 0.8437 0.2288 0.0000 +vt 0.8878 0.1949 0.0000 +vt 0.8887 0.2068 0.0000 +vt 0.8947 0.1863 0.0000 +vt 0.8977 0.2007 0.0000 +vt 0.9089 0.2221 0.0000 +vt 0.8985 0.2142 0.0000 +vt 0.9083 0.2074 0.0000 +vt 0.8971 0.2271 0.0000 +vt 0.9013 0.1767 0.0000 +vt 0.9057 0.1923 0.0000 +vt 0.9078 0.1674 0.0000 +vt 0.9133 0.1834 0.0000 +vt 0.9289 0.2072 0.0000 +vt 0.9172 0.1993 0.0000 +vt 0.9254 0.1912 0.0000 +vt 0.9194 0.2150 0.0000 +vt 0.9410 0.2484 0.0000 +vt 0.9416 0.2321 0.0000 +vt 0.9523 0.2418 0.0000 +vt 0.9285 0.2552 0.0000 +vt 0.9304 0.2392 0.0000 +vt 0.9306 0.2232 0.0000 +vt 0.9196 0.2304 0.0000 +vt 0.9404 0.2160 0.0000 +vt 0.9147 0.2608 0.0000 +vt 0.9181 0.2457 0.0000 +vt 0.9043 0.2503 0.0000 +vt 0.9075 0.2364 0.0000 +vt 0.0329 0.7798 0.0000 +vt 0.0175 0.7838 0.0000 +vt 0.0605 0.7814 0.0000 +vt 0.0455 0.7852 0.0000 +vt 0.0433 0.7943 0.0000 +vt 0.7771 0.5201 0.0000 +vt 0.0302 0.7891 0.0000 +vt 0.0583 0.7903 0.0000 +vt 0.0144 0.7933 0.0000 +vt 0.7480 0.5191 0.0000 +vt 0.0867 0.7828 0.0000 +vt 0.0728 0.7865 0.0000 +vt 0.0981 0.7876 0.0000 +vt 0.0968 0.7962 0.0000 +vt 0.0850 0.7914 0.0000 +vt 0.0712 0.7953 0.0000 +vt 0.0830 0.8089 0.0000 +vt 0.0959 0.8047 0.0000 +vt 0.0561 0.8087 0.0000 +vt 0.7941 0.5345 0.0000 +vt 0.0701 0.8043 0.0000 +vt 0.0837 0.8001 0.0000 +vt 0.0572 0.7994 0.0000 +vt 0.7925 0.5253 0.0000 +vt 0.7645 0.5343 0.0000 +vt 0.7786 0.5296 0.0000 +vt 0.7494 0.5292 0.0000 +vt 0.7633 0.5245 0.0000 +vt 0.0322 0.7449 0.0000 +vt 0.0443 0.7393 0.0000 +vt 0.0582 0.7471 0.0000 +vt 0.0066 0.7424 0.0000 +vt 0.4275 0.4937 0.0000 +vt 0.0180 0.7373 0.0000 +vt 0.0157 0.7243 0.0000 +vt 0.0302 0.7317 0.0000 +vt 0.0035 0.7300 0.0000 +vt 0.4211 0.5060 0.0000 +vt 0.0572 0.7333 0.0000 +vt 0.0429 0.7256 0.0000 +vt 0.4554 0.4961 0.0000 +vt 0.4386 0.5009 0.0000 +vt 0.4841 0.4982 0.0000 +vt 0.4676 0.5029 0.0000 +vt 0.4641 0.5146 0.0000 +vt 0.4508 0.5079 0.0000 +vt 0.4811 0.5094 0.0000 +vt 0.4336 0.5132 0.0000 +vt 0.4454 0.5328 0.0000 +vt 0.4617 0.5268 0.0000 +vt 0.4771 0.5331 0.0000 +vt 0.4145 0.5324 0.0000 +vt 0.0005 0.7036 0.0000 +vt 0.4309 0.5261 0.0000 +vt 0.4473 0.5202 0.0000 +vt 0.4168 0.5189 0.0000 +vt 0.0014 0.7171 0.0000 +vt 0.4785 0.5211 0.0000 +vt 0.0281 0.7040 0.0000 +vt 0.0146 0.7107 0.0000 +vt 0.0560 0.7043 0.0000 +vt 0.0421 0.7114 0.0000 +vt 0.0287 0.7181 0.0000 +vt 0.0564 0.7191 0.0000 +vt 0.5157 0.4995 0.0000 +vt 0.4984 0.5044 0.0000 +vt 0.5481 0.5003 0.0000 +vt 0.5310 0.5052 0.0000 +vt 0.5294 0.5162 0.0000 +vt 0.5135 0.5104 0.0000 +vt 0.5470 0.5109 0.0000 +vt 0.4959 0.5156 0.0000 +vt 0.5808 0.5007 0.0000 +vt 0.5642 0.5057 0.0000 +vt 0.5971 0.5061 0.0000 +vt 0.5974 0.5168 0.0000 +vt 0.5807 0.5112 0.0000 +vt 0.5636 0.5166 0.0000 +vt 0.5803 0.5335 0.0000 +vt 0.5974 0.5279 0.0000 +vt 0.5454 0.5334 0.0000 +vt 0.5631 0.5278 0.0000 +vt 0.5805 0.5222 0.0000 +vt 0.5460 0.5220 0.0000 +vt 0.5106 0.5333 0.0000 +vt 0.5283 0.5276 0.0000 +vt 0.4941 0.5273 0.0000 +vt 0.5117 0.5217 0.0000 +vt 0.1383 0.7499 0.0000 +vt 0.1503 0.7428 0.0000 +vt 0.1614 0.7502 0.0000 +vt 0.1129 0.7495 0.0000 +vt 0.1259 0.7425 0.0000 +vt 0.1261 0.7279 0.0000 +vt 0.1387 0.7354 0.0000 +vt 0.1128 0.7350 0.0000 +vt 0.1614 0.7356 0.0000 +vt 0.1508 0.7280 0.0000 +vt 0.0856 0.7485 0.0000 +vt 0.0992 0.7419 0.0000 +vt 0.0715 0.7409 0.0000 +vt 0.0708 0.7267 0.0000 +vt 0.0851 0.7344 0.0000 +vt 0.0990 0.7274 0.0000 +vt 0.0846 0.7046 0.0000 +vt 0.0703 0.7120 0.0000 +vt 0.1128 0.7047 0.0000 +vt 0.0989 0.7123 0.0000 +vt 0.0848 0.7197 0.0000 +vt 0.1128 0.7201 0.0000 +vt 0.1391 0.7048 0.0000 +vt 0.1262 0.7126 0.0000 +vt 0.1620 0.7048 0.0000 +vt 0.1510 0.7126 0.0000 +vt 0.1390 0.7204 0.0000 +vt 0.1619 0.7204 0.0000 +vt 0.9389 0.1583 0.0000 +vt 0.9248 0.1473 0.0000 +vt 0.9614 0.1854 0.0000 +vt 0.6696 0.4925 0.0000 +vt 0.9472 0.1739 0.0000 +vt 0.9409 0.1784 0.0000 +vt 0.9333 0.1630 0.0000 +vt 0.9550 0.1890 0.0000 +vt 0.6660 0.4836 0.0000 +vt 0.9195 0.1528 0.0000 +vt 0.6408 0.4919 0.0000 +vt 0.6537 0.4876 0.0000 +vt 0.6252 0.4869 0.0000 +vt 0.6232 0.4777 0.0000 +vt 0.9734 0.2317 0.0000 +vt 0.6382 0.4827 0.0000 +vt 0.6505 0.4787 0.0000 +vt 0.9590 0.2044 0.0000 +vt 0.9518 0.2258 0.0000 +vt 0.9628 0.2365 0.0000 +vt 0.9376 0.2001 0.0000 +vt 0.9496 0.2099 0.0000 +vt 0.9614 0.2206 0.0000 +vt 0.9463 0.1940 0.0000 +vt 0.9204 0.1753 0.0000 +vt 0.9332 0.1843 0.0000 +vt 0.9138 0.1594 0.0000 +vt 0.9271 0.1685 0.0000 +vt 0.2075 0.7502 0.0000 +vt 0.2135 0.7429 0.0000 +vt 0.2194 0.7502 0.0000 +vt 0.1947 0.7503 0.0000 +vt 0.2014 0.7429 0.0000 +vt 0.2018 0.7280 0.0000 +vt 0.2077 0.7355 0.0000 +vt 0.1950 0.7356 0.0000 +vt 0.2194 0.7355 0.0000 +vt 0.2137 0.7280 0.0000 +vt 0.1793 0.7502 0.0000 +vt 0.1875 0.7430 0.0000 +vt 0.1709 0.7429 0.0000 +vt 0.1715 0.7281 0.0000 +vt 0.1799 0.7356 0.0000 +vt 0.1881 0.7281 0.0000 +vt 0.1805 0.7048 0.0000 +vt 0.1718 0.7127 0.0000 +vt 0.1955 0.7048 0.0000 +vt 0.1883 0.7126 0.0000 +vt 0.1804 0.7204 0.0000 +vt 0.1954 0.7204 0.0000 +vt 0.2080 0.7048 0.0000 +vt 0.2019 0.7126 0.0000 +vt 0.2194 0.7048 0.0000 +vt 0.2138 0.7126 0.0000 +vt 0.2079 0.7203 0.0000 +vt 0.2194 0.7203 0.0000 +vt 0.7664 0.0088 0.0000 +vt 0.7602 0.0139 0.0000 +vt 0.7540 0.0071 0.0000 +vt 0.7796 0.0130 0.0000 +vt 0.7730 0.0168 0.0000 +vt 0.7732 0.0296 0.0000 +vt 0.7666 0.0213 0.0000 +vt 0.7801 0.0257 0.0000 +vt 0.7540 0.0199 0.0000 +vt 0.7602 0.0269 0.0000 +vt 0.7955 0.0224 0.0000 +vt 0.7875 0.0233 0.0000 +vt 0.8044 0.0341 0.0000 +vt 0.8044 0.0459 0.0000 +vt 0.7956 0.0340 0.0000 +vt 0.7877 0.0357 0.0000 +vt 0.7962 0.0619 0.0000 +vt 0.8045 0.0594 0.0000 +vt 0.7809 0.0546 0.0000 +vt 0.7880 0.0499 0.0000 +vt 0.7958 0.0470 0.0000 +vt 0.7804 0.0392 0.0000 +vt 0.7671 0.0507 0.0000 +vt 0.7736 0.0443 0.0000 +vt 0.7540 0.0496 0.0000 +vt 0.7604 0.0417 0.0000 +vt 0.7667 0.0350 0.0000 +vt 0.7540 0.0338 0.0000 +vt 0.6073 0.1514 0.0000 +vt 0.6157 0.1352 0.0000 +vt 0.6290 0.1284 0.0000 +vt 0.6202 0.1446 0.0000 +vt 0.6115 0.1273 0.0000 +vt 0.6254 0.1189 0.0000 +vt 0.6021 0.1435 0.0000 +vt 0.6495 0.0959 0.0000 +vt 0.6388 0.1121 0.0000 +vt 0.6360 0.1027 0.0000 +vt 0.6417 0.1231 0.0000 +vt 0.6516 0.1070 0.0000 +vt 0.5973 0.1369 0.0000 +vt 0.6074 0.1207 0.0000 +vt 0.6219 0.1110 0.0000 +vt 0.6030 0.1147 0.0000 +vt 0.3225 0.7743 0.0000 +vt 0.6185 0.1041 0.0000 +vt 0.5924 0.1313 0.0000 +vt 0.6452 0.0779 0.0000 +vt 0.6332 0.0946 0.0000 +vt 0.6307 0.0868 0.0000 +vt 0.2948 0.7760 0.0000 +vt 0.6472 0.0865 0.0000 +vt 0.6941 0.0353 0.0000 +vt 0.6829 0.0499 0.0000 +vt 0.6706 0.0550 0.0000 +vt 0.6829 0.0390 0.0000 +vt 0.2425 0.7792 0.0000 +vt 0.6835 0.0607 0.0000 +vt 0.6717 0.0647 0.0000 +vt 0.6938 0.0469 0.0000 +vt 0.6589 0.0706 0.0000 +vt 0.6605 0.0801 0.0000 +vt 0.6573 0.0615 0.0000 +vt 0.2682 0.7777 0.0000 +vt 0.6941 0.0589 0.0000 +vt 0.6840 0.0732 0.0000 +vt 0.6728 0.0756 0.0000 +vt 0.6843 0.0875 0.0000 +vt 0.6737 0.0882 0.0000 +vt 0.6941 0.0729 0.0000 +vt 0.6621 0.0911 0.0000 +vt 0.6634 0.1038 0.0000 +vt 0.5455 0.3517 0.0000 +vt 0.5488 0.3646 0.0000 +vt 0.5398 0.3622 0.0000 +vt 0.5391 0.3497 0.0000 +vt 0.5633 0.3779 0.0000 +vt 0.5530 0.3789 0.0000 +vt 0.5575 0.3630 0.0000 +vt 0.5472 0.3910 0.0000 +vt 0.5425 0.3764 0.0000 +vt 0.5586 0.3934 0.0000 +vt 0.5301 0.3562 0.0000 +vt 0.5313 0.3710 0.0000 +vt 0.5735 0.3737 0.0000 +vt 0.5813 0.3885 0.0000 +vt 0.5701 0.3925 0.0000 +vt 0.6016 0.3952 0.0000 +vt 0.5901 0.4024 0.0000 +vt 0.5922 0.3816 0.0000 +vt 0.5872 0.4198 0.0000 +vt 0.5781 0.4066 0.0000 +vt 0.5997 0.4149 0.0000 +vt 0.5657 0.4078 0.0000 +vt 0.5804 0.4492 0.0000 +vt 0.3930 0.7528 0.0000 +vt 0.5700 0.4346 0.0000 +vt 0.5840 0.4345 0.0000 +vt 0.5947 0.4472 0.0000 +vt 0.5472 0.4171 0.0000 +vt 0.5609 0.4205 0.0000 +vt 0.5553 0.4326 0.0000 +vt 0.4180 0.7500 0.0000 +vt 0.5742 0.4215 0.0000 +vt 0.5533 0.4058 0.0000 +vt 0.5974 0.4315 0.0000 +vt 0.5341 0.4107 0.0000 +vt 0.0309 0.5897 0.0000 +vt 0.5288 0.3934 0.0000 +vt 0.5410 0.4010 0.0000 +vt 0.5118 0.3677 0.0000 +vt 0.0739 0.5903 0.0000 +vt 0.5238 0.3776 0.0000 +vt 0.5166 0.3836 0.0000 +vt 0.0581 0.5869 0.0000 +vt 0.5356 0.3856 0.0000 +vt 0.5195 0.3631 0.0000 +vt 0.0785 0.5997 0.0000 +vt 0.6937 0.0888 0.0000 +vt 0.6841 0.1036 0.0000 +vt 0.6743 0.1027 0.0000 +vt 0.6835 0.1217 0.0000 +vt 0.6745 0.1190 0.0000 +vt 0.6930 0.1066 0.0000 +vt 0.6552 0.1343 0.0000 +vt 0.6645 0.1184 0.0000 +vt 0.6651 0.1347 0.0000 +vt 0.6536 0.1198 0.0000 +vt 0.6918 0.1262 0.0000 +vt 0.6823 0.1416 0.0000 +vt 0.6741 0.1372 0.0000 +vt 0.6804 0.1635 0.0000 +vt 0.6729 0.1573 0.0000 +vt 0.6900 0.1477 0.0000 +vt 0.6561 0.1681 0.0000 +vt 0.6649 0.1528 0.0000 +vt 0.6635 0.1729 0.0000 +vt 0.6562 0.1503 0.0000 +vt 0.6286 0.1907 0.0000 +vt 0.6329 0.1789 0.0000 +vt 0.6409 0.1792 0.0000 +vt 0.6346 0.1910 0.0000 +vt 0.6291 0.1671 0.0000 +vt 0.6391 0.1650 0.0000 +vt 0.6236 0.1816 0.0000 +vt 0.6481 0.1653 0.0000 +vt 0.6467 0.1500 0.0000 +vt 0.6477 0.1825 0.0000 +vt 0.6182 0.1712 0.0000 +vt 0.6247 0.1555 0.0000 +vt 0.6361 0.1518 0.0000 +vt 0.6326 0.1394 0.0000 +vt 0.6126 0.1608 0.0000 +vt 0.6444 0.1359 0.0000 +vt 0.6796 0.2785 0.0000 +vt 0.6700 0.2954 0.0000 +vt 0.6604 0.2837 0.0000 +vt 0.6703 0.2670 0.0000 +vt 0.6708 0.3236 0.0000 +vt 0.6605 0.3122 0.0000 +vt 0.6799 0.3068 0.0000 +vt 0.6410 0.3166 0.0000 +vt 0.6506 0.3003 0.0000 +vt 0.6511 0.3287 0.0000 +vt 0.6514 0.2720 0.0000 +vt 0.6413 0.2881 0.0000 +vt 0.6813 0.3341 0.0000 +vt 0.6725 0.3505 0.0000 +vt 0.6617 0.3401 0.0000 +vt 0.6747 0.3751 0.0000 +vt 0.6635 0.3663 0.0000 +vt 0.6833 0.3597 0.0000 +vt 0.6431 0.3712 0.0000 +vt 0.6525 0.3561 0.0000 +vt 0.6543 0.3812 0.0000 +vt 0.6418 0.3446 0.0000 +vt 0.6025 0.3721 0.0000 +vt 0.6124 0.3603 0.0000 +vt 0.6226 0.3734 0.0000 +vt 0.6124 0.3854 0.0000 +vt 0.6123 0.3331 0.0000 +vt 0.6220 0.3469 0.0000 +vt 0.6028 0.3460 0.0000 +vt 0.6323 0.3596 0.0000 +vt 0.6315 0.3322 0.0000 +vt 0.6333 0.3850 0.0000 +vt 0.6033 0.3184 0.0000 +vt 0.6128 0.3050 0.0000 +vt 0.6218 0.3189 0.0000 +vt 0.6149 0.2774 0.0000 +vt 0.6226 0.2907 0.0000 +vt 0.6049 0.2906 0.0000 +vt 0.6314 0.3038 0.0000 +vt 0.6327 0.2758 0.0000 +vt 0.5472 0.2687 0.0000 +vt 0.5384 0.2801 0.0000 +vt 0.5358 0.2641 0.0000 +vt 0.5454 0.2525 0.0000 +vt 0.5351 0.3068 0.0000 +vt 0.5305 0.2921 0.0000 +vt 0.5423 0.2957 0.0000 +vt 0.5184 0.2900 0.0000 +vt 0.1516 0.6019 0.0000 +vt 0.5270 0.2766 0.0000 +vt 0.5230 0.3050 0.0000 +vt 0.5342 0.2479 0.0000 +vt 0.5243 0.2603 0.0000 +vt 0.1814 0.6016 0.0000 +vt 0.5406 0.3207 0.0000 +vt 0.5353 0.3306 0.0000 +vt 0.5291 0.3186 0.0000 +vt 0.5319 0.3422 0.0000 +vt 0.5412 0.3410 0.0000 +vt 0.5214 0.3468 0.0000 +vt 0.0948 0.6039 0.0000 +vt 0.5247 0.3316 0.0000 +vt 0.5174 0.3189 0.0000 +vt 0.1228 0.6027 0.0000 +vt 0.0877 0.5848 0.0000 +vt 0.1048 0.5891 0.0000 +vt 0.0912 0.5945 0.0000 +vt 0.1359 0.5883 0.0000 +vt 0.1212 0.5934 0.0000 +vt 0.1194 0.5837 0.0000 +vt 0.1075 0.5986 0.0000 +vt 0.1367 0.5977 0.0000 +vt 0.1514 0.5831 0.0000 +vt 0.1672 0.5878 0.0000 +vt 0.1517 0.5927 0.0000 +vt 0.1980 0.5873 0.0000 +vt 0.1823 0.5923 0.0000 +vt 0.1832 0.5827 0.0000 +vt 0.1668 0.5972 0.0000 +vt 0.1966 0.5967 0.0000 +vt 0.6228 0.3971 0.0000 +vt 0.6117 0.4072 0.0000 +vt 0.6444 0.3949 0.0000 +vt 0.6339 0.4071 0.0000 +vt 0.6341 0.4261 0.0000 +vt 0.6225 0.4176 0.0000 +vt 0.6455 0.4154 0.0000 +vt 0.6103 0.4258 0.0000 +vt 0.6657 0.3897 0.0000 +vt 0.6560 0.4032 0.0000 +vt 0.6858 0.3824 0.0000 +vt 0.6772 0.3965 0.0000 +vt 0.6796 0.4149 0.0000 +vt 0.6678 0.4098 0.0000 +vt 0.6885 0.4019 0.0000 +vt 0.6575 0.4220 0.0000 +vt 0.6851 0.4449 0.0000 +vt 0.2882 0.7573 0.0000 +vt 0.6718 0.4421 0.0000 +vt 0.6820 0.4305 0.0000 +vt 0.6944 0.4332 0.0000 +vt 0.6472 0.4490 0.0000 +vt 0.6589 0.4382 0.0000 +vt 0.6605 0.4538 0.0000 +vt 0.3129 0.7569 0.0000 +vt 0.6698 0.4269 0.0000 +vt 0.6463 0.4329 0.0000 +vt 0.6912 0.4185 0.0000 +vt 0.6343 0.4580 0.0000 +vt 0.3390 0.7561 0.0000 +vt 0.6210 0.4503 0.0000 +vt 0.6342 0.4424 0.0000 +vt 0.6087 0.4417 0.0000 +vt 0.6067 0.4577 0.0000 +vt 0.3666 0.7549 0.0000 +vt 0.6218 0.4349 0.0000 +vt 0.5835 0.3666 0.0000 +vt 0.5932 0.3573 0.0000 +vt 0.5664 0.3582 0.0000 +vt 0.5754 0.3508 0.0000 +vt 0.5769 0.3251 0.0000 +vt 0.5847 0.3415 0.0000 +vt 0.5681 0.3345 0.0000 +vt 0.5939 0.3306 0.0000 +vt 0.5522 0.3483 0.0000 +vt 0.5598 0.3424 0.0000 +vt 0.5465 0.3343 0.0000 +vt 0.5475 0.3113 0.0000 +vt 0.5534 0.3267 0.0000 +vt 0.5613 0.3181 0.0000 +vt 0.5568 0.2582 0.0000 +vt 0.5597 0.2748 0.0000 +vt 0.5506 0.2852 0.0000 +vt 0.5734 0.2815 0.0000 +vt 0.5642 0.2917 0.0000 +vt 0.5693 0.2648 0.0000 +vt 0.5554 0.3016 0.0000 +vt 0.5700 0.3085 0.0000 +vt 0.5831 0.2712 0.0000 +vt 0.5885 0.2872 0.0000 +vt 0.5791 0.2981 0.0000 +vt 0.5953 0.3030 0.0000 +vt 0.5983 0.2758 0.0000 +vt 0.5860 0.3145 0.0000 +vt 0.3219 0.5445 0.0000 +vt 0.3070 0.5498 0.0000 +vt 0.2928 0.5446 0.0000 +vt 0.3054 0.5601 0.0000 +vt 0.2918 0.5552 0.0000 +vt 0.3209 0.5547 0.0000 +vt 0.2625 0.5556 0.0000 +vt 0.2778 0.5501 0.0000 +vt 0.2764 0.5606 0.0000 +vt 0.2633 0.5448 0.0000 +vt 0.3183 0.5648 0.0000 +vt 0.3413 0.7880 0.0000 +vt 0.3025 0.5700 0.0000 +vt 0.2897 0.5655 0.0000 +vt 0.2993 0.5799 0.0000 +vt 0.5777 0.1424 0.0000 +vt 0.2870 0.5755 0.0000 +vt 0.3148 0.5744 0.0000 +vt 0.3380 0.7783 0.0000 +vt 0.2589 0.5764 0.0000 +vt 0.2742 0.5709 0.0000 +vt 0.2718 0.5811 0.0000 +vt 0.5548 0.1699 0.0000 +vt 0.2609 0.5661 0.0000 +vt 0.1993 0.5775 0.0000 +vt 0.2154 0.5721 0.0000 +vt 0.2297 0.5770 0.0000 +vt 0.2139 0.5822 0.0000 +vt 0.2164 0.5615 0.0000 +vt 0.2312 0.5666 0.0000 +vt 0.2002 0.5670 0.0000 +vt 0.2453 0.5716 0.0000 +vt 0.2470 0.5611 0.0000 +vt 0.2433 0.5817 0.0000 +vt 0.2006 0.5561 0.0000 +vt 0.2169 0.5505 0.0000 +vt 0.2323 0.5559 0.0000 +vt 0.2328 0.5448 0.0000 +vt 0.2008 0.5449 0.0000 +vt 0.2480 0.5503 0.0000 +vt 0.6940 0.3675 0.0000 +vt 0.7044 0.3742 0.0000 +vt 0.6967 0.3883 0.0000 +vt 0.7216 0.3664 0.0000 +vt 0.7143 0.3798 0.0000 +vt 0.7120 0.3597 0.0000 +vt 0.7168 0.3969 0.0000 +vt 0.7070 0.3930 0.0000 +vt 0.7237 0.3847 0.0000 +vt 0.6994 0.4060 0.0000 +vt 0.7292 0.3531 0.0000 +vt 0.7380 0.3606 0.0000 +vt 0.7307 0.3725 0.0000 +vt 0.7463 0.3681 0.0000 +vt 0.7458 0.3490 0.0000 +vt 0.7469 0.3846 0.0000 +vt 0.7391 0.3785 0.0000 +vt 0.7323 0.3893 0.0000 +vt 0.7480 0.4100 0.0000 +vt 0.2254 0.7575 0.0000 +vt 0.7414 0.4068 0.0000 +vt 0.7474 0.3985 0.0000 +vt 0.7281 0.4134 0.0000 +vt 0.7340 0.4035 0.0000 +vt 0.7359 0.4159 0.0000 +vt 0.2374 0.7575 0.0000 +vt 0.7402 0.3938 0.0000 +vt 0.7257 0.4003 0.0000 +vt 0.7218 0.4243 0.0000 +vt 0.2515 0.7575 0.0000 +vt 0.7123 0.4231 0.0000 +vt 0.7191 0.4115 0.0000 +vt 0.7022 0.4212 0.0000 +vt 0.7056 0.4351 0.0000 +vt 0.2678 0.7575 0.0000 +vt 0.7096 0.4091 0.0000 +vt 0.7030 0.0748 0.0000 +vt 0.7109 0.0787 0.0000 +vt 0.7021 0.0922 0.0000 +vt 0.7263 0.0720 0.0000 +vt 0.7183 0.0841 0.0000 +vt 0.7192 0.0661 0.0000 +vt 0.7170 0.1040 0.0000 +vt 0.7098 0.0973 0.0000 +vt 0.7253 0.0911 0.0000 +vt 0.7010 0.1114 0.0000 +vt 0.7338 0.0608 0.0000 +vt 0.7404 0.0682 0.0000 +vt 0.7331 0.0791 0.0000 +vt 0.7471 0.0768 0.0000 +vt 0.7474 0.0584 0.0000 +vt 0.7468 0.0970 0.0000 +vt 0.7399 0.0875 0.0000 +vt 0.7322 0.0993 0.0000 +vt 0.7460 0.1430 0.0000 +vt 0.7384 0.1316 0.0000 +vt 0.7464 0.1191 0.0000 +vt 0.7227 0.1348 0.0000 +vt 0.7312 0.1213 0.0000 +vt 0.7300 0.1451 0.0000 +vt 0.7392 0.1086 0.0000 +vt 0.7241 0.1120 0.0000 +vt 0.7139 0.1493 0.0000 +vt 0.7066 0.1402 0.0000 +vt 0.7156 0.1257 0.0000 +vt 0.6994 0.1325 0.0000 +vt 0.6974 0.1554 0.0000 +vt 0.7084 0.1178 0.0000 +vt 0.6893 0.2617 0.0000 +vt 0.6985 0.2732 0.0000 +vt 0.6891 0.2899 0.0000 +vt 0.7171 0.2687 0.0000 +vt 0.7079 0.2846 0.0000 +vt 0.7079 0.2569 0.0000 +vt 0.7087 0.3115 0.0000 +vt 0.6989 0.3010 0.0000 +vt 0.7175 0.2957 0.0000 +vt 0.6900 0.3175 0.0000 +vt 0.7264 0.2531 0.0000 +vt 0.7356 0.2654 0.0000 +vt 0.7265 0.2804 0.0000 +vt 0.7448 0.2778 0.0000 +vt 0.7448 0.2510 0.0000 +vt 0.7450 0.3034 0.0000 +vt 0.7358 0.2919 0.0000 +vt 0.7270 0.3065 0.0000 +vt 0.7371 0.3400 0.0000 +vt 0.7453 0.3273 0.0000 +vt 0.7198 0.3452 0.0000 +vt 0.7279 0.3309 0.0000 +vt 0.7363 0.3169 0.0000 +vt 0.7184 0.3215 0.0000 +vt 0.7020 0.3522 0.0000 +vt 0.7101 0.3368 0.0000 +vt 0.6917 0.3437 0.0000 +vt 0.7001 0.3276 0.0000 +vt 0.2156 0.8092 0.0000 +vt 0.2249 0.8050 0.0000 +vt 0.2357 0.8091 0.0000 +vt 0.1989 0.8093 0.0000 +vt 0.2068 0.8052 0.0000 +vt 0.2063 0.7972 0.0000 +vt 0.2151 0.8011 0.0000 +vt 0.1987 0.8013 0.0000 +vt 0.2351 0.8007 0.0000 +vt 0.2242 0.7968 0.0000 +vt 0.1846 0.8093 0.0000 +vt 0.1915 0.8054 0.0000 +vt 0.1780 0.8054 0.0000 +vt 0.1779 0.7974 0.0000 +vt 0.1845 0.8014 0.0000 +vt 0.1912 0.7974 0.0000 +vt 0.1777 0.7814 0.0000 +vt 0.7478 0.0014 0.0000 +vt 0.1840 0.7854 0.0000 +vt 0.1778 0.7894 0.0000 +vt 0.1974 0.7852 0.0000 +vt 0.1908 0.7893 0.0000 +vt 0.1900 0.7813 0.0000 +vt 0.7355 0.0041 0.0000 +vt 0.1843 0.7934 0.0000 +vt 0.1982 0.7932 0.0000 +vt 0.2045 0.7809 0.0000 +vt 0.7209 0.0111 0.0000 +vt 0.2135 0.7847 0.0000 +vt 0.2056 0.7890 0.0000 +vt 0.2322 0.7840 0.0000 +vt 0.2232 0.7885 0.0000 +vt 0.2213 0.7803 0.0000 +vt 0.7041 0.0222 0.0000 +vt 0.2145 0.7929 0.0000 +vt 0.2341 0.7923 0.0000 +vt 0.7456 0.1688 0.0000 +vt 0.7376 0.1565 0.0000 +vt 0.7452 0.1958 0.0000 +vt 0.7369 0.1829 0.0000 +vt 0.7197 0.1858 0.0000 +vt 0.7289 0.1708 0.0000 +vt 0.7278 0.1977 0.0000 +vt 0.7212 0.1595 0.0000 +vt 0.7450 0.2234 0.0000 +vt 0.7362 0.2103 0.0000 +vt 0.7357 0.2381 0.0000 +vt 0.7174 0.2409 0.0000 +vt 0.7269 0.2254 0.0000 +vt 0.7184 0.2131 0.0000 +vt 0.6804 0.2502 0.0000 +vt 0.6905 0.2337 0.0000 +vt 0.6990 0.2451 0.0000 +vt 0.6925 0.2064 0.0000 +vt 0.7005 0.2174 0.0000 +vt 0.6824 0.2227 0.0000 +vt 0.7088 0.2289 0.0000 +vt 0.7102 0.2014 0.0000 +vt 0.6850 0.1962 0.0000 +vt 0.6950 0.1802 0.0000 +vt 0.7024 0.1903 0.0000 +vt 0.7046 0.1644 0.0000 +vt 0.6877 0.1711 0.0000 +vt 0.7120 0.1746 0.0000 +vt 0.6777 0.1872 0.0000 +vt 0.6706 0.1793 0.0000 +vt 0.6747 0.2125 0.0000 +vt 0.6675 0.2032 0.0000 +vt 0.6505 0.2102 0.0000 +vt 0.6607 0.1950 0.0000 +vt 0.6571 0.2191 0.0000 +vt 0.6541 0.1880 0.0000 +vt 0.6721 0.2392 0.0000 +vt 0.6643 0.2288 0.0000 +vt 0.6617 0.2557 0.0000 +vt 0.6432 0.2605 0.0000 +vt 0.6537 0.2448 0.0000 +vt 0.6465 0.2344 0.0000 +vt 0.6085 0.2640 0.0000 +vt 0.6190 0.2515 0.0000 +vt 0.6253 0.2636 0.0000 +vt 0.6246 0.2279 0.0000 +vt 0.6296 0.2384 0.0000 +vt 0.6142 0.2394 0.0000 +vt 0.6359 0.2493 0.0000 +vt 0.6402 0.2247 0.0000 +vt 0.6210 0.2175 0.0000 +vt 0.6305 0.2073 0.0000 +vt 0.6348 0.2156 0.0000 +vt 0.6394 0.1957 0.0000 +vt 0.6278 0.1997 0.0000 +vt 0.6446 0.2023 0.0000 +vt 0.6193 0.2068 0.0000 +vt 0.6201 0.1949 0.0000 +vt 0.6109 0.2271 0.0000 +vt 0.6095 0.2142 0.0000 +vt 0.5997 0.2074 0.0000 +vt 0.6103 0.2007 0.0000 +vt 0.5991 0.2221 0.0000 +vt 0.6133 0.1863 0.0000 +vt 0.6037 0.2503 0.0000 +vt 0.6005 0.2364 0.0000 +vt 0.5933 0.2608 0.0000 +vt 0.5794 0.2552 0.0000 +vt 0.5899 0.2457 0.0000 +vt 0.5883 0.2304 0.0000 +vt 0.5556 0.2418 0.0000 +vt 0.5663 0.2321 0.0000 +vt 0.5669 0.2484 0.0000 +vt 0.5791 0.2072 0.0000 +vt 0.5774 0.2232 0.0000 +vt 0.5675 0.2160 0.0000 +vt 0.5775 0.2392 0.0000 +vt 0.5886 0.2150 0.0000 +vt 0.5825 0.1912 0.0000 +vt 0.5946 0.1834 0.0000 +vt 0.5907 0.1993 0.0000 +vt 0.6066 0.1767 0.0000 +vt 0.6002 0.1674 0.0000 +vt 0.6022 0.1923 0.0000 +vt 0.3255 0.7838 0.0000 +vt 0.3100 0.7798 0.0000 +vt 0.3285 0.7933 0.0000 +vt 0.3347 0.5594 0.0000 +vt 0.3128 0.7891 0.0000 +vt 0.2846 0.7903 0.0000 +vt 0.2974 0.7852 0.0000 +vt 0.2997 0.7943 0.0000 +vt 0.3638 0.5584 0.0000 +vt 0.2825 0.7814 0.0000 +vt 0.3361 0.5494 0.0000 +vt 0.3500 0.5540 0.0000 +vt 0.3512 0.5443 0.0000 +vt 0.3807 0.5440 0.0000 +vt 0.2868 0.8087 0.0000 +vt 0.3653 0.5489 0.0000 +vt 0.3791 0.5533 0.0000 +vt 0.2858 0.7994 0.0000 +vt 0.2471 0.8047 0.0000 +vt 0.2600 0.8089 0.0000 +vt 0.2462 0.7962 0.0000 +vt 0.2592 0.8001 0.0000 +vt 0.2728 0.8043 0.0000 +vt 0.2718 0.7953 0.0000 +vt 0.2448 0.7876 0.0000 +vt 0.2580 0.7914 0.0000 +vt 0.2563 0.7828 0.0000 +vt 0.2702 0.7865 0.0000 +vt 0.3805 0.7471 0.0000 +vt 0.3944 0.7393 0.0000 +vt 0.4066 0.7449 0.0000 +vt 0.3958 0.7256 0.0000 +vt 0.4086 0.7317 0.0000 +vt 0.3815 0.7333 0.0000 +vt 0.4353 0.7300 0.0000 +vt 0.0078 0.5725 0.0000 +vt 0.4207 0.7373 0.0000 +vt 0.4230 0.7243 0.0000 +vt 0.4321 0.7424 0.0000 +vt 0.0142 0.5849 0.0000 +vt 0.3824 0.7191 0.0000 +vt 0.3966 0.7114 0.0000 +vt 0.4100 0.7181 0.0000 +vt 0.4107 0.7040 0.0000 +vt 0.3828 0.7043 0.0000 +vt 0.4383 0.7036 0.0000 +vt 0.0012 0.5461 0.0000 +vt 0.4241 0.7107 0.0000 +vt 0.4373 0.7171 0.0000 +vt 0.0035 0.5596 0.0000 +vt 0.0637 0.5454 0.0000 +vt 0.0484 0.5518 0.0000 +vt 0.0321 0.5458 0.0000 +vt 0.0508 0.5639 0.0000 +vt 0.0340 0.5584 0.0000 +vt 0.0652 0.5575 0.0000 +vt 0.0175 0.5525 0.0000 +vt 0.0203 0.5654 0.0000 +vt 0.0678 0.5691 0.0000 +vt 0.0543 0.5756 0.0000 +vt 0.0374 0.5706 0.0000 +vt 0.0421 0.5825 0.0000 +vt 0.0708 0.5803 0.0000 +vt 0.0253 0.5776 0.0000 +vt 0.0851 0.5742 0.0000 +vt 0.1023 0.5790 0.0000 +vt 0.0825 0.5629 0.0000 +vt 0.1001 0.5682 0.0000 +vt 0.1337 0.5676 0.0000 +vt 0.1176 0.5733 0.0000 +vt 0.1161 0.5623 0.0000 +vt 0.1348 0.5783 0.0000 +vt 0.0808 0.5512 0.0000 +vt 0.0983 0.5569 0.0000 +vt 0.0973 0.5452 0.0000 +vt 0.1321 0.5451 0.0000 +vt 0.1149 0.5509 0.0000 +vt 0.1327 0.5565 0.0000 +vt 0.1841 0.5506 0.0000 +vt 0.1670 0.5450 0.0000 +vt 0.1840 0.5617 0.0000 +vt 0.1671 0.5563 0.0000 +vt 0.1497 0.5507 0.0000 +vt 0.1502 0.5620 0.0000 +vt 0.1838 0.5725 0.0000 +vt 0.1674 0.5673 0.0000 +vt 0.1674 0.5779 0.0000 +vt 0.1509 0.5728 0.0000 +vt 0.2773 0.7502 0.0000 +vt 0.2884 0.7428 0.0000 +vt 0.3004 0.7499 0.0000 +vt 0.2879 0.7280 0.0000 +vt 0.3001 0.7354 0.0000 +vt 0.2773 0.7356 0.0000 +vt 0.3260 0.7350 0.0000 +vt 0.3128 0.7425 0.0000 +vt 0.3126 0.7279 0.0000 +vt 0.3258 0.7495 0.0000 +vt 0.2768 0.7204 0.0000 +vt 0.2877 0.7126 0.0000 +vt 0.2997 0.7204 0.0000 +vt 0.2997 0.7048 0.0000 +vt 0.2767 0.7048 0.0000 +vt 0.3260 0.7047 0.0000 +vt 0.3125 0.7126 0.0000 +vt 0.3259 0.7201 0.0000 +vt 0.3684 0.7120 0.0000 +vt 0.3541 0.7046 0.0000 +vt 0.3679 0.7267 0.0000 +vt 0.3540 0.7197 0.0000 +vt 0.3399 0.7123 0.0000 +vt 0.3397 0.7274 0.0000 +vt 0.3672 0.7409 0.0000 +vt 0.3536 0.7344 0.0000 +vt 0.3531 0.7485 0.0000 +vt 0.3395 0.7419 0.0000 +vt 0.5832 0.1473 0.0000 +vt 0.5691 0.1583 0.0000 +vt 0.5885 0.1528 0.0000 +vt 0.5747 0.1630 0.0000 +vt 0.5530 0.1890 0.0000 +vt 0.2527 0.5949 0.0000 +vt 0.5608 0.1739 0.0000 +vt 0.5670 0.1784 0.0000 +vt 0.5466 0.1854 0.0000 +vt 0.2563 0.5861 0.0000 +vt 0.5941 0.1594 0.0000 +vt 0.5808 0.1685 0.0000 +vt 0.5875 0.1753 0.0000 +vt 0.5704 0.2001 0.0000 +vt 0.5747 0.1843 0.0000 +vt 0.5616 0.1940 0.0000 +vt 0.5452 0.2365 0.0000 +vt 0.5562 0.2258 0.0000 +vt 0.5345 0.2317 0.0000 +vt 0.2099 0.6009 0.0000 +vt 0.5465 0.2206 0.0000 +vt 0.5583 0.2099 0.0000 +vt 0.5489 0.2044 0.0000 +vt 0.2372 0.5999 0.0000 +vt 0.2119 0.5917 0.0000 +vt 0.2249 0.5959 0.0000 +vt 0.2275 0.5867 0.0000 +vt 0.2404 0.5909 0.0000 +vt 0.2252 0.7429 0.0000 +vt 0.2313 0.7502 0.0000 +vt 0.2250 0.7280 0.0000 +vt 0.2310 0.7355 0.0000 +vt 0.2438 0.7356 0.0000 +vt 0.2373 0.7429 0.0000 +vt 0.2370 0.7280 0.0000 +vt 0.2440 0.7503 0.0000 +vt 0.2250 0.7126 0.0000 +vt 0.2308 0.7203 0.0000 +vt 0.2307 0.7048 0.0000 +vt 0.2433 0.7048 0.0000 +vt 0.2368 0.7126 0.0000 +vt 0.2434 0.7204 0.0000 +vt 0.2670 0.7127 0.0000 +vt 0.2582 0.7048 0.0000 +vt 0.2673 0.7281 0.0000 +vt 0.2583 0.7204 0.0000 +vt 0.2504 0.7126 0.0000 +vt 0.2507 0.7281 0.0000 +vt 0.2678 0.7429 0.0000 +vt 0.2588 0.7356 0.0000 +vt 0.2594 0.7502 0.0000 +vt 0.2512 0.7430 0.0000 +vt 0.7478 0.0139 0.0000 +vt 0.7415 0.0088 0.0000 +vt 0.7477 0.0269 0.0000 +vt 0.7414 0.0213 0.0000 +vt 0.7278 0.0257 0.0000 +vt 0.7349 0.0168 0.0000 +vt 0.7347 0.0296 0.0000 +vt 0.7283 0.0130 0.0000 +vt 0.7476 0.0417 0.0000 +vt 0.7412 0.0350 0.0000 +vt 0.7409 0.0507 0.0000 +vt 0.7271 0.0546 0.0000 +vt 0.7344 0.0443 0.0000 +vt 0.7276 0.0392 0.0000 +vt 0.7034 0.0594 0.0000 +vt 0.7117 0.0619 0.0000 +vt 0.7035 0.0459 0.0000 +vt 0.7122 0.0470 0.0000 +vt 0.7199 0.0499 0.0000 +vt 0.7203 0.0357 0.0000 +vt 0.7035 0.0341 0.0000 +vt 0.7123 0.0340 0.0000 +vt 0.7124 0.0224 0.0000 +vt 0.7205 0.0233 0.0000 +# 5974 texture coords + +g Heart +usemtl Heart +s 1 +f 1/1/1 2/2991/2 3/1583/3 4/2994/4 +f 5/795/5 6/2992/6 3/1583/3 2/2991/2 +f 7/443/7 8/2993/8 3/1583/3 6/2992/6 +f 9/798/9 4/2994/4 3/1583/3 8/2993/8 +f 10/2/10 11/2995/11 12/1584/12 13/2997/13 +f 14/796/14 15/2996/15 12/1584/12 11/2995/11 +f 7/443/7 6/2992/6 12/1584/12 15/2996/15 +f 5/795/5 13/2997/13 12/1584/12 6/2992/6 +f 16/3/16 17/2998/17 18/1585/18 19/3000/19 +f 20/797/20 21/2999/21 18/1585/18 17/2998/17 +f 7/443/7 15/2996/15 18/1585/18 21/2999/21 +f 14/796/14 19/3000/19 18/1585/18 15/2996/15 +f 22/4/22 23/3001/23 24/1586/24 25/3002/25 +f 9/798/9 8/2993/8 24/1586/24 23/3001/23 +f 7/443/7 21/2999/21 24/1586/24 8/2993/8 +f 20/797/20 25/3002/25 24/1586/24 21/2999/21 +f 10/2/10 26/3003/26 27/1587/27 11/2995/11 +f 28/799/28 29/3004/29 27/1587/27 26/3003/26 +f 30/444/30 31/3005/31 27/1587/27 29/3004/29 +f 14/796/14 11/2995/11 27/1587/27 31/3005/31 +f 32/5/32 33/3006/33 34/1588/34 35/3009/35 +f 36/800/36 37/3008/37 34/1588/34 33/3006/33 +f 30/444/30 29/3004/29 34/1588/34 37/3008/37 +f 28/799/28 35/3009/35 34/1588/34 29/3004/29 +f 38/6/38 39/3010/39 40/1589/40 41/3012/41 +f 42/802/42 43/3011/43 40/1589/40 39/3010/39 +f 30/444/30 37/3008/37 40/1589/40 43/3011/43 +f 36/800/36 41/3012/41 40/1589/40 37/3008/37 +f 16/3/16 19/3000/19 44/1590/44 45/3014/45 +f 14/796/14 31/3005/31 44/1590/44 19/3000/19 +f 30/444/30 43/3011/43 44/1590/44 31/3005/31 +f 42/802/42 45/3014/45 44/1590/44 43/3011/43 +f 46/7/46 47/3015/47 48/1591/48 49/3018/49 +f 50/803/50 51/3016/51 48/1591/48 47/3015/47 +f 52/445/52 53/3017/53 48/1591/48 51/3016/51 +f 54/805/54 49/3018/49 48/1591/48 53/3017/53 +f 55/8/55 56/3020/56 57/1592/57 58/3022/58 +f 59/804/59 60/3021/60 57/1592/57 56/3020/56 +f 52/445/52 51/3016/51 57/1592/57 60/3021/60 +f 50/803/50 58/3022/58 57/1592/57 51/3016/51 +f 16/3/16 45/3014/45 61/1593/61 62/3024/62 +f 42/802/42 63/3023/63 61/1593/61 45/3014/45 +f 52/445/52 60/3021/60 61/1593/61 63/3023/63 +f 59/804/59 62/3024/62 61/1593/61 60/3021/60 +f 38/6/38 64/3025/64 65/1594/65 39/3010/39 +f 54/805/54 53/3017/53 65/1594/65 64/3025/64 +f 52/445/52 63/3023/63 65/1594/65 53/3017/53 +f 42/802/42 39/3010/39 65/1594/65 63/3023/63 +f 55/8/55 66/3027/66 67/1595/67 56/3020/56 +f 68/807/68 69/3028/69 67/1595/67 66/3027/66 +f 70/446/70 71/3029/71 67/1595/67 69/3028/69 +f 59/804/59 56/3020/56 67/1595/67 71/3029/71 +f 72/9/72 73/3030/73 74/1596/74 75/3032/75 +f 76/808/76 77/3031/77 74/1596/74 73/3030/73 +f 70/446/70 69/3028/69 74/1596/74 77/3031/77 +f 68/807/68 75/3032/75 74/1596/74 69/3028/69 +f 22/4/22 25/3002/25 78/1597/78 79/3034/79 +f 20/797/20 80/3033/80 78/1597/78 25/3002/25 +f 70/446/70 77/3031/77 78/1597/78 80/3033/80 +f 76/808/76 79/3034/79 78/1597/78 77/3031/77 +f 16/3/16 62/3024/62 81/1598/81 17/2998/17 +f 59/804/59 71/3029/71 81/1598/81 62/3024/62 +f 70/446/70 80/3033/80 81/1598/81 71/3029/71 +f 20/797/20 17/2998/17 81/1598/81 80/3033/80 +f 82/10/82 83/3035/83 84/1599/84 85/3038/85 +f 86/809/86 87/3036/87 84/1599/84 83/3035/83 +f 88/447/88 89/3037/89 84/1599/84 87/3036/87 +f 90/812/90 85/3038/85 84/1599/84 89/3037/89 +f 91/11/91 92/3039/92 93/1600/93 94/3041/94 +f 95/810/95 96/3040/96 93/1600/93 92/3039/92 +f 88/447/88 87/3036/87 93/1600/93 96/3040/96 +f 86/809/86 94/3041/94 93/1600/93 87/3036/87 +f 97/18/97 98/3042/98 99/1601/99 100/3044/100 +f 101/811/101 102/3043/102 99/1601/99 98/3042/98 +f 88/447/88 96/3040/96 99/1601/99 102/3043/102 +f 95/810/95 100/3044/100 99/1601/99 96/3040/96 +f 103/19/103 104/3045/104 105/1602/105 106/3046/106 +f 90/812/90 89/3037/89 105/1602/105 104/3045/104 +f 88/447/88 102/3043/102 105/1602/105 89/3037/89 +f 101/811/101 106/3046/106 105/1602/105 102/3043/102 +f 91/11/91 107/3047/107 108/1603/108 92/3039/92 +f 109/813/109 110/3048/110 108/1603/108 107/3047/107 +f 111/448/111 112/3049/112 108/1603/108 110/3048/110 +f 95/810/95 92/3039/92 108/1603/108 112/3049/112 +f 113/20/113 114/3050/114 115/1604/115 116/3052/116 +f 117/814/117 118/3051/118 115/1604/115 114/3050/114 +f 111/448/111 110/3048/110 115/1604/115 118/3051/118 +f 109/813/109 116/3052/116 115/1604/115 110/3048/110 +f 119/23/119 120/3053/120 121/1605/121 122/3055/122 +f 123/815/123 124/3054/124 121/1605/121 120/3053/120 +f 111/448/111 118/3051/118 121/1605/121 124/3054/124 +f 117/814/117 122/3055/122 121/1605/121 118/3051/118 +f 97/18/97 100/3044/100 125/1606/125 126/3056/126 +f 95/810/95 112/3049/112 125/1606/125 100/3044/100 +f 111/448/111 124/3054/124 125/1606/125 112/3049/112 +f 123/815/123 126/3056/126 125/1606/125 124/3054/124 +f 127/24/127 128/3057/128 129/1607/129 130/3061/130 +f 131/816/131 132/3059/132 129/1607/129 128/3057/128 +f 133/449/133 134/3060/134 129/1607/129 132/3059/132 +f 135/819/135 130/3061/130 129/1607/129 134/3060/134 +f 136/25/136 137/3062/137 138/1608/138 139/3064/139 +f 140/818/140 141/3063/141 138/1608/138 137/3062/137 +f 133/449/133 132/3059/132 138/1608/138 141/3063/141 +f 131/816/131 139/3064/139 138/1608/138 132/3059/132 +f 97/18/97 126/3056/126 142/1609/142 143/3067/143 +f 123/815/123 144/3066/144 142/1609/142 126/3056/126 +f 133/449/133 141/3063/141 142/1609/142 144/3066/144 +f 140/818/140 143/3067/143 142/1609/142 141/3063/141 +f 119/23/119 145/3068/145 146/1610/146 120/3053/120 +f 135/819/135 134/3060/134 146/1610/146 145/3068/145 +f 133/449/133 144/3066/144 146/1610/146 134/3060/134 +f 123/815/123 120/3053/120 146/1610/146 144/3066/144 +f 136/25/136 147/3069/147 148/1611/148 137/3062/137 +f 149/820/149 150/3071/150 148/1611/148 147/3069/147 +f 151/450/151 152/3072/152 148/1611/148 150/3071/150 +f 140/818/140 137/3062/137 148/1611/148 152/3072/152 +f 153/26/153 154/3073/154 155/1612/155 156/3076/156 +f 157/822/157 158/3075/158 155/1612/155 154/3073/154 +f 151/450/151 150/3071/150 155/1612/155 158/3075/158 +f 149/820/149 156/3076/156 155/1612/155 150/3071/150 +f 103/19/103 106/3046/106 159/1613/159 160/3079/160 +f 101/811/101 161/3078/161 159/1613/159 106/3046/106 +f 151/450/151 158/3075/158 159/1613/159 161/3078/161 +f 157/822/157 160/3079/160 159/1613/159 158/3075/158 +f 97/18/97 143/3067/143 162/1614/162 98/3042/98 +f 140/818/140 152/3072/152 162/1614/162 143/3067/143 +f 151/450/151 161/3078/161 162/1614/162 152/3072/152 +f 101/811/101 98/3042/98 162/1614/162 161/3078/161 +f 72/9/72 163/3081/163 164/1615/164 73/3030/73 +f 165/824/165 166/3082/166 164/1615/164 163/3081/163 +f 167/451/167 168/3083/168 164/1615/164 166/3082/166 +f 76/808/76 73/3030/73 164/1615/164 168/3083/168 +f 169/27/169 170/3084/170 171/1616/171 172/3086/172 +f 173/825/173 174/3085/174 171/1616/171 170/3084/170 +f 167/451/167 166/3082/166 171/1616/171 174/3085/174 +f 165/824/165 172/3086/172 171/1616/171 166/3082/166 +f 175/30/175 176/3087/176 177/1617/177 178/3089/178 +f 179/826/179 180/3088/180 177/1617/177 176/3087/176 +f 167/451/167 174/3085/174 177/1617/177 180/3088/180 +f 173/825/173 178/3089/178 177/1617/177 174/3085/174 +f 22/4/22 79/3034/79 181/1618/181 182/3090/182 +f 76/808/76 168/3083/168 181/1618/181 79/3034/79 +f 167/451/167 180/3088/180 181/1618/181 168/3083/168 +f 179/826/179 182/3090/182 181/1618/181 180/3088/180 +f 169/27/169 183/3091/183 184/1619/184 170/3084/170 +f 185/827/185 186/3092/186 184/1619/184 183/3091/183 +f 187/452/187 188/3093/188 184/1619/184 186/3092/186 +f 173/825/173 170/3084/170 184/1619/184 188/3093/188 +f 189/31/189 190/3094/190 191/1620/191 192/3096/192 +f 193/828/193 194/3095/194 191/1620/191 190/3094/190 +f 187/452/187 186/3092/186 191/1620/191 194/3095/194 +f 185/827/185 192/3096/192 191/1620/191 186/3092/186 +f 195/32/195 196/3097/196 197/1621/197 198/3099/198 +f 199/829/199 200/3098/200 197/1621/197 196/3097/196 +f 187/452/187 194/3095/194 197/1621/197 200/3098/200 +f 193/828/193 198/3099/198 197/1621/197 194/3095/194 +f 175/30/175 178/3089/178 201/1622/201 202/3100/202 +f 173/825/173 188/3093/188 201/1622/201 178/3089/178 +f 187/452/187 200/3098/200 201/1622/201 188/3093/188 +f 199/829/199 202/3100/202 201/1622/201 200/3098/200 +f 203/33/203 204/3101/204 205/1623/205 206/3104/206 +f 207/830/207 208/3102/208 205/1623/205 204/3101/204 +f 209/453/209 210/3103/210 205/1623/205 208/3102/208 +f 211/832/211 206/3104/206 205/1623/205 210/3103/210 +f 212/34/212 213/3105/213 214/1624/214 215/3107/215 +f 216/831/216 217/3106/217 214/1624/214 213/3105/213 +f 209/453/209 208/3102/208 214/1624/214 217/3106/217 +f 207/830/207 215/3107/215 214/1624/214 208/3102/208 +f 175/30/175 202/3100/202 218/1625/218 219/3109/219 +f 199/829/199 220/3108/220 218/1625/218 202/3100/202 +f 209/453/209 217/3106/217 218/1625/218 220/3108/220 +f 216/831/216 219/3109/219 218/1625/218 217/3106/217 +f 195/32/195 221/3110/221 222/1626/222 196/3097/196 +f 211/832/211 210/3103/210 222/1626/222 221/3110/221 +f 209/453/209 220/3108/220 222/1626/222 210/3103/210 +f 199/829/199 196/3097/196 222/1626/222 220/3108/220 +f 212/34/212 223/3111/223 224/1627/224 213/3105/213 +f 225/833/225 226/3112/226 224/1627/224 223/3111/223 +f 227/454/227 228/3113/228 224/1627/224 226/3112/226 +f 216/831/216 213/3105/213 224/1627/224 228/3113/228 +f 1/1/1 4/2994/4 229/1628/229 230/3115/230 +f 9/798/9 231/3114/231 229/1628/229 4/2994/4 +f 227/454/227 226/3112/226 229/1628/229 231/3114/231 +f 225/833/225 230/3115/230 229/1628/229 226/3112/226 +f 22/4/22 182/3090/182 232/1629/232 23/3001/23 +f 179/826/179 233/3116/233 232/1629/232 182/3090/182 +f 227/454/227 231/3114/231 232/1629/232 233/3116/233 +f 9/798/9 23/3001/23 232/1629/232 231/3114/231 +f 175/30/175 219/3109/219 234/1630/234 176/3087/176 +f 216/831/216 228/3113/228 234/1630/234 219/3109/219 +f 227/454/227 233/3116/233 234/1630/234 228/3113/228 +f 179/826/179 176/3087/176 234/1630/234 233/3116/233 +f 235/36/235 236/3117/236 237/1631/237 238/3120/238 +f 239/834/239 240/3118/240 237/1631/237 236/3117/236 +f 241/455/241 242/3119/242 237/1631/237 240/3118/240 +f 243/837/243 238/3120/238 237/1631/237 242/3119/242 +f 244/40/244 245/3121/245 246/1632/246 247/3123/247 +f 248/835/248 249/3122/249 246/1632/246 245/3121/245 +f 241/455/241 240/3118/240 246/1632/246 249/3122/249 +f 239/834/239 247/3123/247 246/1632/246 240/3118/240 +f 250/45/250 251/3124/251 252/1633/252 253/3126/253 +f 254/836/254 255/3125/255 252/1633/252 251/3124/251 +f 241/455/241 249/3122/249 252/1633/252 255/3125/255 +f 248/835/248 253/3126/253 252/1633/252 249/3122/249 +f 256/48/256 257/3127/257 258/1634/258 259/3128/259 +f 243/837/243 242/3119/242 258/1634/258 257/3127/257 +f 241/455/241 255/3125/255 258/1634/258 242/3119/242 +f 254/836/254 259/3128/259 258/1634/258 255/3125/255 +f 244/40/244 260/3129/260 261/1635/261 245/3121/245 +f 262/838/262 263/3130/263 261/1635/261 260/3129/260 +f 264/456/264 265/3131/265 261/1635/261 263/3130/263 +f 248/835/248 245/3121/245 261/1635/261 265/3131/265 +f 266/49/266 267/3132/267 268/1636/268 269/3134/269 +f 270/839/270 271/3133/271 268/1636/268 267/3132/267 +f 264/456/264 263/3130/263 268/1636/268 271/3133/271 +f 262/838/262 269/3134/269 268/1636/268 263/3130/263 +f 272/50/272 273/3135/273 274/1637/274 275/3137/275 +f 276/840/276 277/3136/277 274/1637/274 273/3135/273 +f 264/456/264 271/3133/271 274/1637/274 277/3136/277 +f 270/839/270 275/3137/275 274/1637/274 271/3133/271 +f 250/45/250 253/3126/253 278/1638/278 279/3138/279 +f 248/835/248 265/3131/265 278/1638/278 253/3126/253 +f 264/456/264 277/3136/277 278/1638/278 265/3131/265 +f 276/840/276 279/3138/279 278/1638/278 277/3136/277 +f 113/20/113 280/3139/280 281/1639/281 282/3142/282 +f 283/841/283 284/3140/284 281/1639/281 280/3139/280 +f 285/457/285 286/3141/286 281/1639/281 284/3140/284 +f 287/843/287 282/3142/282 281/1639/281 286/3141/286 +f 288/52/288 289/3143/289 290/1640/290 291/3145/291 +f 292/842/292 293/3144/293 290/1640/290 289/3143/289 +f 285/457/285 284/3140/284 290/1640/290 293/3144/293 +f 283/841/283 291/3145/291 290/1640/290 284/3140/284 +f 250/45/250 279/3138/279 294/1641/294 295/3147/295 +f 276/840/276 296/3146/296 294/1641/294 279/3138/279 +f 285/457/285 293/3144/293 294/1641/294 296/3146/296 +f 292/842/292 295/3147/295 294/1641/294 293/3144/293 +f 272/50/272 297/3148/297 298/1642/298 273/3135/273 +f 287/843/287 286/3141/286 298/1642/298 297/3148/297 +f 285/457/285 296/3146/296 298/1642/298 286/3141/286 +f 276/840/276 273/3135/273 298/1642/298 296/3146/296 +f 288/52/288 299/3149/299 300/1643/300 289/3143/289 +f 301/844/301 302/3150/302 300/1643/300 299/3149/299 +f 303/458/303 304/3151/304 300/1643/300 302/3150/302 +f 292/842/292 289/3143/289 300/1643/300 304/3151/304 +f 305/53/305 306/3152/306 307/1644/307 308/3154/308 +f 309/845/309 310/3153/310 307/1644/307 306/3152/306 +f 303/458/303 302/3150/302 307/1644/307 310/3153/310 +f 301/844/301 308/3154/308 307/1644/307 302/3150/302 +f 256/48/256 259/3128/259 311/1645/311 312/3156/312 +f 254/836/254 313/3155/313 311/1645/311 259/3128/259 +f 303/458/303 310/3153/310 311/1645/311 313/3155/313 +f 309/845/309 312/3156/312 311/1645/311 310/3153/310 +f 250/45/250 295/3147/295 314/1646/314 251/3124/251 +f 292/842/292 304/3151/304 314/1646/314 295/3147/295 +f 303/458/303 313/3155/313 314/1646/314 304/3151/304 +f 254/836/254 251/3124/251 314/1646/314 313/3155/313 +f 315/54/315 316/3157/316 317/1647/317 318/3160/318 +f 319/846/319 320/3158/320 317/1647/317 316/3157/316 +f 321/459/321 322/3159/322 317/1647/317 320/3158/320 +f 323/850/323 318/3160/318 317/1647/317 322/3159/322 +f 324/55/324 325/3161/325 326/1648/326 327/3163/327 +f 328/847/328 329/3162/329 326/1648/326 325/3161/325 +f 321/459/321 320/3158/320 326/1648/326 329/3162/329 +f 319/846/319 327/3163/327 326/1648/326 320/3158/320 +f 330/56/330 331/3164/331 332/1649/332 333/3167/333 +f 334/848/334 335/3166/335 332/1649/332 331/3164/331 +f 321/459/321 329/3162/329 332/1649/332 335/3166/335 +f 328/847/328 333/3167/333 332/1649/332 329/3162/329 +f 336/57/336 337/3168/337 338/1650/338 339/3169/339 +f 323/850/323 322/3159/322 338/1650/338 337/3168/337 +f 321/459/321 335/3166/335 338/1650/338 322/3159/322 +f 334/848/334 339/3169/339 338/1650/338 335/3166/335 +f 324/55/324 340/3171/340 341/1651/341 325/3161/325 +f 342/851/342 343/3172/343 341/1651/341 340/3171/340 +f 344/460/344 345/3173/345 341/1651/341 343/3172/343 +f 328/847/328 325/3161/325 341/1651/341 345/3173/345 +f 82/10/82 85/3038/85 346/1652/346 347/3175/347 +f 90/812/90 348/3174/348 346/1652/346 85/3038/85 +f 344/460/344 343/3172/343 346/1652/346 348/3174/348 +f 342/851/342 347/3175/347 346/1652/346 343/3172/343 +f 103/19/103 349/3176/349 350/1653/350 104/3045/104 +f 351/852/351 352/3178/352 350/1653/350 349/3176/349 +f 344/460/344 348/3174/348 350/1653/350 352/3178/352 +f 90/812/90 104/3045/104 350/1653/350 348/3174/348 +f 330/56/330 333/3167/333 353/1654/353 354/3179/354 +f 328/847/328 345/3173/345 353/1654/353 333/3167/333 +f 344/460/344 352/3178/352 353/1654/353 345/3173/345 +f 351/852/351 354/3179/354 353/1654/353 352/3178/352 +f 153/12/153 355/3181/355 356/1655/356 154/3074/154 +f 357/854/357 358/3182/358 356/1655/356 355/3181/355 +f 359/461/359 360/3183/360 356/1655/356 358/3182/358 +f 157/823/157 154/3074/154 356/1655/356 360/3183/360 +f 361/13/361 362/3184/362 363/1656/363 364/3186/364 +f 365/855/365 366/3185/366 363/1656/363 362/3184/362 +f 359/461/359 358/3182/358 363/1656/363 366/3185/366 +f 357/854/357 364/3186/364 363/1656/363 358/3182/358 +f 330/14/330 354/3180/354 367/1657/367 368/3188/368 +f 351/853/351 369/3187/369 367/1657/367 354/3180/354 +f 359/461/359 366/3185/366 367/1657/367 369/3187/369 +f 365/855/365 368/3188/368 367/1657/367 366/3185/366 +f 103/15/103 160/3080/160 370/1658/370 349/3177/349 +f 157/823/157 360/3183/360 370/1658/370 160/3080/160 +f 359/461/359 369/3187/369 370/1658/370 360/3183/360 +f 351/853/351 349/3177/349 370/1658/370 369/3187/369 +f 361/13/361 371/3189/371 372/1659/372 362/3184/362 +f 373/856/373 374/3190/374 372/1659/372 371/3189/371 +f 375/462/375 376/3191/376 372/1659/372 374/3190/374 +f 365/855/365 362/3184/362 372/1659/372 376/3191/376 +f 377/16/377 378/3192/378 379/1660/379 380/3194/380 +f 381/857/381 382/3193/382 379/1660/379 378/3192/378 +f 375/462/375 374/3190/374 379/1660/379 382/3193/382 +f 373/856/373 380/3194/380 379/1660/379 374/3190/374 +f 336/38/336 339/3170/339 383/1661/383 384/3196/384 +f 334/849/334 385/3195/385 383/1661/383 339/3170/339 +f 375/462/375 382/3193/382 383/1661/383 385/3195/385 +f 381/857/381 384/3196/384 383/1661/383 382/3193/382 +f 330/14/330 368/3188/368 386/1662/386 331/3165/331 +f 365/855/365 376/3191/376 386/1662/386 368/3188/368 +f 375/462/375 385/3195/385 386/1662/386 376/3191/376 +f 334/849/334 331/3165/331 386/1662/386 385/3195/385 +f 113/20/113 282/3142/282 387/1663/387 114/3050/114 +f 287/843/287 388/3197/388 387/1663/387 282/3142/282 +f 389/463/389 390/3198/390 387/1663/387 388/3197/388 +f 117/814/117 114/3050/114 387/1663/387 390/3198/390 +f 272/50/272 391/3199/391 392/1664/392 297/3148/297 +f 393/858/393 394/3200/394 392/1664/392 391/3199/391 +f 389/463/389 388/3197/388 392/1664/392 394/3200/394 +f 287/843/287 297/3148/297 392/1664/392 388/3197/388 +f 395/58/395 396/3201/396 397/1665/397 398/3203/398 +f 399/859/399 400/3202/400 397/1665/397 396/3201/396 +f 389/463/389 394/3200/394 397/1665/397 400/3202/400 +f 393/858/393 398/3203/398 397/1665/397 394/3200/394 +f 119/23/119 122/3055/122 401/1666/401 402/3204/402 +f 117/814/117 390/3198/390 401/1666/401 122/3055/122 +f 389/463/389 400/3202/400 401/1666/401 390/3198/390 +f 399/859/399 402/3204/402 401/1666/401 400/3202/400 +f 272/50/272 275/3137/275 403/1667/403 391/3199/391 +f 270/839/270 404/3205/404 403/1667/403 275/3137/275 +f 405/464/405 406/3206/406 403/1667/403 404/3205/404 +f 393/858/393 391/3199/391 403/1667/403 406/3206/406 +f 266/49/266 407/3207/407 408/1668/408 267/3132/267 +f 409/860/409 410/3208/410 408/1668/408 407/3207/407 +f 405/464/405 404/3205/404 408/1668/408 410/3208/410 +f 270/839/270 267/3132/267 408/1668/408 404/3205/404 +f 411/59/411 412/3209/412 413/1669/413 414/3211/414 +f 415/861/415 416/3210/416 413/1669/413 412/3209/412 +f 405/464/405 410/3208/410 413/1669/413 416/3210/416 +f 409/860/409 414/3211/414 413/1669/413 410/3208/410 +f 395/58/395 398/3203/398 417/1670/417 418/3212/418 +f 393/858/393 406/3206/406 417/1670/417 398/3203/398 +f 405/464/405 416/3210/416 417/1670/417 406/3206/406 +f 415/861/415 418/3212/418 417/1670/417 416/3210/416 +f 419/60/419 420/3213/420 421/1671/421 422/3217/422 +f 423/862/423 424/3215/424 421/1671/421 420/3213/420 +f 425/465/425 426/3216/426 421/1671/421 424/3215/424 +f 427/865/427 422/3217/422 421/1671/421 426/3216/426 +f 428/61/428 429/3218/429 430/1672/430 431/3220/431 +f 432/864/432 433/3219/433 430/1672/430 429/3218/429 +f 425/465/425 424/3215/424 430/1672/430 433/3219/433 +f 423/862/423 431/3220/431 430/1672/430 424/3215/424 +f 395/58/395 418/3212/418 434/1673/434 435/3223/435 +f 415/861/415 436/3222/436 434/1673/434 418/3212/418 +f 425/465/425 433/3219/433 434/1673/434 436/3222/436 +f 432/864/432 435/3223/435 434/1673/434 433/3219/433 +f 411/59/411 437/3224/437 438/1674/438 412/3209/412 +f 427/865/427 426/3216/426 438/1674/438 437/3224/437 +f 425/465/425 436/3222/436 438/1674/438 426/3216/426 +f 415/861/415 412/3209/412 438/1674/438 436/3222/436 +f 428/61/428 439/3225/439 440/1675/440 429/3218/429 +f 441/866/441 442/3227/442 440/1675/440 439/3225/439 +f 443/466/443 444/3228/444 440/1675/440 442/3227/442 +f 432/864/432 429/3218/429 440/1675/440 444/3228/444 +f 127/24/127 130/3061/130 445/1676/445 446/3230/446 +f 135/819/135 447/3229/447 445/1676/445 130/3061/130 +f 443/466/443 442/3227/442 445/1676/445 447/3229/447 +f 441/866/441 446/3230/446 445/1676/445 442/3227/442 +f 119/23/119 402/3204/402 448/1677/448 145/3068/145 +f 399/859/399 449/3232/449 448/1677/448 402/3204/402 +f 443/466/443 447/3229/447 448/1677/448 449/3232/449 +f 135/819/135 145/3068/145 448/1677/448 447/3229/447 +f 395/58/395 435/3223/435 450/1678/450 396/3201/396 +f 432/864/432 444/3228/444 450/1678/450 435/3223/435 +f 443/466/443 449/3232/449 450/1678/450 444/3228/444 +f 399/859/399 396/3201/396 450/1678/450 449/3232/449 +f 113/20/113 116/3052/116 451/1679/451 280/3139/280 +f 109/813/109 452/3233/452 451/1679/451 116/3052/116 +f 453/467/453 454/3234/454 451/1679/451 452/3233/452 +f 283/841/283 280/3139/280 451/1679/451 454/3234/454 +f 91/11/91 455/3235/455 456/1680/456 107/3047/107 +f 457/868/457 458/3236/458 456/1680/456 455/3235/455 +f 453/467/453 452/3233/452 456/1680/456 458/3236/458 +f 109/813/109 107/3047/107 456/1680/456 452/3233/452 +f 459/62/459 460/3237/460 461/1681/461 462/3239/462 +f 463/869/463 464/3238/464 461/1681/461 460/3237/460 +f 453/467/453 458/3236/458 461/1681/461 464/3238/464 +f 457/868/457 462/3239/462 461/1681/461 458/3236/458 +f 288/52/288 291/3145/291 465/1682/465 466/3240/466 +f 283/841/283 454/3234/454 465/1682/465 291/3145/291 +f 453/467/453 464/3238/464 465/1682/465 454/3234/454 +f 463/869/463 466/3240/466 465/1682/465 464/3238/464 +f 91/11/91 94/3041/94 467/1683/467 455/3235/455 +f 86/809/86 468/3241/468 467/1683/467 94/3041/94 +f 469/468/469 470/3242/470 467/1683/467 468/3241/468 +f 457/868/457 455/3235/455 467/1683/467 470/3242/470 +f 82/10/82 347/3175/347 471/1684/471 83/3035/83 +f 342/851/342 472/3243/472 471/1684/471 347/3175/347 +f 469/468/469 468/3241/468 471/1684/471 472/3243/472 +f 86/809/86 83/3035/83 471/1684/471 468/3241/468 +f 324/55/324 473/3244/473 474/1685/474 340/3171/340 +f 475/870/475 476/3245/476 474/1685/474 473/3244/473 +f 469/468/469 472/3243/472 474/1685/474 476/3245/476 +f 342/851/342 340/3171/340 474/1685/474 472/3243/472 +f 459/62/459 462/3239/462 477/1686/477 478/3246/478 +f 457/868/457 470/3242/470 477/1686/477 462/3239/462 +f 469/468/469 476/3245/476 477/1686/477 470/3242/470 +f 475/870/475 478/3246/478 477/1686/477 476/3245/476 +f 315/54/315 479/3247/479 480/1687/480 316/3157/316 +f 481/871/481 482/3248/482 480/1687/480 479/3247/479 +f 483/469/483 484/3249/484 480/1687/480 482/3248/482 +f 319/846/319 316/3157/316 480/1687/480 484/3249/484 +f 485/65/485 486/3250/486 487/1688/487 488/3252/488 +f 489/872/489 490/3251/490 487/1688/487 486/3250/486 +f 483/469/483 482/3248/482 487/1688/487 490/3251/490 +f 481/871/481 488/3252/488 487/1688/487 482/3248/482 +f 459/62/459 478/3246/478 491/1689/491 492/3254/492 +f 475/870/475 493/3253/493 491/1689/491 478/3246/478 +f 483/469/483 490/3251/490 491/1689/491 493/3253/493 +f 489/872/489 492/3254/492 491/1689/491 490/3251/490 +f 324/55/324 327/3163/327 494/1690/494 473/3244/473 +f 319/846/319 484/3249/484 494/1690/494 327/3163/327 +f 483/469/483 493/3253/493 494/1690/494 484/3249/484 +f 475/870/475 473/3244/473 494/1690/494 493/3253/493 +f 485/65/485 495/3255/495 496/1691/496 486/3250/486 +f 497/873/497 498/3256/498 496/1691/496 495/3255/495 +f 499/470/499 500/3257/500 496/1691/496 498/3256/498 +f 489/872/489 486/3250/486 496/1691/496 500/3257/500 +f 305/53/305 308/3154/308 501/1692/501 502/3259/502 +f 301/844/301 503/3258/503 501/1692/501 308/3154/308 +f 499/470/499 498/3256/498 501/1692/501 503/3258/503 +f 497/873/497 502/3259/502 501/1692/501 498/3256/498 +f 288/52/288 466/3240/466 504/1693/504 299/3149/299 +f 463/869/463 505/3260/505 504/1693/504 466/3240/466 +f 499/470/499 503/3258/503 504/1693/504 505/3260/505 +f 301/844/301 299/3149/299 504/1693/504 503/3258/503 +f 459/62/459 492/3254/492 506/1694/506 460/3237/460 +f 489/872/489 500/3257/500 506/1694/506 492/3254/492 +f 499/470/499 505/3260/505 506/1694/506 500/3257/500 +f 463/869/463 460/3237/460 506/1694/506 505/3260/505 +f 507/41/507 508/3261/508 509/1695/509 510/3264/510 +f 511/874/511 512/3262/512 509/1695/509 508/3261/508 +f 513/471/513 514/3263/514 509/1695/509 512/3262/512 +f 515/877/515 510/3264/510 509/1695/509 514/3263/514 +f 516/107/516 517/3265/517 518/1696/518 519/3267/519 +f 520/875/520 521/3266/521 518/1696/518 517/3265/517 +f 513/471/513 512/3262/512 518/1696/518 521/3266/521 +f 511/874/511 519/3267/519 518/1696/518 512/3262/512 +f 522/108/522 523/3268/523 524/1697/524 525/3270/525 +f 526/876/526 527/3269/527 524/1697/524 523/3268/523 +f 513/471/513 521/3266/521 524/1697/524 527/3269/527 +f 520/875/520 525/3270/525 524/1697/524 521/3266/521 +f 528/113/528 529/3271/529 530/1698/530 531/3272/531 +f 515/877/515 514/3263/514 530/1698/530 529/3271/529 +f 513/471/513 527/3269/527 530/1698/530 514/3263/514 +f 526/876/526 531/3272/531 530/1698/530 527/3269/527 +f 516/107/516 532/3273/532 533/1699/533 517/3265/517 +f 534/878/534 535/3275/535 533/1699/533 532/3273/532 +f 536/472/536 537/3276/537 533/1699/533 535/3275/535 +f 520/875/520 517/3265/517 533/1699/533 537/3276/537 +f 32/115/32 538/3277/538 539/1700/539 540/3280/540 +f 541/880/541 542/3279/542 539/1700/539 538/3277/538 +f 536/472/536 535/3275/535 539/1700/539 542/3279/542 +f 534/878/534 540/3280/540 539/1700/539 535/3275/535 +f 543/125/543 544/3282/544 545/1701/545 546/3284/546 +f 547/882/547 548/3283/548 545/1701/545 544/3282/544 +f 536/472/536 542/3279/542 545/1701/545 548/3283/548 +f 541/880/541 546/3284/546 545/1701/545 542/3279/542 +f 522/108/522 525/3270/525 549/1702/549 550/3286/550 +f 520/875/520 537/3276/537 549/1702/549 525/3270/525 +f 536/472/536 548/3283/548 549/1702/549 537/3276/537 +f 547/882/547 550/3286/550 549/1702/549 548/3283/548 +f 377/16/377 551/3287/551 552/1703/552 553/3290/553 +f 554/883/554 555/3288/555 552/1703/552 551/3287/551 +f 556/473/556 557/3289/557 552/1703/552 555/3288/555 +f 558/885/558 553/3290/553 552/1703/552 557/3289/557 +f 559/127/559 560/3291/560 561/1704/561 562/3293/562 +f 563/884/563 564/3292/564 561/1704/561 560/3291/560 +f 556/473/556 555/3288/555 561/1704/561 564/3292/564 +f 554/883/554 562/3293/562 561/1704/561 555/3288/555 +f 522/108/522 550/3286/550 565/1705/565 566/3295/566 +f 547/882/547 567/3294/567 565/1705/565 550/3286/550 +f 556/473/556 564/3292/564 565/1705/565 567/3294/567 +f 563/884/563 566/3295/566 565/1705/565 564/3292/564 +f 543/125/543 568/3296/568 569/1706/569 544/3282/544 +f 558/885/558 557/3289/557 569/1706/569 568/3296/568 +f 556/473/556 567/3294/567 569/1706/569 557/3289/557 +f 547/882/547 544/3282/544 569/1706/569 567/3294/567 +f 559/127/559 570/3297/570 571/1707/571 560/3291/560 +f 572/886/572 573/3298/573 571/1707/571 570/3297/570 +f 574/474/574 575/3299/575 571/1707/571 573/3298/573 +f 563/884/563 560/3291/560 571/1707/571 575/3299/575 +f 576/128/576 577/3300/577 578/1708/578 579/3302/579 +f 580/887/580 581/3301/581 578/1708/578 577/3300/577 +f 574/474/574 573/3298/573 578/1708/578 581/3301/581 +f 572/886/572 579/3302/579 578/1708/578 573/3298/573 +f 528/113/528 531/3272/531 582/1709/582 583/3304/583 +f 526/876/526 584/3303/584 582/1709/582 531/3272/531 +f 574/474/574 581/3301/581 582/1709/582 584/3303/584 +f 580/887/580 583/3304/583 582/1709/582 581/3301/581 +f 522/108/522 566/3295/566 585/1710/585 523/3268/523 +f 563/884/563 575/3299/575 585/1710/585 566/3295/566 +f 574/474/574 584/3303/584 585/1710/585 575/3299/575 +f 526/876/526 523/3268/523 585/1710/585 584/3303/584 +f 266/49/266 586/3305/586 587/1711/587 407/3207/407 +f 588/888/588 589/3306/589 587/1711/587 586/3305/586 +f 590/475/590 591/3307/591 587/1711/587 589/3306/589 +f 409/860/409 407/3207/407 587/1711/587 591/3307/591 +f 592/67/592 593/3308/593 594/1712/594 595/3310/595 +f 596/889/596 597/3309/597 594/1712/594 593/3308/593 +f 590/475/590 589/3306/589 594/1712/594 597/3309/597 +f 588/888/588 595/3310/595 594/1712/594 589/3306/589 +f 598/68/598 599/3311/599 600/1713/600 601/3313/601 +f 602/890/602 603/3312/603 600/1713/600 599/3311/599 +f 590/475/590 597/3309/597 600/1713/600 603/3312/603 +f 596/889/596 601/3313/601 600/1713/600 597/3309/597 +f 411/59/411 414/3211/414 604/1714/604 605/3314/605 +f 409/860/409 591/3307/591 604/1714/604 414/3211/414 +f 590/475/590 603/3312/603 604/1714/604 591/3307/591 +f 602/890/602 605/3314/605 604/1714/604 603/3312/603 +f 592/67/592 606/3315/606 607/1715/607 593/3308/593 +f 608/891/608 609/3316/609 607/1715/607 606/3315/606 +f 610/476/610 611/3317/611 607/1715/607 609/3316/609 +f 596/889/596 593/3308/593 607/1715/607 611/3317/611 +f 612/70/612 613/3318/613 614/1716/614 615/3320/615 +f 616/892/616 617/3319/617 614/1716/614 613/3318/613 +f 610/476/610 609/3316/609 614/1716/614 617/3319/617 +f 608/891/608 615/3320/615 614/1716/614 609/3316/609 +f 618/72/618 619/3321/619 620/1717/620 621/3323/621 +f 622/893/622 623/3322/623 620/1717/620 619/3321/619 +f 610/476/610 617/3319/617 620/1717/620 623/3322/623 +f 616/892/616 621/3323/621 620/1717/620 617/3319/617 +f 598/68/598 601/3313/601 624/1718/624 625/3324/625 +f 596/889/596 611/3317/611 624/1718/624 601/3313/601 +f 610/476/610 623/3322/623 624/1718/624 611/3317/611 +f 622/893/622 625/3324/625 624/1718/624 623/3322/623 +f 626/74/626 627/3325/627 628/1719/628 629/3329/629 +f 630/894/630 631/3327/631 628/1719/628 627/3325/627 +f 632/477/632 633/3328/633 628/1719/628 631/3327/631 +f 634/897/634 629/3329/629 628/1719/628 633/3328/633 +f 635/75/635 636/3330/636 637/1720/637 638/3332/638 +f 639/896/639 640/3331/640 637/1720/637 636/3330/636 +f 632/477/632 631/3327/631 637/1720/637 640/3331/640 +f 630/894/630 638/3332/638 637/1720/637 631/3327/631 +f 598/68/598 625/3324/625 641/1721/641 642/3335/642 +f 622/893/622 643/3334/643 641/1721/641 625/3324/625 +f 632/477/632 640/3331/640 641/1721/641 643/3334/643 +f 639/896/639 642/3335/642 641/1721/641 640/3331/640 +f 618/72/618 644/3336/644 645/1722/645 619/3321/619 +f 634/897/634 633/3328/633 645/1722/645 644/3336/644 +f 632/477/632 643/3334/643 645/1722/645 633/3328/633 +f 622/893/622 619/3321/619 645/1722/645 643/3334/643 +f 635/75/635 646/3337/646 647/1723/647 636/3330/636 +f 648/898/648 649/3339/649 647/1723/647 646/3337/646 +f 650/478/650 651/3340/651 647/1723/647 649/3339/649 +f 639/896/639 636/3330/636 647/1723/647 651/3340/651 +f 419/60/419 422/3217/422 652/1724/652 653/3342/653 +f 427/865/427 654/3341/654 652/1724/652 422/3217/422 +f 650/478/650 649/3339/649 652/1724/652 654/3341/654 +f 648/898/648 653/3342/653 652/1724/652 649/3339/649 +f 411/59/411 605/3314/605 655/1725/655 437/3224/437 +f 602/890/602 656/3344/656 655/1725/655 605/3314/605 +f 650/478/650 654/3341/654 655/1725/655 656/3344/656 +f 427/865/427 437/3224/437 655/1725/655 654/3341/654 +f 598/68/598 642/3335/642 657/1726/657 599/3311/599 +f 639/896/639 651/3340/651 657/1726/657 642/3335/642 +f 650/478/650 656/3344/656 657/1726/657 651/3340/651 +f 602/890/602 599/3311/599 657/1726/657 656/3344/656 +f 72/9/72 658/3345/658 659/1727/659 163/3081/163 +f 660/900/660 661/3346/661 659/1727/659 658/3345/658 +f 662/479/662 663/3347/663 659/1727/659 661/3346/661 +f 165/824/165 163/3081/163 659/1727/659 663/3347/663 +f 664/76/664 665/3348/665 666/1728/666 667/3350/667 +f 668/901/668 669/3349/669 666/1728/666 665/3348/665 +f 662/479/662 661/3346/661 666/1728/666 669/3349/669 +f 660/900/660 667/3350/667 666/1728/666 661/3346/661 +f 670/77/670 671/3351/671 672/1729/672 673/3353/673 +f 674/902/674 675/3352/675 672/1729/672 671/3351/671 +f 662/479/662 669/3349/669 672/1729/672 675/3352/675 +f 668/901/668 673/3353/673 672/1729/672 669/3349/669 +f 169/27/169 172/3086/172 676/1730/676 677/3354/677 +f 165/824/165 663/3347/663 676/1730/676 172/3086/172 +f 662/479/662 675/3352/675 676/1730/676 663/3347/663 +f 674/902/674 677/3354/677 676/1730/676 675/3352/675 +f 664/76/664 678/3355/678 679/1731/679 665/3348/665 +f 680/903/680 681/3356/681 679/1731/679 678/3355/678 +f 682/480/682 683/3357/683 679/1731/679 681/3356/681 +f 668/901/668 665/3348/665 679/1731/679 683/3357/683 +f 684/86/684 685/3358/685 686/1732/686 687/3360/687 +f 688/904/688 689/3359/689 686/1732/686 685/3358/685 +f 682/480/682 681/3356/681 686/1732/686 689/3359/689 +f 680/903/680 687/3360/687 686/1732/686 681/3356/681 +f 690/88/690 691/3361/691 692/1733/692 693/3363/693 +f 694/905/694 695/3362/695 692/1733/692 691/3361/691 +f 682/480/682 689/3359/689 692/1733/692 695/3362/695 +f 688/904/688 693/3363/693 692/1733/692 689/3359/689 +f 670/77/670 673/3353/673 696/1734/696 697/3364/697 +f 668/901/668 683/3357/683 696/1734/696 673/3353/673 +f 682/480/682 695/3362/695 696/1734/696 683/3357/683 +f 694/905/694 697/3364/697 696/1734/696 695/3362/695 +f 698/177/698 699/3365/699 700/1735/700 701/3368/701 +f 702/906/702 703/3366/703 700/1735/700 699/3365/699 +f 704/481/704 705/3367/705 700/1735/700 703/3366/703 +f 706/908/706 701/3368/701 700/1735/700 705/3367/705 +f 707/178/707 708/3369/708 709/1736/709 710/3371/710 +f 711/907/711 712/3370/712 709/1736/709 708/3369/708 +f 704/481/704 703/3366/703 709/1736/709 712/3370/712 +f 702/906/702 710/3371/710 709/1736/709 703/3366/703 +f 670/77/670 697/3364/697 713/1737/713 714/3373/714 +f 694/905/694 715/3372/715 713/1737/713 697/3364/697 +f 704/481/704 712/3370/712 713/1737/713 715/3372/715 +f 711/907/711 714/3373/714 713/1737/713 712/3370/712 +f 690/88/690 716/3374/716 717/1738/717 691/3361/691 +f 706/908/706 705/3367/705 717/1738/717 716/3374/716 +f 704/481/704 715/3372/715 717/1738/717 705/3367/705 +f 694/905/694 691/3361/691 717/1738/717 715/3372/715 +f 707/178/707 718/3375/718 719/1739/719 708/3369/708 +f 720/909/720 721/3376/721 719/1739/719 718/3375/718 +f 722/482/722 723/3377/723 719/1739/719 721/3376/721 +f 711/907/711 708/3369/708 719/1739/719 723/3377/723 +f 189/31/189 192/3096/192 724/1740/724 725/3379/725 +f 185/827/185 726/3378/726 724/1740/724 192/3096/192 +f 722/482/722 721/3376/721 724/1740/724 726/3378/726 +f 720/909/720 725/3379/725 724/1740/724 721/3376/721 +f 169/27/169 677/3354/677 727/1741/727 183/3091/183 +f 674/902/674 728/3380/728 727/1741/727 677/3354/677 +f 722/482/722 726/3378/726 727/1741/727 728/3380/728 +f 185/827/185 183/3091/183 727/1741/727 726/3378/726 +f 670/77/670 714/3373/714 729/1742/729 671/3351/671 +f 711/907/711 723/3377/723 729/1742/729 714/3373/714 +f 722/482/722 728/3380/728 729/1742/729 723/3377/723 +f 674/902/674 671/3351/671 729/1742/729 728/3380/728 +f 235/36/235 730/3381/730 731/1743/731 236/3117/236 +f 732/910/732 733/3382/733 731/1743/731 730/3381/730 +f 734/483/734 735/3383/735 731/1743/731 733/3382/733 +f 239/834/239 236/3117/236 731/1743/731 735/3383/735 +f 736/179/736 737/3384/737 738/1744/738 739/3386/739 +f 740/911/740 741/3385/741 738/1744/738 737/3384/737 +f 734/483/734 733/3382/733 738/1744/738 741/3385/741 +f 732/910/732 739/3386/739 738/1744/738 733/3382/733 +f 742/180/742 743/3387/743 744/1745/744 745/3389/745 +f 746/912/746 747/3388/747 744/1745/744 743/3387/743 +f 734/483/734 741/3385/741 744/1745/744 747/3388/747 +f 740/911/740 745/3389/745 744/1745/744 741/3385/741 +f 244/40/244 247/3123/247 748/1746/748 749/3390/749 +f 239/834/239 735/3383/735 748/1746/748 247/3123/247 +f 734/483/734 747/3388/747 748/1746/748 735/3383/735 +f 746/912/746 749/3390/749 748/1746/748 747/3388/747 +f 736/179/736 750/3391/750 751/1747/751 737/3384/737 +f 752/913/752 753/3392/753 751/1747/751 750/3391/750 +f 754/484/754 755/3393/755 751/1747/751 753/3392/753 +f 740/911/740 737/3384/737 751/1747/751 755/3393/755 +f 756/181/756 757/3394/757 758/1748/758 759/3396/759 +f 760/914/760 761/3395/761 758/1748/758 757/3394/757 +f 754/484/754 753/3392/753 758/1748/758 761/3395/761 +f 752/913/752 759/3396/759 758/1748/758 753/3392/753 +f 762/182/762 763/3397/763 764/1749/764 765/3399/765 +f 766/915/766 767/3398/767 764/1749/764 763/3397/763 +f 754/484/754 761/3395/761 764/1749/764 767/3398/767 +f 760/914/760 765/3399/765 764/1749/764 761/3395/761 +f 742/180/742 745/3389/745 768/1750/768 769/3400/769 +f 740/911/740 755/3393/755 768/1750/768 745/3389/745 +f 754/484/754 767/3398/767 768/1750/768 755/3393/755 +f 766/915/766 769/3400/769 768/1750/768 767/3398/767 +f 612/70/612 615/3320/615 770/1751/770 771/3403/771 +f 608/891/608 772/3401/772 770/1751/770 615/3320/615 +f 773/485/773 774/3402/774 770/1751/770 772/3401/772 +f 775/917/775 771/3403/771 770/1751/770 774/3402/774 +f 592/67/592 776/3404/776 777/1752/777 606/3315/606 +f 778/916/778 779/3405/779 777/1752/777 776/3404/776 +f 773/485/773 772/3401/772 777/1752/777 779/3405/779 +f 608/891/608 606/3315/606 777/1752/777 772/3401/772 +f 742/180/742 769/3400/769 780/1753/780 781/3407/781 +f 766/915/766 782/3406/782 780/1753/780 769/3400/769 +f 773/485/773 779/3405/779 780/1753/780 782/3406/782 +f 778/916/778 781/3407/781 780/1753/780 779/3405/779 +f 762/182/762 783/3408/783 784/1754/784 763/3397/763 +f 775/917/775 774/3402/774 784/1754/784 783/3408/783 +f 773/485/773 782/3406/782 784/1754/784 774/3402/774 +f 766/915/766 763/3397/763 784/1754/784 782/3406/782 +f 592/67/592 595/3310/595 785/1755/785 776/3404/776 +f 588/888/588 786/3409/786 785/1755/785 595/3310/595 +f 787/486/787 788/3410/788 785/1755/785 786/3409/786 +f 778/916/778 776/3404/776 785/1755/785 788/3410/788 +f 266/49/266 269/3134/269 789/1756/789 586/3305/586 +f 262/838/262 790/3411/790 789/1756/789 269/3134/269 +f 787/486/787 786/3409/786 789/1756/789 790/3411/790 +f 588/888/588 586/3305/586 789/1756/789 786/3409/786 +f 244/40/244 749/3390/749 791/1757/791 260/3129/260 +f 746/912/746 792/3412/792 791/1757/791 749/3390/749 +f 787/486/787 790/3411/790 791/1757/791 792/3412/792 +f 262/838/262 260/3129/260 791/1757/791 790/3411/790 +f 742/180/742 781/3407/781 793/1758/793 743/3387/743 +f 778/916/778 788/3410/788 793/1758/793 781/3407/781 +f 787/486/787 792/3412/792 793/1758/793 788/3410/788 +f 746/912/746 743/3387/743 793/1758/793 792/3412/792 +f 794/21/794 795/3413/795 796/1759/796 797/3416/797 +f 798/918/798 799/3414/799 796/1759/796 795/3413/795 +f 800/487/800 801/3415/801 796/1759/796 799/3414/799 +f 802/921/802 797/3416/797 796/1759/796 801/3415/801 +f 803/28/803 804/3417/804 805/1760/805 806/3419/806 +f 807/919/807 808/3418/808 805/1760/805 804/3417/804 +f 800/487/800 799/3414/799 805/1760/805 808/3418/808 +f 798/918/798 806/3419/806 805/1760/805 799/3414/799 +f 809/35/809 810/3420/810 811/1761/811 812/3422/812 +f 813/920/813 814/3421/814 811/1761/811 810/3420/810 +f 800/487/800 808/3418/808 811/1761/811 814/3421/814 +f 807/919/807 812/3422/812 811/1761/811 808/3418/808 +f 815/42/815 816/3423/816 817/1762/817 818/3424/818 +f 802/921/802 801/3415/801 817/1762/817 816/3423/816 +f 800/487/800 814/3421/814 817/1762/817 801/3415/801 +f 813/920/813 818/3424/818 817/1762/817 814/3421/814 +f 803/28/803 819/3425/819 820/1763/820 804/3417/804 +f 821/922/821 822/3426/822 820/1763/820 819/3425/819 +f 823/488/823 824/3427/824 820/1763/820 822/3426/822 +f 807/919/807 804/3417/804 820/1763/820 824/3427/824 +f 825/44/825 826/3428/826 827/1764/827 828/3430/828 +f 829/923/829 830/3429/830 827/1764/827 826/3428/826 +f 823/488/823 822/3426/822 827/1764/827 830/3429/830 +f 821/922/821 828/3430/828 827/1764/827 822/3426/822 +f 831/46/831 832/3431/832 833/1765/833 834/3433/834 +f 835/924/835 836/3432/836 833/1765/833 832/3431/832 +f 823/488/823 830/3429/830 833/1765/833 836/3432/836 +f 829/923/829 834/3433/834 833/1765/833 830/3429/830 +f 809/35/809 812/3422/812 837/1766/837 838/3434/838 +f 807/919/807 824/3427/824 837/1766/837 812/3422/812 +f 823/488/823 836/3432/836 837/1766/837 824/3427/824 +f 835/924/835 838/3434/838 837/1766/837 836/3432/836 +f 839/47/839 840/3435/840 841/1767/841 842/3439/842 +f 843/925/843 844/3437/844 841/1767/841 840/3435/840 +f 845/489/845 846/3438/846 841/1767/841 844/3437/844 +f 847/928/847 842/3439/842 841/1767/841 846/3438/846 +f 848/78/848 849/3440/849 850/1768/850 851/3442/851 +f 852/927/852 853/3441/853 850/1768/850 849/3440/849 +f 845/489/845 844/3437/844 850/1768/850 853/3441/853 +f 843/925/843 851/3442/851 850/1768/850 844/3437/844 +f 809/35/809 838/3434/838 854/1769/854 855/3445/855 +f 835/924/835 856/3444/856 854/1769/854 838/3434/838 +f 845/489/845 853/3441/853 854/1769/854 856/3444/856 +f 852/927/852 855/3445/855 854/1769/854 853/3441/853 +f 831/46/831 857/3446/857 858/1770/858 832/3431/832 +f 847/928/847 846/3438/846 858/1770/858 857/3446/857 +f 845/489/845 856/3444/856 858/1770/858 846/3438/846 +f 835/924/835 832/3431/832 858/1770/858 856/3444/856 +f 848/78/848 859/3447/859 860/1771/860 849/3440/849 +f 861/929/861 862/3449/862 860/1771/860 859/3447/859 +f 863/490/863 864/3450/864 860/1771/860 862/3449/862 +f 852/927/852 849/3440/849 860/1771/860 864/3450/864 +f 46/79/46 865/3451/865 866/1772/866 867/3453/867 +f 868/931/868 869/3452/869 866/1772/866 865/3451/865 +f 863/490/863 862/3449/862 866/1772/866 869/3452/869 +f 861/929/861 867/3453/867 866/1772/866 862/3449/862 +f 815/42/815 818/3424/818 870/1773/870 871/3456/871 +f 813/920/813 872/3455/872 870/1773/870 818/3424/818 +f 863/490/863 869/3452/869 870/1773/870 872/3455/872 +f 868/931/868 871/3456/871 870/1773/870 869/3452/869 +f 809/35/809 855/3445/855 873/1774/873 810/3420/810 +f 852/927/852 864/3450/864 873/1774/873 855/3445/855 +f 863/490/863 872/3455/872 873/1774/873 864/3450/864 +f 813/920/813 810/3420/810 873/1774/873 872/3455/872 +f 698/177/698 874/3457/874 875/1775/875 699/3365/699 +f 876/932/876 877/3458/877 875/1775/875 874/3457/874 +f 878/491/878 879/3459/879 875/1775/875 877/3458/877 +f 702/906/702 699/3365/699 875/1775/875 879/3459/879 +f 880/183/880 881/3460/881 882/1776/882 883/3462/883 +f 884/933/884 885/3461/885 882/1776/882 881/3460/881 +f 878/491/878 877/3458/877 882/1776/882 885/3461/885 +f 876/932/876 883/3462/883 882/1776/882 877/3458/877 +f 886/185/886 887/3463/887 888/1777/888 889/3465/889 +f 890/934/890 891/3464/891 888/1777/888 887/3463/887 +f 878/491/878 885/3461/885 888/1777/888 891/3464/891 +f 884/933/884 889/3465/889 888/1777/888 885/3461/885 +f 707/178/707 710/3371/710 892/1778/892 893/3466/893 +f 702/906/702 879/3459/879 892/1778/892 710/3371/710 +f 878/491/878 891/3464/891 892/1778/892 879/3459/879 +f 890/934/890 893/3466/893 892/1778/892 891/3464/891 +f 880/183/880 894/3467/894 895/1779/895 881/3460/881 +f 896/935/896 897/3468/897 895/1779/895 894/3467/894 +f 898/492/898 899/3469/899 895/1779/895 897/3468/897 +f 884/933/884 881/3460/881 895/1779/895 899/3469/899 +f 756/181/756 759/3396/759 900/1780/900 901/3471/901 +f 752/913/752 902/3470/902 900/1780/900 759/3396/759 +f 898/492/898 897/3468/897 900/1780/900 902/3470/902 +f 896/935/896 901/3471/901 900/1780/900 897/3468/897 +f 736/179/736 903/3472/903 904/1781/904 750/3391/750 +f 905/936/905 906/3473/906 904/1781/904 903/3472/903 +f 898/492/898 902/3470/902 904/1781/904 906/3473/906 +f 752/913/752 750/3391/750 904/1781/904 902/3470/902 +f 886/185/886 889/3465/889 907/1782/907 908/3474/908 +f 884/933/884 899/3469/899 907/1782/907 889/3465/889 +f 898/492/898 906/3473/906 907/1782/907 899/3469/899 +f 905/936/905 908/3474/908 907/1782/907 906/3473/906 +f 235/36/235 909/3475/909 910/1783/910 730/3381/730 +f 911/937/911 912/3476/912 910/1783/910 909/3475/909 +f 913/493/913 914/3477/914 910/1783/910 912/3476/912 +f 732/910/732 730/3381/730 910/1783/910 914/3477/914 +f 915/186/915 916/3478/916 917/1784/917 918/3480/918 +f 919/938/919 920/3479/920 917/1784/917 916/3478/916 +f 913/493/913 912/3476/912 917/1784/917 920/3479/920 +f 911/937/911 918/3480/918 917/1784/917 912/3476/912 +f 886/185/886 908/3474/908 921/1785/921 922/3482/922 +f 905/936/905 923/3481/923 921/1785/921 908/3474/908 +f 913/493/913 920/3479/920 921/1785/921 923/3481/923 +f 919/938/919 922/3482/922 921/1785/921 920/3479/920 +f 736/179/736 739/3386/739 924/1786/924 903/3472/903 +f 732/910/732 914/3477/914 924/1786/924 739/3386/739 +f 913/493/913 923/3481/923 924/1786/924 914/3477/914 +f 905/936/905 903/3472/903 924/1786/924 923/3481/923 +f 915/186/915 925/3483/925 926/1787/926 916/3478/916 +f 927/939/927 928/3484/928 926/1787/926 925/3483/925 +f 929/494/929 930/3485/930 926/1787/926 928/3484/928 +f 919/938/919 916/3478/916 926/1787/926 930/3485/930 +f 189/31/189 725/3379/725 931/1788/931 932/3487/932 +f 720/909/720 933/3486/933 931/1788/931 725/3379/725 +f 929/494/929 928/3484/928 931/1788/931 933/3486/933 +f 927/939/927 932/3487/932 931/1788/931 928/3484/928 +f 707/178/707 893/3466/893 934/1789/934 718/3375/718 +f 890/934/890 935/3488/935 934/1789/934 893/3466/893 +f 929/494/929 933/3486/933 934/1789/934 935/3488/935 +f 720/909/720 718/3375/718 934/1789/934 933/3486/933 +f 886/185/886 922/3482/922 936/1790/936 887/3463/887 +f 919/938/919 930/3485/930 936/1790/936 922/3482/922 +f 929/494/929 935/3488/935 936/1790/936 930/3485/930 +f 890/934/890 887/3463/887 936/1790/936 935/3488/935 +f 189/31/189 932/3487/932 937/1791/937 190/3094/190 +f 927/939/927 938/3489/938 937/1791/937 932/3487/932 +f 939/495/939 940/3490/940 937/1791/937 938/3489/938 +f 193/828/193 190/3094/190 937/1791/937 940/3490/940 +f 915/186/915 941/3491/941 942/1792/942 925/3483/925 +f 943/940/943 944/3492/944 942/1792/942 941/3491/941 +f 939/495/939 938/3489/938 942/1792/942 944/3492/944 +f 927/939/927 925/3483/925 942/1792/942 938/3489/938 +f 945/187/945 946/3493/946 947/1793/947 948/3495/948 +f 949/941/949 950/3494/950 947/1793/947 946/3493/946 +f 939/495/939 944/3492/944 947/1793/947 950/3494/950 +f 943/940/943 948/3495/948 947/1793/947 944/3492/944 +f 195/32/195 198/3099/198 951/1794/951 952/3496/952 +f 193/828/193 940/3490/940 951/1794/951 198/3099/198 +f 939/495/939 950/3494/950 951/1794/951 940/3490/940 +f 949/941/949 952/3496/952 951/1794/951 950/3494/950 +f 915/186/915 918/3480/918 953/1795/953 941/3491/941 +f 911/937/911 954/3497/954 953/1795/953 918/3480/918 +f 955/496/955 956/3498/956 953/1795/953 954/3497/954 +f 943/940/943 941/3491/941 953/1795/953 956/3498/956 +f 235/36/235 238/3120/238 957/1796/957 909/3475/909 +f 243/837/243 958/3499/958 957/1796/957 238/3120/238 +f 955/496/955 954/3497/954 957/1796/957 958/3499/958 +f 911/937/911 909/3475/909 957/1796/957 954/3497/954 +f 256/48/256 959/3500/959 960/1797/960 257/3127/257 +f 961/942/961 962/3501/962 960/1797/960 959/3500/959 +f 955/496/955 958/3499/958 960/1797/960 962/3501/962 +f 243/837/243 257/3127/257 960/1797/960 958/3499/958 +f 945/187/945 948/3495/948 963/1798/963 964/3502/964 +f 943/940/943 956/3498/956 963/1798/963 948/3495/948 +f 955/496/955 962/3501/962 963/1798/963 956/3498/956 +f 961/942/961 964/3502/964 963/1798/963 962/3501/962 +f 305/53/305 965/3503/965 966/1799/966 306/3152/306 +f 967/943/967 968/3504/968 966/1799/966 965/3503/965 +f 969/497/969 970/3505/970 966/1799/966 968/3504/968 +f 309/845/309 306/3152/306 966/1799/966 970/3505/970 +f 971/189/971 972/3506/972 973/1800/973 974/3508/974 +f 975/944/975 976/3507/976 973/1800/973 972/3506/972 +f 969/497/969 968/3504/968 973/1800/973 976/3507/976 +f 967/943/967 974/3508/974 973/1800/973 968/3504/968 +f 945/187/945 964/3502/964 977/1801/977 978/3510/978 +f 961/942/961 979/3509/979 977/1801/977 964/3502/964 +f 969/497/969 976/3507/976 977/1801/977 979/3509/979 +f 975/944/975 978/3510/978 977/1801/977 976/3507/976 +f 256/48/256 312/3156/312 980/1802/980 959/3500/959 +f 309/845/309 970/3505/970 980/1802/980 312/3156/312 +f 969/497/969 979/3509/979 980/1802/980 970/3505/970 +f 961/942/961 959/3500/959 980/1802/980 979/3509/979 +f 971/189/971 981/3511/981 982/1803/982 972/3506/972 +f 983/945/983 984/3512/984 982/1803/982 981/3511/981 +f 985/498/985 986/3513/986 982/1803/982 984/3512/984 +f 975/944/975 972/3506/972 982/1803/982 986/3513/986 +f 203/33/203 206/3104/206 987/1804/987 988/3515/988 +f 211/832/211 989/3514/989 987/1804/987 206/3104/206 +f 985/498/985 984/3512/984 987/1804/987 989/3514/989 +f 983/945/983 988/3515/988 987/1804/987 984/3512/984 +f 195/32/195 952/3496/952 990/1805/990 221/3110/221 +f 949/941/949 991/3516/991 990/1805/990 952/3496/952 +f 985/498/985 989/3514/989 990/1805/990 991/3516/991 +f 211/832/211 221/3110/221 990/1805/990 989/3514/989 +f 945/187/945 978/3510/978 992/1806/992 946/3493/946 +f 975/944/975 986/3513/986 992/1806/992 978/3510/978 +f 985/498/985 991/3516/991 992/1806/992 986/3513/986 +f 949/941/949 946/3493/946 992/1806/992 991/3516/991 +f 203/33/203 988/3515/988 993/1807/993 204/3101/204 +f 983/945/983 994/3517/994 993/1807/993 988/3515/988 +f 995/499/995 996/3518/996 993/1807/993 994/3517/994 +f 207/830/207 204/3101/204 993/1807/993 996/3518/996 +f 971/189/971 997/3519/997 998/1808/998 981/3511/981 +f 999/946/999 1000/3520/1000 998/1808/998 997/3519/997 +f 995/499/995 994/3517/994 998/1808/998 1000/3520/1000 +f 983/945/983 981/3511/981 998/1808/998 994/3517/994 +f 1001/190/1001 1002/3521/1002 1003/1809/1003 1004/3523/1004 +f 1005/947/1005 1006/3522/1006 1003/1809/1003 1002/3521/1002 +f 995/499/995 1000/3520/1000 1003/1809/1003 1006/3522/1006 +f 999/946/999 1004/3523/1004 1003/1809/1003 1000/3520/1000 +f 212/34/212 215/3107/215 1007/1810/1007 1008/3524/1008 +f 207/830/207 996/3518/996 1007/1810/1007 215/3107/215 +f 995/499/995 1006/3522/1006 1007/1810/1007 996/3518/996 +f 1005/947/1005 1008/3524/1008 1007/1810/1007 1006/3522/1006 +f 971/189/971 974/3508/974 1009/1811/1009 997/3519/997 +f 967/943/967 1010/3525/1010 1009/1811/1009 974/3508/974 +f 1011/500/1011 1012/3526/1012 1009/1811/1009 1010/3525/1010 +f 999/946/999 997/3519/997 1009/1811/1009 1012/3526/1012 +f 305/53/305 502/3259/502 1013/1812/1013 965/3503/965 +f 497/873/497 1014/3527/1014 1013/1812/1013 502/3259/502 +f 1011/500/1011 1010/3525/1010 1013/1812/1013 1014/3527/1014 +f 967/943/967 965/3503/965 1013/1812/1013 1010/3525/1010 +f 485/65/485 1015/3528/1015 1016/1813/1016 495/3255/495 +f 1017/948/1017 1018/3529/1018 1016/1813/1016 1015/3528/1015 +f 1011/500/1011 1014/3527/1014 1016/1813/1016 1018/3529/1018 +f 497/873/497 495/3255/495 1016/1813/1016 1014/3527/1014 +f 1001/190/1001 1004/3523/1004 1019/1814/1019 1020/3530/1020 +f 999/946/999 1012/3526/1012 1019/1814/1019 1004/3523/1004 +f 1011/500/1011 1018/3529/1018 1019/1814/1019 1012/3526/1012 +f 1017/948/1017 1020/3530/1020 1019/1814/1019 1018/3529/1018 +f 315/54/315 1021/3531/1021 1022/1815/1022 479/3247/479 +f 1023/949/1023 1024/3532/1024 1022/1815/1022 1021/3531/1021 +f 1025/501/1025 1026/3533/1026 1022/1815/1022 1024/3532/1024 +f 481/871/481 479/3247/479 1022/1815/1022 1026/3533/1026 +f 1027/191/1027 1028/3534/1028 1029/1816/1029 1030/3536/1030 +f 1031/950/1031 1032/3535/1032 1029/1816/1029 1028/3534/1028 +f 1025/501/1025 1024/3532/1024 1029/1816/1029 1032/3535/1032 +f 1023/949/1023 1030/3536/1030 1029/1816/1029 1024/3532/1024 +f 1001/190/1001 1020/3530/1020 1033/1817/1033 1034/3538/1034 +f 1017/948/1017 1035/3537/1035 1033/1817/1033 1020/3530/1020 +f 1025/501/1025 1032/3535/1032 1033/1817/1033 1035/3537/1035 +f 1031/950/1031 1034/3538/1034 1033/1817/1033 1032/3535/1032 +f 485/65/485 488/3252/488 1036/1818/1036 1015/3528/1015 +f 481/871/481 1026/3533/1026 1036/1818/1036 488/3252/488 +f 1025/501/1025 1035/3537/1035 1036/1818/1036 1026/3533/1026 +f 1017/948/1017 1015/3528/1015 1036/1818/1036 1035/3537/1035 +f 1027/191/1027 1037/3539/1037 1038/1819/1038 1028/3534/1028 +f 1039/951/1039 1040/3540/1040 1038/1819/1038 1037/3539/1037 +f 1041/502/1041 1042/3541/1042 1038/1819/1038 1040/3540/1040 +f 1031/950/1031 1028/3534/1028 1038/1819/1038 1042/3541/1042 +f 1/1/1 230/3115/230 1043/1820/1043 1044/3543/1044 +f 225/833/225 1045/3542/1045 1043/1820/1043 230/3115/230 +f 1041/502/1041 1040/3540/1040 1043/1820/1043 1045/3542/1045 +f 1039/951/1039 1044/3543/1044 1043/1820/1043 1040/3540/1040 +f 212/34/212 1008/3524/1008 1046/1821/1046 223/3111/223 +f 1005/947/1005 1047/3544/1047 1046/1821/1046 1008/3524/1008 +f 1041/502/1041 1045/3542/1045 1046/1821/1046 1047/3544/1047 +f 225/833/225 223/3111/223 1046/1821/1046 1045/3542/1045 +f 1001/190/1001 1034/3538/1034 1048/1822/1048 1002/3521/1002 +f 1031/950/1031 1042/3541/1042 1048/1822/1048 1034/3538/1034 +f 1041/502/1041 1047/3544/1047 1048/1822/1048 1042/3541/1042 +f 1005/947/1005 1002/3521/1002 1048/1822/1048 1047/3544/1047 +f 32/80/32 540/3281/540 1049/1823/1049 33/3007/33 +f 534/879/534 1050/3545/1050 1049/1823/1049 540/3281/540 +f 1051/503/1051 1052/3546/1052 1049/1823/1049 1050/3545/1050 +f 36/801/36 33/3007/33 1049/1823/1049 1052/3546/1052 +f 516/90/516 1053/3547/1053 1054/1824/1054 532/3274/532 +f 1055/952/1055 1056/3549/1056 1054/1824/1054 1053/3547/1053 +f 1051/503/1051 1050/3545/1050 1054/1824/1054 1056/3549/1056 +f 534/879/534 532/3274/532 1054/1824/1054 1050/3545/1050 +f 1057/91/1057 1058/3550/1058 1059/1825/1059 1060/3552/1060 +f 1061/954/1061 1062/3551/1062 1059/1825/1059 1058/3550/1058 +f 1051/503/1051 1056/3549/1056 1059/1825/1059 1062/3551/1062 +f 1055/952/1055 1060/3552/1060 1059/1825/1059 1056/3549/1056 +f 38/122/38 41/3013/41 1063/1826/1063 1064/3554/1064 +f 36/801/36 1052/3546/1052 1063/1826/1063 41/3013/41 +f 1051/503/1051 1062/3551/1062 1063/1826/1063 1052/3546/1052 +f 1061/954/1061 1064/3554/1064 1063/1826/1063 1062/3551/1062 +f 516/107/516 519/3267/519 1065/1827/1065 1053/3548/1053 +f 511/874/511 1066/3555/1066 1065/1827/1065 519/3267/519 +f 1067/504/1067 1068/3556/1068 1065/1827/1065 1066/3555/1066 +f 1055/953/1055 1053/3548/1053 1065/1827/1065 1068/3556/1068 +f 507/41/507 1069/3557/1069 1070/1828/1070 508/3261/508 +f 1071/955/1071 1072/3558/1072 1070/1828/1070 1069/3557/1069 +f 1067/504/1067 1066/3555/1066 1070/1828/1070 1072/3558/1072 +f 511/874/511 508/3261/508 1070/1828/1070 1066/3555/1066 +f 1073/184/1073 1074/3559/1074 1075/1829/1075 1076/3562/1076 +f 1077/956/1077 1078/3561/1078 1075/1829/1075 1074/3559/1074 +f 1067/504/1067 1072/3558/1072 1075/1829/1075 1078/3561/1078 +f 1071/955/1071 1076/3562/1076 1075/1829/1075 1072/3558/1072 +f 1057/194/1057 1060/3553/1060 1079/1830/1079 1080/3563/1080 +f 1055/953/1055 1068/3556/1068 1079/1830/1079 1060/3553/1060 +f 1067/504/1067 1078/3561/1078 1079/1830/1079 1068/3556/1068 +f 1077/956/1077 1080/3563/1080 1079/1830/1079 1078/3561/1078 +f 794/21/794 797/3416/797 1081/1831/1081 1082/3567/1082 +f 802/921/802 1083/3565/1083 1081/1831/1081 797/3416/797 +f 1084/505/1084 1085/3566/1085 1081/1831/1081 1083/3565/1083 +f 1086/959/1086 1082/3567/1082 1081/1831/1081 1085/3566/1085 +f 815/42/815 1087/3568/1087 1088/1832/1088 816/3423/816 +f 1089/958/1089 1090/3569/1090 1088/1832/1088 1087/3568/1087 +f 1084/505/1084 1083/3565/1083 1088/1832/1088 1090/3569/1090 +f 802/921/802 816/3423/816 1088/1832/1088 1083/3565/1083 +f 1057/91/1057 1080/3564/1080 1091/1833/1091 1092/3571/1092 +f 1077/957/1077 1093/3570/1093 1091/1833/1091 1080/3564/1080 +f 1084/505/1084 1090/3569/1090 1091/1833/1091 1093/3570/1093 +f 1089/958/1089 1092/3571/1092 1091/1833/1091 1090/3569/1090 +f 1073/123/1073 1094/3572/1094 1095/1834/1095 1074/3560/1074 +f 1086/959/1086 1085/3566/1085 1095/1834/1095 1094/3572/1094 +f 1084/505/1084 1093/3570/1093 1095/1834/1095 1085/3566/1085 +f 1077/957/1077 1074/3560/1074 1095/1834/1095 1093/3570/1093 +f 815/42/815 871/3456/871 1096/1835/1096 1087/3568/1087 +f 868/931/868 1097/3573/1097 1096/1835/1096 871/3456/871 +f 1098/506/1098 1099/3574/1099 1096/1835/1096 1097/3573/1097 +f 1089/958/1089 1087/3568/1087 1096/1835/1096 1099/3574/1099 +f 46/79/46 49/3019/49 1100/1836/1100 865/3451/865 +f 54/806/54 1101/3575/1101 1100/1836/1100 49/3019/49 +f 1098/506/1098 1097/3573/1097 1100/1836/1100 1101/3575/1101 +f 868/931/868 865/3451/865 1100/1836/1100 1097/3573/1097 +f 38/122/38 1064/3554/1064 1102/1837/1102 64/3026/64 +f 1061/954/1061 1103/3576/1103 1102/1837/1102 1064/3554/1064 +f 1098/506/1098 1101/3575/1101 1102/1837/1102 1103/3576/1103 +f 54/806/54 64/3026/64 1102/1837/1102 1101/3575/1101 +f 1057/91/1057 1092/3571/1092 1104/1838/1104 1058/3550/1058 +f 1089/958/1089 1099/3574/1099 1104/1838/1104 1092/3571/1092 +f 1098/506/1098 1103/3576/1103 1104/1838/1104 1099/3574/1099 +f 1061/954/1061 1058/3550/1058 1104/1838/1104 1103/3576/1103 +f 127/17/127 1105/3577/1105 1106/1839/1106 128/3058/128 +f 1107/960/1107 1108/3578/1108 1106/1839/1106 1105/3577/1105 +f 1109/507/1109 1110/3579/1110 1106/1839/1106 1108/3578/1108 +f 131/817/131 128/3058/128 1106/1839/1106 1110/3579/1110 +f 1111/22/1111 1112/3580/1112 1113/1840/1113 1114/3582/1114 +f 1115/961/1115 1116/3581/1116 1113/1840/1113 1112/3580/1112 +f 1109/507/1109 1108/3578/1108 1113/1840/1113 1116/3581/1116 +f 1107/960/1107 1114/3582/1114 1113/1840/1113 1108/3578/1108 +f 1117/29/1117 1118/3583/1118 1119/1841/1119 1120/3586/1120 +f 1121/962/1121 1122/3585/1122 1119/1841/1119 1118/3583/1118 +f 1109/507/1109 1116/3581/1116 1119/1841/1119 1122/3585/1122 +f 1115/961/1115 1120/3586/1120 1119/1841/1119 1116/3581/1116 +f 136/37/136 139/3065/139 1123/1842/1123 1124/3587/1124 +f 131/817/131 1110/3579/1110 1123/1842/1123 139/3065/139 +f 1109/507/1109 1122/3585/1122 1123/1842/1123 1110/3579/1110 +f 1121/962/1121 1124/3587/1124 1123/1842/1123 1122/3585/1122 +f 1111/22/1111 1125/3589/1125 1126/1843/1126 1112/3580/1112 +f 1127/964/1127 1128/3590/1128 1126/1843/1126 1125/3589/1125 +f 1129/508/1129 1130/3591/1130 1126/1843/1126 1128/3590/1128 +f 1115/961/1115 1112/3580/1112 1126/1843/1126 1130/3591/1130 +f 1131/39/1131 1132/3592/1132 1133/1844/1133 1134/3594/1134 +f 1135/965/1135 1136/3593/1136 1133/1844/1133 1132/3592/1132 +f 1129/508/1129 1128/3590/1128 1133/1844/1133 1136/3593/1136 +f 1127/964/1127 1134/3594/1134 1133/1844/1133 1128/3590/1128 +f 1137/43/1137 1138/3595/1138 1139/1845/1139 1140/3598/1140 +f 1141/966/1141 1142/3597/1142 1139/1845/1139 1138/3595/1138 +f 1129/508/1129 1136/3593/1136 1139/1845/1139 1142/3597/1142 +f 1135/965/1135 1140/3598/1140 1139/1845/1139 1136/3593/1136 +f 1117/29/1117 1120/3586/1120 1143/1846/1143 1144/3599/1144 +f 1115/961/1115 1130/3591/1130 1143/1846/1143 1120/3586/1120 +f 1129/508/1129 1142/3597/1142 1143/1846/1143 1130/3591/1130 +f 1141/966/1141 1144/3599/1144 1143/1846/1143 1142/3597/1142 +f 1145/228/1145 1146/3601/1146 1147/1847/1147 1148/3604/1148 +f 1149/968/1149 1150/3602/1150 1147/1847/1147 1146/3601/1146 +f 1151/509/1151 1152/3603/1152 1147/1847/1147 1150/3602/1150 +f 1153/970/1153 1148/3604/1148 1147/1847/1147 1152/3603/1152 +f 1154/238/1154 1155/3605/1155 1156/1848/1156 1157/3607/1157 +f 1158/969/1158 1159/3606/1159 1156/1848/1156 1155/3605/1155 +f 1151/509/1151 1150/3602/1150 1156/1848/1156 1159/3606/1159 +f 1149/968/1149 1157/3607/1157 1156/1848/1156 1150/3602/1150 +f 1117/279/1117 1144/3600/1144 1160/1849/1160 1161/3609/1161 +f 1141/967/1141 1162/3608/1162 1160/1849/1160 1144/3600/1144 +f 1151/509/1151 1159/3606/1159 1160/1849/1160 1162/3608/1162 +f 1158/969/1158 1161/3609/1161 1160/1849/1160 1159/3606/1159 +f 1137/293/1137 1163/3610/1163 1164/1850/1164 1138/3596/1138 +f 1153/970/1153 1152/3603/1152 1164/1850/1164 1163/3610/1163 +f 1151/509/1151 1162/3608/1162 1164/1850/1164 1152/3603/1152 +f 1141/967/1141 1138/3596/1138 1164/1850/1164 1162/3608/1162 +f 1154/238/1154 1165/3611/1165 1166/1851/1166 1155/3605/1155 +f 1167/971/1167 1168/3612/1168 1166/1851/1166 1165/3611/1165 +f 1169/510/1169 1170/3613/1170 1166/1851/1166 1168/3612/1168 +f 1158/969/1158 1155/3605/1155 1166/1851/1166 1170/3613/1170 +f 153/12/153 156/3077/156 1171/1852/1171 1172/3615/1172 +f 149/821/149 1173/3614/1173 1171/1852/1171 156/3077/156 +f 1169/510/1169 1168/3612/1168 1171/1852/1171 1173/3614/1173 +f 1167/971/1167 1172/3615/1172 1171/1852/1171 1168/3612/1168 +f 136/299/136 1124/3588/1124 1174/1853/1174 147/3070/147 +f 1121/963/1121 1175/3616/1175 1174/1853/1174 1124/3588/1124 +f 1169/510/1169 1173/3614/1173 1174/1853/1174 1175/3616/1175 +f 149/821/149 147/3070/147 1174/1853/1174 1173/3614/1173 +f 1117/279/1117 1161/3609/1161 1176/1854/1176 1118/3584/1118 +f 1158/969/1158 1170/3613/1170 1176/1854/1176 1161/3609/1161 +f 1169/510/1169 1175/3616/1175 1176/1854/1176 1170/3613/1170 +f 1121/963/1121 1118/3584/1118 1176/1854/1176 1175/3616/1175 +f 153/12/153 1172/3615/1172 1177/1855/1177 355/3181/355 +f 1167/971/1167 1178/3617/1178 1177/1855/1177 1172/3615/1172 +f 1179/511/1179 1180/3618/1180 1177/1855/1177 1178/3617/1178 +f 357/854/357 355/3181/355 1177/1855/1177 1180/3618/1180 +f 1154/238/1154 1181/3619/1181 1182/1856/1182 1165/3611/1165 +f 1183/972/1183 1184/3620/1184 1182/1856/1182 1181/3619/1181 +f 1179/511/1179 1178/3617/1178 1182/1856/1182 1184/3620/1184 +f 1167/971/1167 1165/3611/1165 1182/1856/1182 1178/3617/1178 +f 1185/362/1185 1186/3621/1186 1187/1857/1187 1188/3623/1188 +f 1189/973/1189 1190/3622/1190 1187/1857/1187 1186/3621/1186 +f 1179/511/1179 1184/3620/1184 1187/1857/1187 1190/3622/1190 +f 1183/972/1183 1188/3623/1188 1187/1857/1187 1184/3620/1184 +f 361/13/361 364/3186/364 1191/1858/1191 1192/3624/1192 +f 357/854/357 1180/3618/1180 1191/1858/1191 364/3186/364 +f 1179/511/1179 1190/3622/1190 1191/1858/1191 1180/3618/1180 +f 1189/973/1189 1192/3624/1192 1191/1858/1191 1190/3622/1190 +f 1154/238/1154 1157/3607/1157 1193/1859/1193 1181/3619/1181 +f 1149/968/1149 1194/3625/1194 1193/1859/1193 1157/3607/1157 +f 1195/512/1195 1196/3626/1196 1193/1859/1193 1194/3625/1194 +f 1183/972/1183 1181/3619/1181 1193/1859/1193 1196/3626/1196 +f 1145/228/1145 1197/3627/1197 1198/1860/1198 1146/3601/1146 +f 1199/974/1199 1200/3628/1200 1198/1860/1198 1197/3627/1197 +f 1195/512/1195 1194/3625/1194 1198/1860/1198 1200/3628/1200 +f 1149/968/1149 1146/3601/1146 1198/1860/1198 1194/3625/1194 +f 1201/369/1201 1202/3629/1202 1203/1861/1203 1204/3631/1204 +f 1205/975/1205 1206/3630/1206 1203/1861/1203 1202/3629/1202 +f 1195/512/1195 1200/3628/1200 1203/1861/1203 1206/3630/1206 +f 1199/974/1199 1204/3631/1204 1203/1861/1203 1200/3628/1200 +f 1185/362/1185 1188/3623/1188 1207/1862/1207 1208/3632/1208 +f 1183/972/1183 1196/3626/1196 1207/1862/1207 1188/3623/1188 +f 1195/512/1195 1206/3630/1206 1207/1862/1207 1196/3626/1196 +f 1205/975/1205 1208/3632/1208 1207/1862/1207 1206/3630/1206 +f 576/128/576 579/3302/579 1209/1863/1209 1210/3635/1210 +f 572/886/572 1211/3633/1211 1209/1863/1209 579/3302/579 +f 1212/513/1212 1213/3634/1213 1209/1863/1209 1211/3633/1211 +f 1214/977/1214 1210/3635/1210 1209/1863/1209 1213/3634/1213 +f 559/127/559 1215/3636/1215 1216/1864/1216 570/3297/570 +f 1217/976/1217 1218/3637/1218 1216/1864/1216 1215/3636/1215 +f 1212/513/1212 1211/3633/1211 1216/1864/1216 1218/3637/1218 +f 572/886/572 570/3297/570 1216/1864/1216 1211/3633/1211 +f 1185/362/1185 1208/3632/1208 1219/1865/1219 1220/3639/1220 +f 1205/975/1205 1221/3638/1221 1219/1865/1219 1208/3632/1208 +f 1212/513/1212 1218/3637/1218 1219/1865/1219 1221/3638/1221 +f 1217/976/1217 1220/3639/1220 1219/1865/1219 1218/3637/1218 +f 1201/369/1201 1222/3640/1222 1223/1866/1223 1202/3629/1202 +f 1214/977/1214 1213/3634/1213 1223/1866/1223 1222/3640/1222 +f 1212/513/1212 1221/3638/1221 1223/1866/1223 1213/3634/1213 +f 1205/975/1205 1202/3629/1202 1223/1866/1223 1221/3638/1221 +f 559/127/559 562/3293/562 1224/1867/1224 1215/3636/1215 +f 554/883/554 1225/3641/1225 1224/1867/1224 562/3293/562 +f 1226/514/1226 1227/3642/1227 1224/1867/1224 1225/3641/1225 +f 1217/976/1217 1215/3636/1215 1224/1867/1224 1227/3642/1227 +f 377/16/377 380/3194/380 1228/1868/1228 551/3287/551 +f 373/856/373 1229/3643/1229 1228/1868/1228 380/3194/380 +f 1226/514/1226 1225/3641/1225 1228/1868/1228 1229/3643/1229 +f 554/883/554 551/3287/551 1228/1868/1228 1225/3641/1225 +f 361/13/361 1192/3624/1192 1230/1869/1230 371/3189/371 +f 1189/973/1189 1231/3644/1231 1230/1869/1230 1192/3624/1192 +f 1226/514/1226 1229/3643/1229 1230/1869/1230 1231/3644/1231 +f 373/856/373 371/3189/371 1230/1869/1230 1229/3643/1229 +f 1185/362/1185 1220/3639/1220 1232/1870/1232 1186/3621/1186 +f 1217/976/1217 1227/3642/1227 1232/1870/1232 1220/3639/1220 +f 1226/514/1226 1231/3644/1231 1232/1870/1232 1227/3642/1227 +f 1189/973/1189 1186/3621/1186 1232/1870/1232 1231/3644/1231 +f 419/51/419 1233/3645/1233 1234/1871/1234 420/3214/420 +f 1235/978/1235 1236/3646/1236 1234/1871/1234 1233/3645/1233 +f 1237/515/1237 1238/3647/1238 1234/1871/1234 1236/3646/1236 +f 423/863/423 420/3214/420 1234/1871/1234 1238/3647/1238 +f 1239/66/1239 1240/3648/1240 1241/1872/1241 1242/3650/1242 +f 1243/979/1243 1244/3649/1244 1241/1872/1241 1240/3648/1240 +f 1237/515/1237 1236/3646/1236 1241/1872/1241 1244/3649/1244 +f 1235/978/1235 1242/3650/1242 1241/1872/1241 1236/3646/1236 +f 1245/73/1245 1246/3651/1246 1247/1873/1247 1248/3653/1248 +f 1249/980/1249 1250/3652/1250 1247/1873/1247 1246/3651/1246 +f 1237/515/1237 1244/3649/1244 1247/1873/1247 1250/3652/1250 +f 1243/979/1243 1248/3653/1248 1247/1873/1247 1244/3649/1244 +f 428/82/428 431/3221/431 1251/1874/1251 1252/3654/1252 +f 423/863/423 1238/3647/1238 1251/1874/1251 431/3221/431 +f 1237/515/1237 1250/3652/1250 1251/1874/1251 1238/3647/1238 +f 1249/980/1249 1252/3654/1252 1251/1874/1251 1250/3652/1250 +f 1239/66/1239 1253/3655/1253 1254/1875/1254 1240/3648/1240 +f 1255/981/1255 1256/3656/1256 1254/1875/1254 1253/3655/1253 +f 1257/516/1257 1258/3657/1258 1254/1875/1254 1256/3656/1256 +f 1243/979/1243 1240/3648/1240 1254/1875/1254 1258/3657/1258 +f 1259/85/1259 1260/3658/1260 1261/1876/1261 1262/3660/1262 +f 1263/982/1263 1264/3659/1264 1261/1876/1261 1260/3658/1260 +f 1257/516/1257 1256/3656/1256 1261/1876/1261 1264/3659/1264 +f 1255/981/1255 1262/3660/1262 1261/1876/1261 1256/3656/1256 +f 1265/87/1265 1266/3661/1266 1267/1877/1267 1268/3663/1268 +f 1269/983/1269 1270/3662/1270 1267/1877/1267 1266/3661/1266 +f 1257/516/1257 1264/3659/1264 1267/1877/1267 1270/3662/1270 +f 1263/982/1263 1268/3663/1268 1267/1877/1267 1264/3659/1264 +f 1245/73/1245 1248/3653/1248 1271/1878/1271 1272/3664/1272 +f 1243/979/1243 1258/3657/1258 1271/1878/1271 1248/3653/1248 +f 1257/516/1257 1270/3662/1270 1271/1878/1271 1258/3657/1258 +f 1269/983/1269 1272/3664/1272 1271/1878/1271 1270/3662/1270 +f 1131/39/1131 1134/3594/1134 1273/1879/1273 1274/3667/1274 +f 1127/964/1127 1275/3665/1275 1273/1879/1273 1134/3594/1134 +f 1276/517/1276 1277/3666/1277 1273/1879/1273 1275/3665/1275 +f 1278/985/1278 1274/3667/1274 1273/1879/1273 1277/3666/1277 +f 1111/22/1111 1279/3668/1279 1280/1880/1280 1125/3589/1125 +f 1281/984/1281 1282/3669/1282 1280/1880/1280 1279/3668/1279 +f 1276/517/1276 1275/3665/1275 1280/1880/1280 1282/3669/1282 +f 1127/964/1127 1125/3589/1125 1280/1880/1280 1275/3665/1275 +f 1245/73/1245 1272/3664/1272 1283/1881/1283 1284/3671/1284 +f 1269/983/1269 1285/3670/1285 1283/1881/1283 1272/3664/1272 +f 1276/517/1276 1282/3669/1282 1283/1881/1283 1285/3670/1285 +f 1281/984/1281 1284/3671/1284 1283/1881/1283 1282/3669/1282 +f 1265/87/1265 1286/3672/1286 1287/1882/1287 1266/3661/1266 +f 1278/985/1278 1277/3666/1277 1287/1882/1287 1286/3672/1286 +f 1276/517/1276 1285/3670/1285 1287/1882/1287 1277/3666/1277 +f 1269/983/1269 1266/3661/1266 1287/1882/1287 1285/3670/1285 +f 1111/22/1111 1114/3582/1114 1288/1883/1288 1279/3668/1279 +f 1107/960/1107 1289/3673/1289 1288/1883/1288 1114/3582/1114 +f 1290/518/1290 1291/3674/1291 1288/1883/1288 1289/3673/1289 +f 1281/984/1281 1279/3668/1279 1288/1883/1288 1291/3674/1291 +f 127/17/127 446/3231/446 1292/1884/1292 1105/3577/1105 +f 441/867/441 1293/3675/1293 1292/1884/1292 446/3231/446 +f 1290/518/1290 1289/3673/1289 1292/1884/1292 1293/3675/1293 +f 1107/960/1107 1105/3577/1105 1292/1884/1292 1289/3673/1289 +f 428/82/428 1252/3654/1252 1294/1885/1294 439/3226/439 +f 1249/980/1249 1295/3676/1295 1294/1885/1294 1252/3654/1252 +f 1290/518/1290 1293/3675/1293 1294/1885/1294 1295/3676/1295 +f 441/867/441 439/3226/439 1294/1885/1294 1293/3675/1293 +f 1245/73/1245 1284/3671/1284 1296/1886/1296 1246/3651/1246 +f 1281/984/1281 1291/3674/1291 1296/1886/1296 1284/3671/1284 +f 1290/518/1290 1295/3676/1295 1296/1886/1296 1291/3674/1291 +f 1249/980/1249 1246/3651/1246 1296/1886/1296 1295/3676/1295 +f 32/5/32 35/3009/35 1297/1887/1297 538/3278/538 +f 28/799/28 1298/3677/1298 1297/1887/1297 35/3009/35 +f 1299/519/1299 1300/3678/1300 1297/1887/1297 1298/3677/1298 +f 541/881/541 538/3278/538 1297/1887/1297 1300/3678/1300 +f 10/2/10 1301/3679/1301 1302/1888/1302 26/3003/26 +f 1303/986/1303 1304/3680/1304 1302/1888/1302 1301/3679/1301 +f 1299/519/1299 1298/3677/1298 1302/1888/1302 1304/3680/1304 +f 28/799/28 26/3003/26 1302/1888/1302 1298/3677/1298 +f 1305/196/1305 1306/3681/1306 1307/1889/1307 1308/3684/1308 +f 1309/987/1309 1310/3683/1310 1307/1889/1307 1306/3681/1306 +f 1299/519/1299 1304/3680/1304 1307/1889/1307 1310/3683/1310 +f 1303/986/1303 1308/3684/1308 1307/1889/1307 1304/3680/1304 +f 543/198/543 546/3285/546 1311/1890/1311 1312/3685/1312 +f 541/881/541 1300/3678/1300 1311/1890/1311 546/3285/546 +f 1299/519/1299 1310/3683/1310 1311/1890/1311 1300/3678/1300 +f 1309/987/1309 1312/3685/1312 1311/1890/1311 1310/3683/1310 +f 10/2/10 13/2997/13 1313/1891/1313 1301/3679/1301 +f 5/795/5 1314/3687/1314 1313/1891/1313 13/2997/13 +f 1315/520/1315 1316/3688/1316 1313/1891/1313 1314/3687/1314 +f 1303/986/1303 1301/3679/1301 1313/1891/1313 1316/3688/1316 +f 1/1/1 1044/3543/1044 1317/1892/1317 2/2991/2 +f 1039/951/1039 1318/3689/1318 1317/1892/1317 1044/3543/1044 +f 1315/520/1315 1314/3687/1314 1317/1892/1317 1318/3689/1318 +f 5/795/5 2/2991/2 1317/1892/1317 1314/3687/1314 +f 1027/191/1027 1319/3690/1319 1320/1893/1320 1037/3539/1037 +f 1321/989/1321 1322/3691/1322 1320/1893/1320 1319/3690/1319 +f 1315/520/1315 1318/3689/1318 1320/1893/1320 1322/3691/1322 +f 1039/951/1039 1037/3539/1037 1320/1893/1320 1318/3689/1318 +f 1305/196/1305 1308/3684/1308 1323/1894/1323 1324/3692/1324 +f 1303/986/1303 1316/3688/1316 1323/1894/1323 1308/3684/1308 +f 1315/520/1315 1322/3691/1322 1323/1894/1323 1316/3688/1316 +f 1321/989/1321 1324/3692/1324 1323/1894/1323 1322/3691/1322 +f 315/54/315 318/3160/318 1325/1895/1325 1021/3531/1021 +f 323/850/323 1326/3693/1326 1325/1895/1325 318/3160/318 +f 1327/521/1327 1328/3694/1328 1325/1895/1325 1326/3693/1326 +f 1023/949/1023 1021/3531/1021 1325/1895/1325 1328/3694/1328 +f 336/57/336 1329/3695/1329 1330/1896/1330 337/3168/337 +f 1331/990/1331 1332/3697/1332 1330/1896/1330 1329/3695/1329 +f 1327/521/1327 1326/3693/1326 1330/1896/1330 1332/3697/1332 +f 323/850/323 337/3168/337 1330/1896/1330 1326/3693/1326 +f 1305/196/1305 1324/3692/1324 1333/1897/1333 1334/3699/1334 +f 1321/989/1321 1335/3698/1335 1333/1897/1333 1324/3692/1324 +f 1327/521/1327 1332/3697/1332 1333/1897/1333 1335/3698/1335 +f 1331/990/1331 1334/3699/1334 1333/1897/1333 1332/3697/1332 +f 1027/191/1027 1030/3536/1030 1336/1898/1336 1319/3690/1319 +f 1023/949/1023 1328/3694/1328 1336/1898/1336 1030/3536/1030 +f 1327/521/1327 1335/3698/1335 1336/1898/1336 1328/3694/1328 +f 1321/989/1321 1319/3690/1319 1336/1898/1336 1335/3698/1335 +f 336/38/336 384/3196/384 1337/1899/1337 1329/3696/1329 +f 381/857/381 1338/3701/1338 1337/1899/1337 384/3196/384 +f 1339/522/1339 1340/3702/1340 1337/1899/1337 1338/3701/1338 +f 1331/991/1331 1329/3696/1329 1337/1899/1337 1340/3702/1340 +f 377/16/377 553/3290/553 1341/1900/1341 378/3192/378 +f 558/885/558 1342/3703/1342 1341/1900/1341 553/3290/553 +f 1339/522/1339 1338/3701/1338 1341/1900/1341 1342/3703/1342 +f 381/857/381 378/3192/378 1341/1900/1341 1338/3701/1338 +f 543/125/543 1312/3686/1312 1343/1901/1343 568/3296/568 +f 1309/988/1309 1344/3704/1344 1343/1901/1343 1312/3686/1312 +f 1339/522/1339 1342/3703/1342 1343/1901/1343 1344/3704/1344 +f 558/885/558 568/3296/568 1343/1901/1343 1342/3703/1342 +f 1305/370/1305 1334/3700/1334 1345/1902/1345 1306/3682/1306 +f 1331/991/1331 1340/3702/1340 1345/1902/1345 1334/3700/1334 +f 1339/522/1339 1344/3704/1344 1345/1902/1345 1340/3702/1340 +f 1309/988/1309 1306/3682/1306 1345/1902/1345 1344/3704/1344 +f 626/95/626 1346/3705/1346 1347/1903/1347 627/3326/627 +f 1348/992/1348 1349/3706/1349 1347/1903/1347 1346/3705/1346 +f 1350/523/1350 1351/3707/1351 1347/1903/1347 1349/3706/1349 +f 630/895/630 627/3326/627 1347/1903/1347 1351/3707/1351 +f 1352/110/1352 1353/3708/1353 1354/1904/1354 1355/3710/1355 +f 1356/993/1356 1357/3709/1357 1354/1904/1354 1353/3708/1353 +f 1350/523/1350 1349/3706/1349 1354/1904/1354 1357/3709/1357 +f 1348/992/1348 1355/3710/1355 1354/1904/1354 1349/3706/1349 +f 1358/117/1358 1359/3711/1359 1360/1905/1360 1361/3713/1361 +f 1362/994/1362 1363/3712/1363 1360/1905/1360 1359/3711/1359 +f 1350/523/1350 1357/3709/1357 1360/1905/1360 1363/3712/1363 +f 1356/993/1356 1361/3713/1361 1360/1905/1360 1357/3709/1357 +f 635/126/635 638/3333/638 1364/1906/1364 1365/3714/1365 +f 630/895/630 1351/3707/1351 1364/1906/1364 638/3333/638 +f 1350/523/1350 1363/3712/1363 1364/1906/1364 1351/3707/1351 +f 1362/994/1362 1365/3714/1365 1364/1906/1364 1363/3712/1363 +f 1352/110/1352 1366/3715/1366 1367/1907/1367 1353/3708/1353 +f 1368/995/1368 1369/3716/1369 1367/1907/1367 1366/3715/1366 +f 1370/524/1370 1371/3717/1371 1367/1907/1367 1369/3716/1369 +f 1356/993/1356 1353/3708/1353 1367/1907/1367 1371/3717/1371 +f 1372/129/1372 1373/3718/1373 1374/1908/1374 1375/3720/1375 +f 1376/996/1376 1377/3719/1377 1374/1908/1374 1373/3718/1373 +f 1370/524/1370 1369/3716/1369 1374/1908/1374 1377/3719/1377 +f 1368/995/1368 1375/3720/1375 1374/1908/1374 1369/3716/1369 +f 1378/131/1378 1379/3721/1379 1380/1909/1380 1381/3723/1381 +f 1382/997/1382 1383/3722/1383 1380/1909/1380 1379/3721/1379 +f 1370/524/1370 1377/3719/1377 1380/1909/1380 1383/3722/1383 +f 1376/996/1376 1381/3723/1381 1380/1909/1380 1377/3719/1377 +f 1358/117/1358 1361/3713/1361 1384/1910/1384 1385/3724/1385 +f 1356/993/1356 1371/3717/1371 1384/1910/1384 1361/3713/1361 +f 1370/524/1370 1383/3722/1383 1384/1910/1384 1371/3717/1371 +f 1382/997/1382 1385/3724/1385 1384/1910/1384 1383/3722/1383 +f 1259/85/1259 1262/3660/1262 1386/1911/1386 1387/3727/1387 +f 1255/981/1255 1388/3725/1388 1386/1911/1386 1262/3660/1262 +f 1389/525/1389 1390/3726/1390 1386/1911/1386 1388/3725/1388 +f 1391/999/1391 1387/3727/1387 1386/1911/1386 1390/3726/1390 +f 1239/66/1239 1392/3728/1392 1393/1912/1393 1253/3655/1253 +f 1394/998/1394 1395/3729/1395 1393/1912/1393 1392/3728/1392 +f 1389/525/1389 1388/3725/1388 1393/1912/1393 1395/3729/1395 +f 1255/981/1255 1253/3655/1253 1393/1912/1393 1388/3725/1388 +f 1358/117/1358 1385/3724/1385 1396/1913/1396 1397/3731/1397 +f 1382/997/1382 1398/3730/1398 1396/1913/1396 1385/3724/1385 +f 1389/525/1389 1395/3729/1395 1396/1913/1396 1398/3730/1398 +f 1394/998/1394 1397/3731/1397 1396/1913/1396 1395/3729/1395 +f 1378/131/1378 1399/3732/1399 1400/1914/1400 1379/3721/1379 +f 1391/999/1391 1390/3726/1390 1400/1914/1400 1399/3732/1399 +f 1389/525/1389 1398/3730/1398 1400/1914/1400 1390/3726/1390 +f 1382/997/1382 1379/3721/1379 1400/1914/1400 1398/3730/1398 +f 1239/66/1239 1242/3650/1242 1401/1915/1401 1392/3728/1392 +f 1235/978/1235 1402/3733/1402 1401/1915/1401 1242/3650/1242 +f 1403/526/1403 1404/3734/1404 1401/1915/1401 1402/3733/1402 +f 1394/998/1394 1392/3728/1392 1401/1915/1401 1404/3734/1404 +f 419/51/419 653/3343/653 1405/1916/1405 1233/3645/1233 +f 648/899/648 1406/3735/1406 1405/1916/1405 653/3343/653 +f 1403/526/1403 1402/3733/1402 1405/1916/1405 1406/3735/1406 +f 1235/978/1235 1233/3645/1233 1405/1916/1405 1402/3733/1402 +f 635/126/635 1365/3714/1365 1407/1917/1407 646/3338/646 +f 1362/994/1362 1408/3736/1408 1407/1917/1407 1365/3714/1365 +f 1403/526/1403 1406/3735/1406 1407/1917/1407 1408/3736/1408 +f 648/899/648 646/3338/646 1407/1917/1407 1406/3735/1406 +f 1358/117/1358 1397/3731/1397 1409/1918/1409 1359/3711/1359 +f 1394/998/1394 1404/3734/1404 1409/1918/1409 1397/3731/1397 +f 1403/526/1403 1408/3736/1408 1409/1918/1409 1404/3734/1404 +f 1362/994/1362 1359/3711/1359 1409/1918/1409 1408/3736/1408 +f 839/199/839 1410/3737/1410 1411/1919/1411 840/3436/840 +f 1412/1000/1412 1413/3738/1413 1411/1919/1411 1410/3737/1410 +f 1414/527/1414 1415/3739/1415 1411/1919/1411 1413/3738/1413 +f 843/926/843 840/3436/840 1411/1919/1411 1415/3739/1415 +f 1416/200/1416 1417/3740/1417 1418/1920/1418 1419/3742/1419 +f 1420/1001/1420 1421/3741/1421 1418/1920/1418 1417/3740/1417 +f 1414/527/1414 1413/3738/1413 1418/1920/1418 1421/3741/1421 +f 1412/1000/1412 1419/3742/1419 1418/1920/1418 1413/3738/1413 +f 1422/201/1422 1423/3743/1423 1424/1921/1424 1425/3745/1425 +f 1426/1002/1426 1427/3744/1427 1424/1921/1424 1423/3743/1423 +f 1414/527/1414 1421/3741/1421 1424/1921/1424 1427/3744/1427 +f 1420/1001/1420 1425/3745/1425 1424/1921/1424 1421/3741/1421 +f 848/202/848 851/3443/851 1428/1922/1428 1429/3746/1429 +f 843/926/843 1415/3739/1415 1428/1922/1428 851/3443/851 +f 1414/527/1414 1427/3744/1427 1428/1922/1428 1415/3739/1415 +f 1426/1002/1426 1429/3746/1429 1428/1922/1428 1427/3744/1427 +f 1416/200/1416 1430/3747/1430 1431/1923/1431 1417/3740/1417 +f 1432/1003/1432 1433/3748/1433 1431/1923/1431 1430/3747/1430 +f 1434/528/1434 1435/3749/1435 1431/1923/1431 1433/3748/1433 +f 1420/1001/1420 1417/3740/1417 1431/1923/1431 1435/3749/1435 +f 684/86/684 687/3360/687 1436/1924/1436 1437/3751/1437 +f 680/903/680 1438/3750/1438 1436/1924/1436 687/3360/687 +f 1434/528/1434 1433/3748/1433 1436/1924/1436 1438/3750/1438 +f 1432/1003/1432 1437/3751/1437 1436/1924/1436 1433/3748/1433 +f 664/76/664 1439/3752/1439 1440/1925/1440 678/3355/678 +f 1441/1004/1441 1442/3753/1442 1440/1925/1440 1439/3752/1439 +f 1434/528/1434 1438/3750/1438 1440/1925/1440 1442/3753/1442 +f 680/903/680 678/3355/678 1440/1925/1440 1438/3750/1438 +f 1422/201/1422 1425/3745/1425 1443/1926/1443 1444/3754/1444 +f 1420/1001/1420 1435/3749/1435 1443/1926/1443 1425/3745/1425 +f 1434/528/1434 1442/3753/1442 1443/1926/1443 1435/3749/1435 +f 1441/1004/1441 1444/3754/1444 1443/1926/1443 1442/3753/1442 +f 72/9/72 75/3032/75 1445/1927/1445 658/3345/658 +f 68/807/68 1446/3755/1446 1445/1927/1445 75/3032/75 +f 1447/529/1447 1448/3756/1448 1445/1927/1445 1446/3755/1446 +f 660/900/660 658/3345/658 1445/1927/1445 1448/3756/1448 +f 55/8/55 1449/3757/1449 1450/1928/1450 66/3027/66 +f 1451/1005/1451 1452/3758/1452 1450/1928/1450 1449/3757/1449 +f 1447/529/1447 1446/3755/1446 1450/1928/1450 1452/3758/1452 +f 68/807/68 66/3027/66 1450/1928/1450 1446/3755/1446 +f 1422/201/1422 1444/3754/1444 1453/1929/1453 1454/3760/1454 +f 1441/1004/1441 1455/3759/1455 1453/1929/1453 1444/3754/1444 +f 1447/529/1447 1452/3758/1452 1453/1929/1453 1455/3759/1455 +f 1451/1005/1451 1454/3760/1454 1453/1929/1453 1452/3758/1452 +f 664/76/664 667/3350/667 1456/1930/1456 1439/3752/1439 +f 660/900/660 1448/3756/1448 1456/1930/1456 667/3350/667 +f 1447/529/1447 1455/3759/1455 1456/1930/1456 1448/3756/1448 +f 1441/1004/1441 1439/3752/1439 1456/1930/1456 1455/3759/1455 +f 55/8/55 58/3022/58 1457/1931/1457 1449/3757/1449 +f 50/803/50 1458/3761/1458 1457/1931/1457 58/3022/58 +f 1459/530/1459 1460/3762/1460 1457/1931/1457 1458/3761/1458 +f 1451/1005/1451 1449/3757/1449 1457/1931/1457 1460/3762/1460 +f 46/7/46 867/3454/867 1461/1932/1461 47/3015/47 +f 861/930/861 1462/3763/1462 1461/1932/1461 867/3454/867 +f 1459/530/1459 1458/3761/1458 1461/1932/1461 1462/3763/1462 +f 50/803/50 47/3015/47 1461/1932/1461 1458/3761/1458 +f 848/202/848 1429/3746/1429 1463/1933/1463 859/3448/859 +f 1426/1002/1426 1464/3764/1464 1463/1933/1463 1429/3746/1429 +f 1459/530/1459 1462/3763/1462 1463/1933/1463 1464/3764/1464 +f 861/930/861 859/3448/859 1463/1933/1463 1462/3763/1462 +f 1422/201/1422 1454/3760/1454 1465/1934/1465 1423/3743/1423 +f 1451/1005/1451 1460/3762/1460 1465/1934/1465 1454/3760/1454 +f 1459/530/1459 1464/3764/1464 1465/1934/1465 1460/3762/1460 +f 1426/1002/1426 1423/3743/1423 1465/1934/1465 1464/3764/1464 +f 1466/203/1466 1467/3765/1467 1468/1935/1468 1469/3768/1469 +f 1470/1006/1470 1471/3766/1471 1468/1935/1468 1467/3765/1467 +f 1472/531/1472 1473/3767/1473 1468/1935/1468 1471/3766/1471 +f 1474/1009/1474 1469/3768/1469 1468/1935/1468 1473/3767/1473 +f 1475/204/1475 1476/3769/1476 1477/1936/1477 1478/3771/1478 +f 1479/1007/1479 1480/3770/1480 1477/1936/1477 1476/3769/1476 +f 1472/531/1472 1471/3766/1471 1477/1936/1477 1480/3770/1480 +f 1470/1006/1470 1478/3771/1478 1477/1936/1477 1471/3766/1471 +f 1481/205/1481 1482/3772/1482 1483/1937/1483 1484/3774/1484 +f 1485/1008/1485 1486/3773/1486 1483/1937/1483 1482/3772/1482 +f 1472/531/1472 1480/3770/1480 1483/1937/1483 1486/3773/1486 +f 1479/1007/1479 1484/3774/1484 1483/1937/1483 1480/3770/1480 +f 1487/207/1487 1488/3775/1488 1489/1938/1489 1490/3776/1490 +f 1474/1009/1474 1473/3767/1473 1489/1938/1489 1488/3775/1488 +f 1472/531/1472 1486/3773/1486 1489/1938/1489 1473/3767/1473 +f 1485/1008/1485 1490/3776/1490 1489/1938/1489 1486/3773/1486 +f 1475/204/1475 1491/3777/1491 1492/1939/1492 1476/3769/1476 +f 1493/1010/1493 1494/3778/1494 1492/1939/1492 1491/3777/1491 +f 1495/532/1495 1496/3779/1496 1492/1939/1492 1494/3778/1494 +f 1479/1007/1479 1476/3769/1476 1492/1939/1492 1496/3779/1496 +f 1497/208/1497 1498/3780/1498 1499/1940/1499 1500/3782/1500 +f 1501/1011/1501 1502/3781/1502 1499/1940/1499 1498/3780/1498 +f 1495/532/1495 1494/3778/1494 1499/1940/1499 1502/3781/1502 +f 1493/1010/1493 1500/3782/1500 1499/1940/1499 1494/3778/1494 +f 1503/209/1503 1504/3783/1504 1505/1941/1505 1506/3785/1506 +f 1507/1012/1507 1508/3784/1508 1505/1941/1505 1504/3783/1504 +f 1495/532/1495 1502/3781/1502 1505/1941/1505 1508/3784/1508 +f 1501/1011/1501 1506/3785/1506 1505/1941/1505 1502/3781/1502 +f 1481/205/1481 1484/3774/1484 1509/1942/1509 1510/3786/1510 +f 1479/1007/1479 1496/3779/1496 1509/1942/1509 1484/3774/1484 +f 1495/532/1495 1508/3784/1508 1509/1942/1509 1496/3779/1496 +f 1507/1012/1507 1510/3786/1510 1509/1942/1509 1508/3784/1508 +f 1511/211/1511 1512/3787/1512 1513/1943/1513 1514/3791/1514 +f 1515/1013/1515 1516/3789/1516 1513/1943/1513 1512/3787/1512 +f 1517/533/1517 1518/3790/1518 1513/1943/1513 1516/3789/1516 +f 1519/1016/1519 1514/3791/1514 1513/1943/1513 1518/3790/1518 +f 1520/212/1520 1521/3792/1521 1522/1944/1522 1523/3794/1523 +f 1524/1015/1524 1525/3793/1525 1522/1944/1522 1521/3792/1521 +f 1517/533/1517 1516/3789/1516 1522/1944/1522 1525/3793/1525 +f 1515/1013/1515 1523/3794/1523 1522/1944/1522 1516/3789/1516 +f 1481/205/1481 1510/3786/1510 1526/1945/1526 1527/3797/1527 +f 1507/1012/1507 1528/3796/1528 1526/1945/1526 1510/3786/1510 +f 1517/533/1517 1525/3793/1525 1526/1945/1526 1528/3796/1528 +f 1524/1015/1524 1527/3797/1527 1526/1945/1526 1525/3793/1525 +f 1503/209/1503 1529/3798/1529 1530/1946/1530 1504/3783/1504 +f 1519/1016/1519 1518/3790/1518 1530/1946/1530 1529/3798/1529 +f 1517/533/1517 1528/3796/1528 1530/1946/1530 1518/3790/1518 +f 1507/1012/1507 1504/3783/1504 1530/1946/1530 1528/3796/1528 +f 1520/212/1520 1531/3799/1531 1532/1947/1532 1521/3792/1521 +f 1533/1017/1533 1534/3801/1534 1532/1947/1532 1531/3799/1531 +f 1535/534/1535 1536/3802/1536 1532/1947/1532 1534/3801/1534 +f 1524/1015/1524 1521/3792/1521 1532/1947/1532 1536/3802/1536 +f 1537/213/1537 1538/3803/1538 1539/1948/1539 1540/3805/1540 +f 1541/1019/1541 1542/3804/1542 1539/1948/1539 1538/3803/1538 +f 1535/534/1535 1534/3801/1534 1539/1948/1539 1542/3804/1542 +f 1533/1017/1533 1540/3805/1540 1539/1948/1539 1534/3801/1534 +f 1487/207/1487 1490/3776/1490 1543/1949/1543 1544/3808/1544 +f 1485/1008/1485 1545/3807/1545 1543/1949/1543 1490/3776/1490 +f 1535/534/1535 1542/3804/1542 1543/1949/1543 1545/3807/1545 +f 1541/1019/1541 1544/3808/1544 1543/1949/1543 1542/3804/1542 +f 1481/205/1481 1527/3797/1527 1546/1950/1546 1482/3772/1482 +f 1524/1015/1524 1536/3802/1536 1546/1950/1546 1527/3797/1527 +f 1535/534/1535 1545/3807/1545 1546/1950/1546 1536/3802/1536 +f 1485/1008/1485 1482/3772/1482 1546/1950/1546 1545/3807/1545 +f 1547/218/1547 1548/3809/1548 1549/1951/1549 1550/3812/1550 +f 1551/1020/1551 1552/3810/1552 1549/1951/1549 1548/3809/1548 +f 1553/535/1553 1554/3811/1554 1549/1951/1549 1552/3810/1552 +f 1555/1023/1555 1550/3812/1550 1549/1951/1549 1554/3811/1554 +f 1556/220/1556 1557/3813/1557 1558/1952/1558 1559/3815/1559 +f 1560/1021/1560 1561/3814/1561 1558/1952/1558 1557/3813/1557 +f 1553/535/1553 1552/3810/1552 1558/1952/1558 1561/3814/1561 +f 1551/1020/1551 1559/3815/1559 1558/1952/1558 1552/3810/1552 +f 1562/265/1562 1563/3816/1563 1564/1953/1564 1565/3818/1565 +f 1566/1022/1566 1567/3817/1567 1564/1953/1564 1563/3816/1563 +f 1553/535/1553 1561/3814/1561 1564/1953/1564 1567/3817/1567 +f 1560/1021/1560 1565/3818/1565 1564/1953/1564 1561/3814/1561 +f 1568/266/1568 1569/3819/1569 1570/1954/1570 1571/3820/1571 +f 1555/1023/1555 1554/3811/1554 1570/1954/1570 1569/3819/1569 +f 1553/535/1553 1567/3817/1567 1570/1954/1570 1554/3811/1554 +f 1566/1022/1566 1571/3820/1571 1570/1954/1570 1567/3817/1567 +f 1556/220/1556 1572/3821/1572 1573/1955/1573 1557/3813/1557 +f 1574/1024/1574 1575/3823/1575 1573/1955/1573 1572/3821/1572 +f 1576/536/1576 1577/3824/1577 1573/1955/1573 1575/3823/1575 +f 1560/1021/1560 1557/3813/1557 1573/1955/1573 1577/3824/1577 +f 1578/267/1578 1579/3825/1579 1580/1956/1580 1581/3828/1581 +f 1582/1026/1582 1583/3827/1583 1580/1956/1580 1579/3825/1579 +f 1576/536/1576 1575/3823/1575 1580/1956/1580 1583/3827/1583 +f 1574/1024/1574 1581/3828/1581 1580/1956/1580 1575/3823/1575 +f 1584/268/1584 1585/3830/1585 1586/1957/1586 1587/3832/1587 +f 1588/1028/1588 1589/3831/1589 1586/1957/1586 1585/3830/1585 +f 1576/536/1576 1583/3827/1583 1586/1957/1586 1589/3831/1589 +f 1582/1026/1582 1587/3832/1587 1586/1957/1586 1583/3827/1583 +f 1562/265/1562 1565/3818/1565 1590/1958/1590 1591/3834/1591 +f 1560/1021/1560 1577/3824/1577 1590/1958/1590 1565/3818/1565 +f 1576/536/1576 1589/3831/1589 1590/1958/1590 1577/3824/1577 +f 1588/1028/1588 1591/3834/1591 1590/1958/1590 1589/3831/1589 +f 1592/269/1592 1593/3835/1593 1594/1959/1594 1595/3838/1595 +f 1596/1029/1596 1597/3836/1597 1594/1959/1594 1593/3835/1593 +f 1598/537/1598 1599/3837/1599 1594/1959/1594 1597/3836/1597 +f 1600/1031/1600 1595/3838/1595 1594/1959/1594 1599/3837/1599 +f 1601/270/1601 1602/3840/1602 1603/1960/1603 1604/3842/1604 +f 1605/1030/1605 1606/3841/1606 1603/1960/1603 1602/3840/1602 +f 1598/537/1598 1597/3836/1597 1603/1960/1603 1606/3841/1606 +f 1596/1029/1596 1604/3842/1604 1603/1960/1603 1597/3836/1597 +f 1562/265/1562 1591/3834/1591 1607/1961/1607 1608/3844/1608 +f 1588/1028/1588 1609/3843/1609 1607/1961/1607 1591/3834/1591 +f 1598/537/1598 1606/3841/1606 1607/1961/1607 1609/3843/1609 +f 1605/1030/1605 1608/3844/1608 1607/1961/1607 1606/3841/1606 +f 1584/268/1584 1610/3845/1610 1611/1962/1611 1585/3830/1585 +f 1600/1031/1600 1599/3837/1599 1611/1962/1611 1610/3845/1610 +f 1598/537/1598 1609/3843/1609 1611/1962/1611 1599/3837/1599 +f 1588/1028/1588 1585/3830/1585 1611/1962/1611 1609/3843/1609 +f 1601/270/1601 1612/3847/1612 1613/1963/1613 1602/3840/1602 +f 1614/1033/1614 1615/3848/1615 1613/1963/1613 1612/3847/1612 +f 1616/538/1616 1617/3849/1617 1613/1963/1613 1615/3848/1615 +f 1605/1030/1605 1602/3840/1602 1613/1963/1613 1617/3849/1617 +f 1618/271/1618 1619/3850/1619 1620/1964/1620 1621/3852/1621 +f 1622/1034/1622 1623/3851/1623 1620/1964/1620 1619/3850/1619 +f 1616/538/1616 1615/3848/1615 1620/1964/1620 1623/3851/1623 +f 1614/1033/1614 1621/3852/1621 1620/1964/1620 1615/3848/1615 +f 1568/266/1568 1571/3820/1571 1624/1965/1624 1625/3854/1625 +f 1566/1022/1566 1626/3853/1626 1624/1965/1624 1571/3820/1571 +f 1616/538/1616 1623/3851/1623 1624/1965/1624 1626/3853/1626 +f 1622/1034/1622 1625/3854/1625 1624/1965/1624 1623/3851/1623 +f 1562/265/1562 1608/3844/1608 1627/1966/1627 1563/3816/1563 +f 1605/1030/1605 1617/3849/1617 1627/1966/1627 1608/3844/1608 +f 1616/538/1616 1626/3853/1626 1627/1966/1627 1617/3849/1617 +f 1566/1022/1566 1563/3816/1563 1627/1966/1627 1626/3853/1626 +f 1497/208/1497 1500/3782/1500 1628/1967/1628 1629/3857/1629 +f 1493/1010/1493 1630/3855/1630 1628/1967/1628 1500/3782/1500 +f 1631/539/1631 1632/3856/1632 1628/1967/1628 1630/3855/1630 +f 1633/1037/1633 1629/3857/1629 1628/1967/1628 1632/3856/1632 +f 1475/204/1475 1634/3858/1634 1635/1968/1635 1491/3777/1491 +f 1636/1035/1636 1637/3859/1637 1635/1968/1635 1634/3858/1634 +f 1631/539/1631 1630/3855/1630 1635/1968/1635 1637/3859/1637 +f 1493/1010/1493 1491/3777/1491 1635/1968/1635 1630/3855/1630 +f 1638/272/1638 1639/3860/1639 1640/1969/1640 1641/3862/1641 +f 1642/1036/1642 1643/3861/1643 1640/1969/1640 1639/3860/1639 +f 1631/539/1631 1637/3859/1637 1640/1969/1640 1643/3861/1643 +f 1636/1035/1636 1641/3862/1641 1640/1969/1640 1637/3859/1637 +f 1644/273/1644 1645/3863/1645 1646/1970/1646 1647/3864/1647 +f 1633/1037/1633 1632/3856/1632 1646/1970/1646 1645/3863/1645 +f 1631/539/1631 1643/3861/1643 1646/1970/1646 1632/3856/1632 +f 1642/1036/1642 1647/3864/1647 1646/1970/1646 1643/3861/1643 +f 1475/204/1475 1478/3771/1478 1648/1971/1648 1634/3858/1634 +f 1470/1006/1470 1649/3865/1649 1648/1971/1648 1478/3771/1478 +f 1650/540/1650 1651/3866/1651 1648/1971/1648 1649/3865/1649 +f 1636/1035/1636 1634/3858/1634 1648/1971/1648 1651/3866/1651 +f 1466/203/1466 1652/3867/1652 1653/1972/1653 1467/3765/1467 +f 1654/1038/1654 1655/3868/1655 1653/1972/1653 1652/3867/1652 +f 1650/540/1650 1649/3865/1649 1653/1972/1653 1655/3868/1655 +f 1470/1006/1470 1467/3765/1467 1653/1972/1653 1649/3865/1649 +f 1656/274/1656 1657/3869/1657 1658/1973/1658 1659/3871/1659 +f 1660/1039/1660 1661/3870/1661 1658/1973/1658 1657/3869/1657 +f 1650/540/1650 1655/3868/1655 1658/1973/1658 1661/3870/1661 +f 1654/1038/1654 1659/3871/1659 1658/1973/1658 1655/3868/1655 +f 1638/272/1638 1641/3862/1641 1662/1974/1662 1663/3872/1663 +f 1636/1035/1636 1651/3866/1651 1662/1974/1662 1641/3862/1641 +f 1650/540/1650 1661/3870/1661 1662/1974/1662 1651/3866/1651 +f 1660/1039/1660 1663/3872/1663 1662/1974/1662 1661/3870/1661 +f 1664/275/1664 1665/3873/1665 1666/1975/1666 1667/3876/1667 +f 1668/1040/1668 1669/3874/1669 1666/1975/1666 1665/3873/1665 +f 1670/541/1670 1671/3875/1671 1666/1975/1666 1669/3874/1669 +f 1672/1042/1672 1667/3876/1667 1666/1975/1666 1671/3875/1671 +f 1673/276/1673 1674/3877/1674 1675/1976/1675 1676/3879/1676 +f 1677/1041/1677 1678/3878/1678 1675/1976/1675 1674/3877/1674 +f 1670/541/1670 1669/3874/1669 1675/1976/1675 1678/3878/1678 +f 1668/1040/1668 1676/3879/1676 1675/1976/1675 1669/3874/1669 +f 1638/272/1638 1663/3872/1663 1679/1977/1679 1680/3881/1680 +f 1660/1039/1660 1681/3880/1681 1679/1977/1679 1663/3872/1663 +f 1670/541/1670 1678/3878/1678 1679/1977/1679 1681/3880/1681 +f 1677/1041/1677 1680/3881/1680 1679/1977/1679 1678/3878/1678 +f 1656/274/1656 1682/3882/1682 1683/1978/1683 1657/3869/1657 +f 1672/1042/1672 1671/3875/1671 1683/1978/1683 1682/3882/1682 +f 1670/541/1670 1681/3880/1681 1683/1978/1683 1671/3875/1671 +f 1660/1039/1660 1657/3869/1657 1683/1978/1683 1681/3880/1681 +f 1673/276/1673 1684/3883/1684 1685/1979/1685 1674/3877/1674 +f 1686/1043/1686 1687/3884/1687 1685/1979/1685 1684/3883/1684 +f 1688/542/1688 1689/3885/1689 1685/1979/1685 1687/3884/1687 +f 1677/1041/1677 1674/3877/1674 1685/1979/1685 1689/3885/1689 +f 1690/277/1690 1691/3886/1691 1692/1980/1692 1693/3888/1693 +f 1694/1044/1694 1695/3887/1695 1692/1980/1692 1691/3886/1691 +f 1688/542/1688 1687/3884/1687 1692/1980/1692 1695/3887/1695 +f 1686/1043/1686 1693/3888/1693 1692/1980/1692 1687/3884/1687 +f 1644/273/1644 1647/3864/1647 1696/1981/1696 1697/3890/1697 +f 1642/1036/1642 1698/3889/1698 1696/1981/1696 1647/3864/1647 +f 1688/542/1688 1695/3887/1695 1696/1981/1696 1698/3889/1698 +f 1694/1044/1694 1697/3890/1697 1696/1981/1696 1695/3887/1695 +f 1638/272/1638 1680/3881/1680 1699/1982/1699 1639/3860/1639 +f 1677/1041/1677 1689/3885/1689 1699/1982/1699 1680/3881/1680 +f 1688/542/1688 1698/3889/1698 1699/1982/1699 1689/3885/1689 +f 1642/1036/1642 1639/3860/1639 1699/1982/1699 1698/3889/1698 +f 1700/278/1700 1701/3891/1701 1702/1983/1702 1703/3894/1703 +f 1704/1045/1704 1705/3892/1705 1702/1983/1702 1701/3891/1701 +f 1706/543/1706 1707/3893/1707 1702/1983/1702 1705/3892/1705 +f 1708/1048/1708 1703/3894/1703 1702/1983/1702 1707/3893/1707 +f 1709/281/1709 1710/3895/1710 1711/1984/1711 1712/3897/1712 +f 1713/1046/1713 1714/3896/1714 1711/1984/1711 1710/3895/1710 +f 1706/543/1706 1705/3892/1705 1711/1984/1711 1714/3896/1714 +f 1704/1045/1704 1712/3897/1712 1711/1984/1711 1705/3892/1705 +f 1715/282/1715 1716/3898/1716 1717/1985/1717 1718/3900/1718 +f 1719/1047/1719 1720/3899/1720 1717/1985/1717 1716/3898/1716 +f 1706/543/1706 1714/3896/1714 1717/1985/1717 1720/3899/1720 +f 1713/1046/1713 1718/3900/1718 1717/1985/1717 1714/3896/1714 +f 1721/283/1721 1722/3901/1722 1723/1986/1723 1724/3902/1724 +f 1708/1048/1708 1707/3893/1707 1723/1986/1723 1722/3901/1722 +f 1706/543/1706 1720/3899/1720 1723/1986/1723 1707/3893/1707 +f 1719/1047/1719 1724/3902/1724 1723/1986/1723 1720/3899/1720 +f 1709/281/1709 1725/3903/1725 1726/1987/1726 1710/3895/1710 +f 1727/1049/1727 1728/3904/1728 1726/1987/1726 1725/3903/1725 +f 1729/544/1729 1730/3905/1730 1726/1987/1726 1728/3904/1728 +f 1713/1046/1713 1710/3895/1710 1726/1987/1726 1730/3905/1730 +f 1731/284/1731 1732/3906/1732 1733/1988/1733 1734/3908/1734 +f 1735/1050/1735 1736/3907/1736 1733/1988/1733 1732/3906/1732 +f 1729/544/1729 1728/3904/1728 1733/1988/1733 1736/3907/1736 +f 1727/1049/1727 1734/3908/1734 1733/1988/1733 1728/3904/1728 +f 1737/286/1737 1738/3909/1738 1739/1989/1739 1740/3911/1740 +f 1741/1051/1741 1742/3910/1742 1739/1989/1739 1738/3909/1738 +f 1729/544/1729 1736/3907/1736 1739/1989/1739 1742/3910/1742 +f 1735/1050/1735 1740/3911/1740 1739/1989/1739 1736/3907/1736 +f 1715/282/1715 1718/3900/1718 1743/1990/1743 1744/3912/1744 +f 1713/1046/1713 1730/3905/1730 1743/1990/1743 1718/3900/1718 +f 1729/544/1729 1742/3910/1742 1743/1990/1743 1730/3905/1730 +f 1741/1051/1741 1744/3912/1744 1743/1990/1743 1742/3910/1742 +f 1618/271/1618 1745/3913/1745 1746/1991/1746 1747/3916/1747 +f 1748/1052/1748 1749/3914/1749 1746/1991/1746 1745/3913/1745 +f 1750/545/1750 1751/3915/1751 1746/1991/1746 1749/3914/1749 +f 1752/1054/1752 1747/3916/1747 1746/1991/1746 1751/3915/1751 +f 1753/287/1753 1754/3917/1754 1755/1992/1755 1756/3919/1756 +f 1757/1053/1757 1758/3918/1758 1755/1992/1755 1754/3917/1754 +f 1750/545/1750 1749/3914/1749 1755/1992/1755 1758/3918/1758 +f 1748/1052/1748 1756/3919/1756 1755/1992/1755 1749/3914/1749 +f 1715/282/1715 1744/3912/1744 1759/1993/1759 1760/3921/1760 +f 1741/1051/1741 1761/3920/1761 1759/1993/1759 1744/3912/1744 +f 1750/545/1750 1758/3918/1758 1759/1993/1759 1761/3920/1761 +f 1757/1053/1757 1760/3921/1760 1759/1993/1759 1758/3918/1758 +f 1737/286/1737 1762/3922/1762 1763/1994/1763 1738/3909/1738 +f 1752/1054/1752 1751/3915/1751 1763/1994/1763 1762/3922/1762 +f 1750/545/1750 1761/3920/1761 1763/1994/1763 1751/3915/1751 +f 1741/1051/1741 1738/3909/1738 1763/1994/1763 1761/3920/1761 +f 1753/287/1753 1764/3923/1764 1765/1995/1765 1754/3917/1754 +f 1766/1055/1766 1767/3924/1767 1765/1995/1765 1764/3923/1764 +f 1768/546/1768 1769/3925/1769 1765/1995/1765 1767/3924/1767 +f 1757/1053/1757 1754/3917/1754 1765/1995/1765 1769/3925/1769 +f 1770/288/1770 1771/3926/1771 1772/1996/1772 1773/3928/1773 +f 1774/1056/1774 1775/3927/1775 1772/1996/1772 1771/3926/1771 +f 1768/546/1768 1767/3924/1767 1772/1996/1772 1775/3927/1775 +f 1766/1055/1766 1773/3928/1773 1772/1996/1772 1767/3924/1767 +f 1721/283/1721 1724/3902/1724 1776/1997/1776 1777/3930/1777 +f 1719/1047/1719 1778/3929/1778 1776/1997/1776 1724/3902/1724 +f 1768/546/1768 1775/3927/1775 1776/1997/1776 1778/3929/1778 +f 1774/1056/1774 1777/3930/1777 1776/1997/1776 1775/3927/1775 +f 1715/282/1715 1760/3921/1760 1779/1998/1779 1716/3898/1716 +f 1757/1053/1757 1769/3925/1769 1779/1998/1779 1760/3921/1760 +f 1768/546/1768 1778/3929/1778 1779/1998/1779 1769/3925/1769 +f 1719/1047/1719 1716/3898/1716 1779/1998/1779 1778/3929/1778 +f 1780/289/1780 1781/3931/1781 1782/1999/1782 1783/3934/1783 +f 1784/1057/1784 1785/3932/1785 1782/1999/1782 1781/3931/1781 +f 1786/547/1786 1787/3933/1787 1782/1999/1782 1785/3932/1785 +f 1788/1061/1788 1783/3934/1783 1782/1999/1782 1787/3933/1787 +f 1789/290/1789 1790/3935/1790 1791/2000/1791 1792/3938/1792 +f 1793/1058/1793 1794/3937/1794 1791/2000/1791 1790/3935/1790 +f 1786/547/1786 1785/3932/1785 1791/2000/1791 1794/3937/1794 +f 1784/1057/1784 1792/3938/1792 1791/2000/1791 1785/3932/1785 +f 1795/295/1795 1796/3939/1796 1797/2001/1797 1798/3941/1798 +f 1799/1060/1799 1800/3940/1800 1797/2001/1797 1796/3939/1796 +f 1786/547/1786 1794/3937/1794 1797/2001/1797 1800/3940/1800 +f 1793/1058/1793 1798/3941/1798 1797/2001/1797 1794/3937/1794 +f 1801/296/1801 1802/3943/1802 1803/2002/1803 1804/3944/1804 +f 1788/1061/1788 1787/3933/1787 1803/2002/1803 1802/3943/1802 +f 1786/547/1786 1800/3940/1800 1803/2002/1803 1787/3933/1787 +f 1799/1060/1799 1804/3944/1804 1803/2002/1803 1800/3940/1800 +f 1789/63/1789 1805/3945/1805 1806/2003/1806 1790/3936/1790 +f 1807/1062/1807 1808/3946/1808 1806/2003/1806 1805/3945/1805 +f 1809/548/1809 1810/3947/1810 1806/2003/1806 1808/3946/1808 +f 1793/1059/1793 1790/3936/1790 1806/2003/1806 1810/3947/1810 +f 1811/64/1811 1812/3948/1812 1813/2004/1813 1814/3950/1814 +f 1815/1063/1815 1816/3949/1816 1813/2004/1813 1812/3948/1812 +f 1809/548/1809 1808/3946/1808 1813/2004/1813 1816/3949/1816 +f 1807/1062/1807 1814/3950/1814 1813/2004/1813 1808/3946/1808 +f 1817/69/1817 1818/3951/1818 1819/2005/1819 1820/3953/1820 +f 1821/1064/1821 1822/3952/1822 1819/2005/1819 1818/3951/1818 +f 1809/548/1809 1816/3949/1816 1819/2005/1819 1822/3952/1822 +f 1815/1063/1815 1820/3953/1820 1819/2005/1819 1816/3949/1816 +f 1795/71/1795 1798/3942/1798 1823/2006/1823 1824/3954/1824 +f 1793/1059/1793 1810/3947/1810 1823/2006/1823 1798/3942/1798 +f 1809/548/1809 1822/3952/1822 1823/2006/1823 1810/3947/1810 +f 1821/1064/1821 1824/3954/1824 1823/2006/1823 1822/3952/1822 +f 1578/81/1578 1581/3829/1581 1825/2007/1825 1826/3957/1826 +f 1574/1025/1574 1827/3955/1827 1825/2007/1825 1581/3829/1581 +f 1828/549/1828 1829/3956/1829 1825/2007/1825 1827/3955/1827 +f 1830/1067/1830 1826/3957/1826 1825/2007/1825 1829/3956/1829 +f 1556/83/1556 1831/3958/1831 1832/2008/1832 1572/3822/1572 +f 1833/1065/1833 1834/3960/1834 1832/2008/1832 1831/3958/1831 +f 1828/549/1828 1827/3955/1827 1832/2008/1832 1834/3960/1834 +f 1574/1025/1574 1572/3822/1572 1832/2008/1832 1827/3955/1827 +f 1795/71/1795 1824/3954/1824 1835/2009/1835 1836/3962/1836 +f 1821/1064/1821 1837/3961/1837 1835/2009/1835 1824/3954/1824 +f 1828/549/1828 1834/3960/1834 1835/2009/1835 1837/3961/1837 +f 1833/1065/1833 1836/3962/1836 1835/2009/1835 1834/3960/1834 +f 1817/69/1817 1838/3964/1838 1839/2010/1839 1818/3951/1818 +f 1830/1067/1830 1829/3956/1829 1839/2010/1839 1838/3964/1838 +f 1828/549/1828 1837/3961/1837 1839/2010/1839 1829/3956/1829 +f 1821/1064/1821 1818/3951/1818 1839/2010/1839 1837/3961/1837 +f 1556/220/1556 1559/3815/1559 1840/2011/1840 1831/3959/1831 +f 1551/1020/1551 1841/3965/1841 1840/2011/1840 1559/3815/1559 +f 1842/550/1842 1843/3966/1843 1840/2011/1840 1841/3965/1841 +f 1833/1066/1833 1831/3959/1831 1840/2011/1840 1843/3966/1843 +f 1547/218/1547 1844/3967/1844 1845/2012/1845 1548/3809/1548 +f 1846/1068/1846 1847/3968/1847 1845/2012/1845 1844/3967/1844 +f 1842/550/1842 1841/3965/1841 1845/2012/1845 1847/3968/1847 +f 1551/1020/1551 1548/3809/1548 1845/2012/1845 1841/3965/1841 +f 1801/296/1801 1804/3944/1804 1848/2013/1848 1849/3970/1849 +f 1799/1060/1799 1850/3969/1850 1848/2013/1848 1804/3944/1804 +f 1842/550/1842 1847/3968/1847 1848/2013/1848 1850/3969/1850 +f 1846/1068/1846 1849/3970/1849 1848/2013/1848 1847/3968/1847 +f 1795/295/1795 1836/3963/1836 1851/2014/1851 1796/3939/1796 +f 1833/1066/1833 1843/3966/1843 1851/2014/1851 1836/3963/1836 +f 1842/550/1842 1850/3969/1850 1851/2014/1851 1843/3966/1843 +f 1799/1060/1799 1796/3939/1796 1851/2014/1851 1850/3969/1850 +f 1618/271/1618 1621/3852/1621 1852/2015/1852 1745/3913/1745 +f 1614/1033/1614 1853/3971/1853 1852/2015/1852 1621/3852/1621 +f 1854/551/1854 1855/3972/1855 1852/2015/1852 1853/3971/1853 +f 1748/1052/1748 1745/3913/1745 1852/2015/1852 1855/3972/1855 +f 1601/270/1601 1856/3973/1856 1857/2016/1857 1612/3847/1612 +f 1858/1069/1858 1859/3974/1859 1857/2016/1857 1856/3973/1856 +f 1854/551/1854 1853/3971/1853 1857/2016/1857 1859/3974/1859 +f 1614/1033/1614 1612/3847/1612 1857/2016/1857 1853/3971/1853 +f 1860/301/1860 1861/3975/1861 1862/2017/1862 1863/3977/1863 +f 1864/1070/1864 1865/3976/1865 1862/2017/1862 1861/3975/1861 +f 1854/551/1854 1859/3974/1859 1862/2017/1862 1865/3976/1865 +f 1858/1069/1858 1863/3977/1863 1862/2017/1862 1859/3974/1859 +f 1753/287/1753 1756/3919/1756 1866/2018/1866 1867/3978/1867 +f 1748/1052/1748 1855/3972/1855 1866/2018/1866 1756/3919/1756 +f 1854/551/1854 1865/3976/1865 1866/2018/1866 1855/3972/1855 +f 1864/1070/1864 1867/3978/1867 1866/2018/1866 1865/3976/1865 +f 1601/270/1601 1604/3842/1604 1868/2019/1868 1856/3973/1856 +f 1596/1029/1596 1869/3979/1869 1868/2019/1868 1604/3842/1604 +f 1870/552/1870 1871/3980/1871 1868/2019/1868 1869/3979/1869 +f 1858/1069/1858 1856/3973/1856 1868/2019/1868 1871/3980/1871 +f 1592/269/1592 1872/3981/1872 1873/2020/1873 1593/3835/1593 +f 1874/1071/1874 1875/3983/1875 1873/2020/1873 1872/3981/1872 +f 1870/552/1870 1869/3979/1869 1873/2020/1873 1875/3983/1875 +f 1596/1029/1596 1593/3835/1593 1873/2020/1873 1869/3979/1869 +f 1876/304/1876 1877/3984/1877 1878/2021/1878 1879/3986/1879 +f 1880/1073/1880 1881/3985/1881 1878/2021/1878 1877/3984/1877 +f 1870/552/1870 1875/3983/1875 1878/2021/1878 1881/3985/1881 +f 1874/1071/1874 1879/3986/1879 1878/2021/1878 1875/3983/1875 +f 1860/301/1860 1863/3977/1863 1882/2022/1882 1883/3988/1883 +f 1858/1069/1858 1871/3980/1871 1882/2022/1882 1863/3977/1863 +f 1870/552/1870 1881/3985/1881 1882/2022/1882 1871/3980/1871 +f 1880/1073/1880 1883/3988/1883 1882/2022/1882 1881/3985/1881 +f 1884/306/1884 1885/3989/1885 1886/2023/1886 1887/3992/1887 +f 1888/1074/1888 1889/3990/1889 1886/2023/1886 1885/3989/1885 +f 1890/553/1890 1891/3991/1891 1886/2023/1886 1889/3990/1889 +f 1892/1076/1892 1887/3992/1887 1886/2023/1886 1891/3991/1891 +f 1893/307/1893 1894/3994/1894 1895/2024/1895 1896/3996/1896 +f 1897/1075/1897 1898/3995/1898 1895/2024/1895 1894/3994/1894 +f 1890/553/1890 1889/3990/1889 1895/2024/1895 1898/3995/1898 +f 1888/1074/1888 1896/3996/1896 1895/2024/1895 1889/3990/1889 +f 1860/301/1860 1883/3988/1883 1899/2025/1899 1900/3998/1900 +f 1880/1073/1880 1901/3997/1901 1899/2025/1899 1883/3988/1883 +f 1890/553/1890 1898/3995/1898 1899/2025/1899 1901/3997/1901 +f 1897/1075/1897 1900/3998/1900 1899/2025/1899 1898/3995/1898 +f 1876/304/1876 1902/3999/1902 1903/2026/1903 1877/3984/1877 +f 1892/1076/1892 1891/3991/1891 1903/2026/1903 1902/3999/1902 +f 1890/553/1890 1901/3997/1901 1903/2026/1903 1891/3991/1891 +f 1880/1073/1880 1877/3984/1877 1903/2026/1903 1901/3997/1901 +f 1893/307/1893 1904/4001/1904 1905/2027/1905 1894/3994/1894 +f 1906/1078/1906 1907/4002/1907 1905/2027/1905 1904/4001/1904 +f 1908/554/1908 1909/4003/1909 1905/2027/1905 1907/4002/1907 +f 1897/1075/1897 1894/3994/1894 1905/2027/1905 1909/4003/1909 +f 1770/288/1770 1773/3928/1773 1910/2028/1910 1911/4005/1911 +f 1766/1055/1766 1912/4004/1912 1910/2028/1910 1773/3928/1773 +f 1908/554/1908 1907/4002/1907 1910/2028/1910 1912/4004/1912 +f 1906/1078/1906 1911/4005/1911 1910/2028/1910 1907/4002/1907 +f 1753/287/1753 1867/3978/1867 1913/2029/1913 1764/3923/1764 +f 1864/1070/1864 1914/4006/1914 1913/2029/1913 1867/3978/1867 +f 1908/554/1908 1912/4004/1912 1913/2029/1913 1914/4006/1914 +f 1766/1055/1766 1764/3923/1764 1913/2029/1913 1912/4004/1912 +f 1860/301/1860 1900/3998/1900 1915/2030/1915 1861/3975/1861 +f 1897/1075/1897 1909/4003/1909 1915/2030/1915 1900/3998/1900 +f 1908/554/1908 1914/4006/1914 1915/2030/1915 1909/4003/1909 +f 1864/1070/1864 1861/3975/1861 1915/2030/1915 1914/4006/1914 +f 1618/271/1618 1747/3916/1747 1916/2031/1916 1619/3850/1619 +f 1752/1054/1752 1917/4007/1917 1916/2031/1916 1747/3916/1747 +f 1918/555/1918 1919/4008/1919 1916/2031/1916 1917/4007/1917 +f 1622/1034/1622 1619/3850/1619 1916/2031/1916 1919/4008/1919 +f 1737/286/1737 1920/4009/1920 1921/2032/1921 1762/3922/1762 +f 1922/1079/1922 1923/4010/1923 1921/2032/1921 1920/4009/1920 +f 1918/555/1918 1917/4007/1917 1921/2032/1921 1923/4010/1923 +f 1752/1054/1752 1762/3922/1762 1921/2032/1921 1917/4007/1917 +f 1924/308/1924 1925/4011/1925 1926/2033/1926 1927/4013/1927 +f 1928/1080/1928 1929/4012/1929 1926/2033/1926 1925/4011/1925 +f 1918/555/1918 1923/4010/1923 1926/2033/1926 1929/4012/1929 +f 1922/1079/1922 1927/4013/1927 1926/2033/1926 1923/4010/1923 +f 1568/266/1568 1625/3854/1625 1930/2034/1930 1931/4014/1931 +f 1622/1034/1622 1919/4008/1919 1930/2034/1930 1625/3854/1625 +f 1918/555/1918 1929/4012/1929 1930/2034/1930 1919/4008/1919 +f 1928/1080/1928 1931/4014/1931 1930/2034/1930 1929/4012/1929 +f 1737/286/1737 1740/3911/1740 1932/2035/1932 1920/4009/1920 +f 1735/1050/1735 1933/4015/1933 1932/2035/1932 1740/3911/1740 +f 1934/556/1934 1935/4016/1935 1932/2035/1932 1933/4015/1933 +f 1922/1079/1922 1920/4009/1920 1932/2035/1932 1935/4016/1935 +f 1731/284/1731 1936/4017/1936 1937/2036/1937 1732/3906/1732 +f 1938/1081/1938 1939/4018/1939 1937/2036/1937 1936/4017/1936 +f 1934/556/1934 1933/4015/1933 1937/2036/1937 1939/4018/1939 +f 1735/1050/1735 1732/3906/1732 1937/2036/1937 1933/4015/1933 +f 1940/309/1940 1941/4019/1941 1942/2037/1942 1943/4021/1943 +f 1944/1082/1944 1945/4020/1945 1942/2037/1942 1941/4019/1941 +f 1934/556/1934 1939/4018/1939 1942/2037/1942 1945/4020/1945 +f 1938/1081/1938 1943/4021/1943 1942/2037/1942 1939/4018/1939 +f 1924/308/1924 1927/4013/1927 1946/2038/1946 1947/4022/1947 +f 1922/1079/1922 1935/4016/1935 1946/2038/1946 1927/4013/1927 +f 1934/556/1934 1945/4020/1945 1946/2038/1946 1935/4016/1935 +f 1944/1082/1944 1947/4022/1947 1946/2038/1946 1945/4020/1945 +f 1780/289/1780 1783/3934/1783 1948/2039/1948 1949/4025/1949 +f 1788/1061/1788 1950/4023/1950 1948/2039/1948 1783/3934/1783 +f 1951/557/1951 1952/4024/1952 1948/2039/1948 1950/4023/1950 +f 1953/1084/1953 1949/4025/1949 1948/2039/1948 1952/4024/1952 +f 1801/296/1801 1954/4026/1954 1955/2040/1955 1802/3943/1802 +f 1956/1083/1956 1957/4027/1957 1955/2040/1955 1954/4026/1954 +f 1951/557/1951 1950/4023/1950 1955/2040/1955 1957/4027/1957 +f 1788/1061/1788 1802/3943/1802 1955/2040/1955 1950/4023/1950 +f 1924/308/1924 1947/4022/1947 1958/2041/1958 1959/4029/1959 +f 1944/1082/1944 1960/4028/1960 1958/2041/1958 1947/4022/1947 +f 1951/557/1951 1957/4027/1957 1958/2041/1958 1960/4028/1960 +f 1956/1083/1956 1959/4029/1959 1958/2041/1958 1957/4027/1957 +f 1940/309/1940 1961/4030/1961 1962/2042/1962 1941/4019/1941 +f 1953/1084/1953 1952/4024/1952 1962/2042/1962 1961/4030/1961 +f 1951/557/1951 1960/4028/1960 1962/2042/1962 1952/4024/1952 +f 1944/1082/1944 1941/4019/1941 1962/2042/1962 1960/4028/1960 +f 1801/296/1801 1849/3970/1849 1963/2043/1963 1954/4026/1954 +f 1846/1068/1846 1964/4031/1964 1963/2043/1963 1849/3970/1849 +f 1965/558/1965 1966/4032/1966 1963/2043/1963 1964/4031/1964 +f 1956/1083/1956 1954/4026/1954 1963/2043/1963 1966/4032/1966 +f 1547/218/1547 1550/3812/1550 1967/2044/1967 1844/3967/1844 +f 1555/1023/1555 1968/4033/1968 1967/2044/1967 1550/3812/1550 +f 1965/558/1965 1964/4031/1964 1967/2044/1967 1968/4033/1968 +f 1846/1068/1846 1844/3967/1844 1967/2044/1967 1964/4031/1964 +f 1568/266/1568 1931/4014/1931 1969/2045/1969 1569/3819/1569 +f 1928/1080/1928 1970/4034/1970 1969/2045/1969 1931/4014/1931 +f 1965/558/1965 1968/4033/1968 1969/2045/1969 1970/4034/1970 +f 1555/1023/1555 1569/3819/1569 1969/2045/1969 1968/4033/1968 +f 1924/308/1924 1959/4029/1959 1971/2046/1971 1925/4011/1925 +f 1956/1083/1956 1966/4032/1966 1971/2046/1971 1959/4029/1959 +f 1965/558/1965 1970/4034/1970 1971/2046/1971 1966/4032/1966 +f 1928/1080/1928 1925/4011/1925 1971/2046/1971 1970/4034/1970 +f 1972/84/1972 1973/4035/1973 1974/2047/1974 1975/4038/1975 +f 1976/1085/1976 1977/4036/1977 1974/2047/1974 1973/4035/1973 +f 1978/559/1978 1979/4037/1979 1974/2047/1974 1977/4036/1977 +f 1980/1088/1980 1975/4038/1975 1974/2047/1974 1979/4037/1979 +f 1981/150/1981 1982/4039/1982 1983/2048/1983 1984/4041/1984 +f 1985/1086/1985 1986/4040/1986 1983/2048/1983 1982/4039/1982 +f 1978/559/1978 1977/4036/1977 1983/2048/1983 1986/4040/1986 +f 1976/1085/1976 1984/4041/1984 1983/2048/1983 1977/4036/1977 +f 1987/151/1987 1988/4042/1988 1989/2049/1989 1990/4044/1990 +f 1991/1087/1991 1992/4043/1992 1989/2049/1989 1988/4042/1988 +f 1978/559/1978 1986/4040/1986 1989/2049/1989 1992/4043/1992 +f 1985/1086/1985 1990/4044/1990 1989/2049/1989 1986/4040/1986 +f 1993/157/1993 1994/4045/1994 1995/2050/1995 1996/4046/1996 +f 1980/1088/1980 1979/4037/1979 1995/2050/1995 1994/4045/1994 +f 1978/559/1978 1992/4043/1992 1995/2050/1995 1979/4037/1979 +f 1991/1087/1991 1996/4046/1996 1995/2050/1995 1992/4043/1992 +f 1981/150/1981 1997/4047/1997 1998/2051/1998 1982/4039/1982 +f 1999/1089/1999 2000/4048/2000 1998/2051/1998 1997/4047/1997 +f 2001/560/2001 2002/4049/2002 1998/2051/1998 2000/4048/2000 +f 1985/1086/1985 1982/4039/1982 1998/2051/1998 2002/4049/2002 +f 2003/158/2003 2004/4050/2004 2005/2052/2005 2006/4052/2006 +f 2007/1090/2007 2008/4051/2008 2005/2052/2005 2004/4050/2004 +f 2001/560/2001 2000/4048/2000 2005/2052/2005 2008/4051/2008 +f 1999/1089/1999 2006/4052/2006 2005/2052/2005 2000/4048/2000 +f 2009/169/2009 2010/4053/2010 2011/2053/2011 2012/4055/2012 +f 2013/1091/2013 2014/4054/2014 2011/2053/2011 2010/4053/2010 +f 2001/560/2001 2008/4051/2008 2011/2053/2011 2014/4054/2014 +f 2007/1090/2007 2012/4055/2012 2011/2053/2011 2008/4051/2008 +f 1987/151/1987 1990/4044/1990 2015/2054/2015 2016/4056/2016 +f 1985/1086/1985 2002/4049/2002 2015/2054/2015 1990/4044/1990 +f 2001/560/2001 2014/4054/2014 2015/2054/2015 2002/4049/2002 +f 2013/1091/2013 2016/4056/2016 2015/2054/2015 2014/4054/2014 +f 1811/64/1811 2017/4057/2017 2018/2055/2018 2019/4060/2019 +f 2020/1092/2020 2021/4058/2021 2018/2055/2018 2017/4057/2017 +f 2022/561/2022 2023/4059/2023 2018/2055/2018 2021/4058/2021 +f 2024/1094/2024 2019/4060/2019 2018/2055/2018 2023/4059/2023 +f 2025/170/2025 2026/4061/2026 2027/2056/2027 2028/4063/2028 +f 2029/1093/2029 2030/4062/2030 2027/2056/2027 2026/4061/2026 +f 2022/561/2022 2021/4058/2021 2027/2056/2027 2030/4062/2030 +f 2020/1092/2020 2028/4063/2028 2027/2056/2027 2021/4058/2021 +f 1987/151/1987 2016/4056/2016 2031/2057/2031 2032/4065/2032 +f 2013/1091/2013 2033/4064/2033 2031/2057/2031 2016/4056/2016 +f 2022/561/2022 2030/4062/2030 2031/2057/2031 2033/4064/2033 +f 2029/1093/2029 2032/4065/2032 2031/2057/2031 2030/4062/2030 +f 2009/169/2009 2034/4066/2034 2035/2058/2035 2010/4053/2010 +f 2024/1094/2024 2023/4059/2023 2035/2058/2035 2034/4066/2034 +f 2022/561/2022 2033/4064/2033 2035/2058/2035 2023/4059/2023 +f 2013/1091/2013 2010/4053/2010 2035/2058/2035 2033/4064/2033 +f 2025/170/2025 2036/4067/2036 2037/2059/2037 2026/4061/2026 +f 2038/1095/2038 2039/4069/2039 2037/2059/2037 2036/4067/2036 +f 2040/562/2040 2041/4070/2041 2037/2059/2037 2039/4069/2039 +f 2029/1093/2029 2026/4061/2026 2037/2059/2037 2041/4070/2041 +f 1537/172/1537 2042/4071/2042 2043/2060/2043 2044/4074/2044 +f 2045/1097/2045 2046/4073/2046 2043/2060/2043 2042/4071/2042 +f 2040/562/2040 2039/4069/2039 2043/2060/2043 2046/4073/2046 +f 2038/1095/2038 2044/4074/2044 2043/2060/2043 2039/4069/2039 +f 1993/157/1993 1996/4046/1996 2047/2061/2047 2048/4077/2048 +f 1991/1087/1991 2049/4076/2049 2047/2061/2047 1996/4046/1996 +f 2040/562/2040 2046/4073/2046 2047/2061/2047 2049/4076/2049 +f 2045/1097/2045 2048/4077/2048 2047/2061/2047 2046/4073/2046 +f 1987/151/1987 2032/4065/2032 2050/2062/2050 1988/4042/1988 +f 2029/1093/2029 2041/4070/2041 2050/2062/2050 2032/4065/2032 +f 2040/562/2040 2049/4076/2049 2050/2062/2050 2041/4070/2041 +f 1991/1087/1991 1988/4042/1988 2050/2062/2050 2049/4076/2049 +f 1770/288/1770 1911/4005/1911 2051/2063/2051 2052/4081/2052 +f 1906/1078/1906 2053/4079/2053 2051/2063/2051 1911/4005/1911 +f 2054/563/2054 2055/4080/2055 2051/2063/2051 2053/4079/2053 +f 2056/1101/2056 2052/4081/2052 2051/2063/2051 2055/4080/2055 +f 1893/307/1893 2057/4082/2057 2058/2064/2058 1904/4001/1904 +f 2059/1099/2059 2060/4083/2060 2058/2064/2058 2057/4082/2057 +f 2054/563/2054 2053/4079/2053 2058/2064/2058 2060/4083/2060 +f 1906/1078/1906 1904/4001/1904 2058/2064/2058 2053/4079/2053 +f 2061/311/2061 2062/4084/2062 2063/2065/2063 2064/4086/2064 +f 2065/1100/2065 2066/4085/2066 2063/2065/2063 2062/4084/2062 +f 2054/563/2054 2060/4083/2060 2063/2065/2063 2066/4085/2066 +f 2059/1099/2059 2064/4086/2064 2063/2065/2063 2060/4083/2060 +f 2067/312/2067 2068/4087/2068 2069/2066/2069 2070/4088/2070 +f 2056/1101/2056 2055/4080/2055 2069/2066/2069 2068/4087/2068 +f 2054/563/2054 2066/4085/2066 2069/2066/2069 2055/4080/2055 +f 2065/1100/2065 2070/4088/2070 2069/2066/2069 2066/4085/2066 +f 1893/307/1893 1896/3996/1896 2071/2067/2071 2057/4082/2057 +f 1888/1074/1888 2072/4089/2072 2071/2067/2071 1896/3996/1896 +f 2073/564/2073 2074/4090/2074 2071/2067/2071 2072/4089/2072 +f 2059/1099/2059 2057/4082/2057 2071/2067/2071 2074/4090/2074 +f 1884/306/1884 2075/4091/2075 2076/2068/2076 1885/3989/1885 +f 2077/1102/2077 2078/4093/2078 2076/2068/2076 2075/4091/2075 +f 2073/564/2073 2072/4089/2072 2076/2068/2076 2078/4093/2078 +f 1888/1074/1888 1885/3989/1885 2076/2068/2076 2072/4089/2072 +f 2079/313/2079 2080/4094/2080 2081/2069/2081 2082/4096/2082 +f 2083/1104/2083 2084/4095/2084 2081/2069/2081 2080/4094/2080 +f 2073/564/2073 2078/4093/2078 2081/2069/2081 2084/4095/2084 +f 2077/1102/2077 2082/4096/2082 2081/2069/2081 2078/4093/2078 +f 2061/311/2061 2064/4086/2064 2085/2070/2085 2086/4098/2086 +f 2059/1099/2059 2074/4090/2074 2085/2070/2085 2064/4086/2064 +f 2073/564/2073 2084/4095/2084 2085/2070/2085 2074/4090/2074 +f 2083/1104/2083 2086/4098/2086 2085/2070/2085 2084/4095/2084 +f 626/74/626 629/3329/629 2087/2071/2087 2088/4101/2088 +f 634/897/634 2089/4099/2089 2087/2071/2087 629/3329/629 +f 2090/565/2090 2091/4100/2091 2087/2071/2087 2089/4099/2089 +f 2092/1106/2092 2088/4101/2088 2087/2071/2087 2091/4100/2091 +f 618/72/618 2093/4103/2093 2094/2072/2094 644/3336/644 +f 2095/1105/2095 2096/4104/2096 2094/2072/2094 2093/4103/2093 +f 2090/565/2090 2089/4099/2089 2094/2072/2094 2096/4104/2096 +f 634/897/634 644/3336/644 2094/2072/2094 2089/4099/2089 +f 2061/311/2061 2086/4098/2086 2097/2073/2097 2098/4106/2098 +f 2083/1104/2083 2099/4105/2099 2097/2073/2097 2086/4098/2086 +f 2090/565/2090 2096/4104/2096 2097/2073/2097 2099/4105/2099 +f 2095/1105/2095 2098/4106/2098 2097/2073/2097 2096/4104/2096 +f 2079/313/2079 2100/4107/2100 2101/2074/2101 2080/4094/2080 +f 2092/1106/2092 2091/4100/2091 2101/2074/2101 2100/4107/2100 +f 2090/565/2090 2099/4105/2099 2101/2074/2101 2091/4100/2091 +f 2083/1104/2083 2080/4094/2080 2101/2074/2101 2099/4105/2099 +f 618/72/618 621/3323/621 2102/2075/2102 2093/4103/2093 +f 616/892/616 2103/4109/2103 2102/2075/2102 621/3323/621 +f 2104/566/2104 2105/4110/2105 2102/2075/2102 2103/4109/2103 +f 2095/1105/2095 2093/4103/2093 2102/2075/2102 2105/4110/2105 +f 612/70/612 2106/4111/2106 2107/2076/2107 613/3318/613 +f 2108/1108/2108 2109/4112/2109 2107/2076/2107 2106/4111/2106 +f 2104/566/2104 2103/4109/2103 2107/2076/2107 2109/4112/2109 +f 616/892/616 613/3318/613 2107/2076/2107 2103/4109/2103 +f 2067/312/2067 2070/4088/2070 2110/2077/2110 2111/4114/2111 +f 2065/1100/2065 2112/4113/2112 2110/2077/2110 2070/4088/2070 +f 2104/566/2104 2109/4112/2109 2110/2077/2110 2112/4113/2112 +f 2108/1108/2108 2111/4114/2111 2110/2077/2110 2109/4112/2109 +f 2061/311/2061 2098/4106/2098 2113/2078/2113 2062/4084/2062 +f 2095/1105/2095 2105/4110/2105 2113/2078/2113 2098/4106/2098 +f 2104/566/2104 2112/4113/2112 2113/2078/2113 2105/4110/2105 +f 2065/1100/2065 2062/4084/2062 2113/2078/2113 2112/4113/2112 +f 1497/208/1497 1629/3857/1629 2114/2079/2114 2115/4117/2115 +f 1633/1037/1633 2116/4115/2116 2114/2079/2114 1629/3857/1629 +f 2117/567/2117 2118/4116/2118 2114/2079/2114 2116/4115/2116 +f 2119/1111/2119 2115/4117/2115 2114/2079/2114 2118/4116/2118 +f 1644/273/1644 2120/4118/2120 2121/2080/2121 1645/3863/1645 +f 2122/1109/2122 2123/4119/2123 2121/2080/2121 2120/4118/2120 +f 2117/567/2117 2116/4115/2116 2121/2080/2121 2123/4119/2123 +f 1633/1037/1633 1645/3863/1645 2121/2080/2121 2116/4115/2116 +f 2124/314/2124 2125/4120/2125 2126/2081/2126 2127/4122/2127 +f 2128/1110/2128 2129/4121/2129 2126/2081/2126 2125/4120/2125 +f 2117/567/2117 2123/4119/2123 2126/2081/2126 2129/4121/2129 +f 2122/1109/2122 2127/4122/2127 2126/2081/2126 2123/4119/2123 +f 2130/315/2130 2131/4123/2131 2132/2082/2132 2133/4124/2133 +f 2119/1111/2119 2118/4116/2118 2132/2082/2132 2131/4123/2131 +f 2117/567/2117 2129/4121/2129 2132/2082/2132 2118/4116/2118 +f 2128/1110/2128 2133/4124/2133 2132/2082/2132 2129/4121/2129 +f 1644/273/1644 1697/3890/1697 2134/2083/2134 2120/4118/2120 +f 1694/1044/1694 2135/4125/2135 2134/2083/2134 1697/3890/1697 +f 2136/568/2136 2137/4126/2137 2134/2083/2134 2135/4125/2135 +f 2122/1109/2122 2120/4118/2120 2134/2083/2134 2137/4126/2137 +f 1690/277/1690 2138/4127/2138 2139/2084/2139 1691/3886/1691 +f 2140/1112/2140 2141/4128/2141 2139/2084/2139 2138/4127/2138 +f 2136/568/2136 2135/4125/2135 2139/2084/2139 2141/4128/2141 +f 1694/1044/1694 1691/3886/1691 2139/2084/2139 2135/4125/2135 +f 2142/316/2142 2143/4129/2143 2144/2085/2144 2145/4131/2145 +f 2146/1113/2146 2147/4130/2147 2144/2085/2144 2143/4129/2143 +f 2136/568/2136 2141/4128/2141 2144/2085/2144 2147/4130/2147 +f 2140/1112/2140 2145/4131/2145 2144/2085/2144 2141/4128/2141 +f 2124/314/2124 2127/4122/2127 2148/2086/2148 2149/4132/2149 +f 2122/1109/2122 2137/4126/2137 2148/2086/2148 2127/4122/2127 +f 2136/568/2136 2147/4130/2147 2148/2086/2148 2137/4126/2137 +f 2146/1113/2146 2149/4132/2149 2148/2086/2148 2147/4130/2147 +f 698/177/698 701/3368/701 2150/2087/2150 2151/4135/2151 +f 706/908/706 2152/4133/2152 2150/2087/2150 701/3368/701 +f 2153/569/2153 2154/4134/2154 2150/2087/2150 2152/4133/2152 +f 2155/1115/2155 2151/4135/2151 2150/2087/2150 2154/4134/2154 +f 690/88/690 2156/4136/2156 2157/2088/2157 716/3374/716 +f 2158/1114/2158 2159/4137/2159 2157/2088/2157 2156/4136/2156 +f 2153/569/2153 2152/4133/2152 2157/2088/2157 2159/4137/2159 +f 706/908/706 716/3374/716 2157/2088/2157 2152/4133/2152 +f 2124/314/2124 2149/4132/2149 2160/2089/2160 2161/4139/2161 +f 2146/1113/2146 2162/4138/2162 2160/2089/2160 2149/4132/2149 +f 2153/569/2153 2159/4137/2159 2160/2089/2160 2162/4138/2162 +f 2158/1114/2158 2161/4139/2161 2160/2089/2160 2159/4137/2159 +f 2142/316/2142 2163/4140/2163 2164/2090/2164 2143/4129/2143 +f 2155/1115/2155 2154/4134/2154 2164/2090/2164 2163/4140/2163 +f 2153/569/2153 2162/4138/2162 2164/2090/2164 2154/4134/2154 +f 2146/1113/2146 2143/4129/2143 2164/2090/2164 2162/4138/2162 +f 690/88/690 693/3363/693 2165/2091/2165 2156/4136/2156 +f 688/904/688 2166/4141/2166 2165/2091/2165 693/3363/693 +f 2167/570/2167 2168/4142/2168 2165/2091/2165 2166/4141/2166 +f 2158/1114/2158 2156/4136/2156 2165/2091/2165 2168/4142/2168 +f 684/86/684 2169/4143/2169 2170/2092/2170 685/3358/685 +f 2171/1116/2171 2172/4144/2172 2170/2092/2170 2169/4143/2169 +f 2167/570/2167 2166/4141/2166 2170/2092/2170 2172/4144/2172 +f 688/904/688 685/3358/685 2170/2092/2170 2166/4141/2166 +f 2130/315/2130 2133/4124/2133 2173/2093/2173 2174/4146/2174 +f 2128/1110/2128 2175/4145/2175 2173/2093/2173 2133/4124/2133 +f 2167/570/2167 2172/4144/2172 2173/2093/2173 2175/4145/2175 +f 2171/1116/2171 2174/4146/2174 2173/2093/2173 2172/4144/2172 +f 2124/314/2124 2161/4139/2161 2176/2094/2176 2125/4120/2125 +f 2158/1114/2158 2168/4142/2168 2176/2094/2176 2161/4139/2161 +f 2167/570/2167 2175/4145/2175 2176/2094/2176 2168/4142/2168 +f 2128/1110/2128 2125/4120/2125 2176/2094/2176 2175/4145/2175 +f 1700/278/1700 1703/3894/1703 2177/2095/2177 2178/4149/2178 +f 1708/1048/1708 2179/4147/2179 2177/2095/2177 1703/3894/1703 +f 2180/571/2180 2181/4148/2181 2177/2095/2177 2179/4147/2179 +f 2182/1119/2182 2178/4149/2178 2177/2095/2177 2181/4148/2181 +f 1721/283/1721 2183/4150/2183 2184/2096/2184 1722/3901/1722 +f 2185/1117/2185 2186/4151/2186 2184/2096/2184 2183/4150/2183 +f 2180/571/2180 2179/4147/2179 2184/2096/2184 2186/4151/2186 +f 1708/1048/1708 1722/3901/1722 2184/2096/2184 2179/4147/2179 +f 2187/317/2187 2188/4152/2188 2189/2097/2189 2190/4154/2190 +f 2191/1118/2191 2192/4153/2192 2189/2097/2189 2188/4152/2188 +f 2180/571/2180 2186/4151/2186 2189/2097/2189 2192/4153/2192 +f 2185/1117/2185 2190/4154/2190 2189/2097/2189 2186/4151/2186 +f 2193/318/2193 2194/4155/2194 2195/2098/2195 2196/4156/2196 +f 2182/1119/2182 2181/4148/2181 2195/2098/2195 2194/4155/2194 +f 2180/571/2180 2192/4153/2192 2195/2098/2195 2181/4148/2181 +f 2191/1118/2191 2196/4156/2196 2195/2098/2195 2192/4153/2192 +f 1721/283/1721 1777/3930/1777 2197/2099/2197 2183/4150/2183 +f 1774/1056/1774 2198/4157/2198 2197/2099/2197 1777/3930/1777 +f 2199/572/2199 2200/4158/2200 2197/2099/2197 2198/4157/2198 +f 2185/1117/2185 2183/4150/2183 2197/2099/2197 2200/4158/2200 +f 1770/288/1770 2052/4081/2052 2201/2100/2201 1771/3926/1771 +f 2056/1101/2056 2202/4159/2202 2201/2100/2201 2052/4081/2052 +f 2199/572/2199 2198/4157/2198 2201/2100/2201 2202/4159/2202 +f 1774/1056/1774 1771/3926/1771 2201/2100/2201 2198/4157/2198 +f 2067/312/2067 2203/4160/2203 2204/2101/2204 2068/4087/2068 +f 2205/1120/2205 2206/4161/2206 2204/2101/2204 2203/4160/2203 +f 2199/572/2199 2202/4159/2202 2204/2101/2204 2206/4161/2206 +f 2056/1101/2056 2068/4087/2068 2204/2101/2204 2202/4159/2202 +f 2187/317/2187 2190/4154/2190 2207/2102/2207 2208/4162/2208 +f 2185/1117/2185 2200/4158/2200 2207/2102/2207 2190/4154/2190 +f 2199/572/2199 2206/4161/2206 2207/2102/2207 2200/4158/2200 +f 2205/1120/2205 2208/4162/2208 2207/2102/2207 2206/4161/2206 +f 612/70/612 771/3403/771 2209/2103/2209 2106/4111/2106 +f 775/917/775 2210/4163/2210 2209/2103/2209 771/3403/771 +f 2211/573/2211 2212/4164/2212 2209/2103/2209 2210/4163/2210 +f 2108/1108/2108 2106/4111/2106 2209/2103/2209 2212/4164/2212 +f 762/182/762 2213/4165/2213 2214/2104/2214 783/3408/783 +f 2215/1121/2215 2216/4166/2216 2214/2104/2214 2213/4165/2213 +f 2211/573/2211 2210/4163/2210 2214/2104/2214 2216/4166/2216 +f 775/917/775 783/3408/783 2214/2104/2214 2210/4163/2210 +f 2187/317/2187 2208/4162/2208 2217/2105/2217 2218/4168/2218 +f 2205/1120/2205 2219/4167/2219 2217/2105/2217 2208/4162/2208 +f 2211/573/2211 2216/4166/2216 2217/2105/2217 2219/4167/2219 +f 2215/1121/2215 2218/4168/2218 2217/2105/2217 2216/4166/2216 +f 2067/312/2067 2111/4114/2111 2220/2106/2220 2203/4160/2203 +f 2108/1108/2108 2212/4164/2212 2220/2106/2220 2111/4114/2111 +f 2211/573/2211 2219/4167/2219 2220/2106/2220 2212/4164/2212 +f 2205/1120/2205 2203/4160/2203 2220/2106/2220 2219/4167/2219 +f 762/182/762 765/3399/765 2221/2107/2221 2213/4165/2213 +f 760/914/760 2222/4169/2222 2221/2107/2221 765/3399/765 +f 2223/574/2223 2224/4170/2224 2221/2107/2221 2222/4169/2222 +f 2215/1121/2215 2213/4165/2213 2221/2107/2221 2224/4170/2224 +f 756/181/756 2225/4171/2225 2226/2108/2226 757/3394/757 +f 2227/1122/2227 2228/4172/2228 2226/2108/2226 2225/4171/2225 +f 2223/574/2223 2222/4169/2222 2226/2108/2226 2228/4172/2228 +f 760/914/760 757/3394/757 2226/2108/2226 2222/4169/2222 +f 2193/318/2193 2196/4156/2196 2229/2109/2229 2230/4174/2230 +f 2191/1118/2191 2231/4173/2231 2229/2109/2229 2196/4156/2196 +f 2223/574/2223 2228/4172/2228 2229/2109/2229 2231/4173/2231 +f 2227/1122/2227 2230/4174/2230 2229/2109/2229 2228/4172/2228 +f 2187/317/2187 2218/4168/2218 2232/2110/2232 2188/4152/2188 +f 2215/1121/2215 2224/4170/2224 2232/2110/2232 2218/4168/2218 +f 2223/574/2223 2231/4173/2231 2232/2110/2232 2224/4170/2224 +f 2191/1118/2191 2188/4152/2188 2232/2110/2232 2231/4173/2231 +f 2233/124/2233 2234/4175/2234 2235/2111/2235 2236/4178/2236 +f 2237/1123/2237 2238/4176/2238 2235/2111/2235 2234/4175/2234 +f 2239/575/2239 2240/4177/2240 2235/2111/2235 2238/4176/2238 +f 2241/1126/2241 2236/4178/2236 2235/2111/2235 2240/4177/2240 +f 2242/135/2242 2243/4179/2243 2244/2112/2244 2245/4181/2245 +f 2246/1124/2246 2247/4180/2247 2244/2112/2244 2243/4179/2243 +f 2239/575/2239 2238/4176/2238 2244/2112/2244 2247/4180/2247 +f 2237/1123/2237 2245/4181/2245 2244/2112/2244 2238/4176/2238 +f 2248/136/2248 2249/4182/2249 2250/2113/2250 2251/4184/2251 +f 2252/1125/2252 2253/4183/2253 2250/2113/2250 2249/4182/2249 +f 2239/575/2239 2247/4180/2247 2250/2113/2250 2253/4183/2253 +f 2246/1124/2246 2251/4184/2251 2250/2113/2250 2247/4180/2247 +f 2254/166/2254 2255/4185/2255 2256/2114/2256 2257/4186/2257 +f 2241/1126/2241 2240/4177/2240 2256/2114/2256 2255/4185/2255 +f 2239/575/2239 2253/4183/2253 2256/2114/2256 2240/4177/2240 +f 2252/1125/2252 2257/4186/2257 2256/2114/2256 2253/4183/2253 +f 2242/135/2242 2258/4187/2258 2259/2115/2259 2243/4179/2243 +f 2260/1127/2260 2261/4188/2261 2259/2115/2259 2258/4187/2258 +f 2262/576/2262 2263/4189/2263 2259/2115/2259 2261/4188/2261 +f 2246/1124/2246 2243/4179/2243 2259/2115/2259 2263/4189/2263 +f 1511/167/1511 2264/4190/2264 2265/2116/2265 2266/4193/2266 +f 2267/1128/2267 2268/4192/2268 2265/2116/2265 2264/4190/2264 +f 2262/576/2262 2261/4188/2261 2265/2116/2265 2268/4192/2268 +f 2260/1127/2260 2266/4193/2266 2265/2116/2265 2261/4188/2261 +f 2269/168/2269 2270/4194/2270 2271/2117/2271 2272/4196/2272 +f 2273/1130/2273 2274/4195/2274 2271/2117/2271 2270/4194/2270 +f 2262/576/2262 2268/4192/2268 2271/2117/2271 2274/4195/2274 +f 2267/1128/2267 2272/4196/2272 2271/2117/2271 2268/4192/2268 +f 2248/136/2248 2251/4184/2251 2275/2118/2275 2276/4198/2276 +f 2246/1124/2246 2263/4189/2263 2275/2118/2275 2251/4184/2251 +f 2262/576/2262 2274/4195/2274 2275/2118/2275 2263/4189/2263 +f 2273/1130/2273 2276/4198/2276 2275/2118/2275 2274/4195/2274 +f 839/47/839 842/3439/842 2277/2119/2277 2278/4201/2278 +f 847/928/847 2279/4199/2279 2277/2119/2277 842/3439/842 +f 2280/577/2280 2281/4200/2281 2277/2119/2277 2279/4199/2279 +f 2282/1132/2282 2278/4201/2278 2277/2119/2277 2281/4200/2281 +f 831/46/831 2283/4203/2283 2284/2120/2284 857/3446/857 +f 2285/1131/2285 2286/4204/2286 2284/2120/2284 2283/4203/2283 +f 2280/577/2280 2279/4199/2279 2284/2120/2284 2286/4204/2286 +f 847/928/847 857/3446/857 2284/2120/2284 2279/4199/2279 +f 2248/136/2248 2276/4198/2276 2287/2121/2287 2288/4206/2288 +f 2273/1130/2273 2289/4205/2289 2287/2121/2287 2276/4198/2276 +f 2280/577/2280 2286/4204/2286 2287/2121/2287 2289/4205/2289 +f 2285/1131/2285 2288/4206/2288 2287/2121/2287 2286/4204/2286 +f 2269/168/2269 2290/4207/2290 2291/2122/2291 2270/4194/2270 +f 2282/1132/2282 2281/4200/2281 2291/2122/2291 2290/4207/2290 +f 2280/577/2280 2289/4205/2289 2291/2122/2291 2281/4200/2281 +f 2273/1130/2273 2270/4194/2270 2291/2122/2291 2289/4205/2289 +f 831/46/831 834/3433/834 2292/2123/2292 2283/4203/2283 +f 829/923/829 2293/4209/2293 2292/2123/2292 834/3433/834 +f 2294/578/2294 2295/4210/2295 2292/2123/2292 2293/4209/2293 +f 2285/1131/2285 2283/4203/2283 2292/2123/2292 2295/4210/2295 +f 825/44/825 2296/4211/2296 2297/2124/2297 826/3428/826 +f 2298/1134/2298 2299/4212/2299 2297/2124/2297 2296/4211/2296 +f 2294/578/2294 2293/4209/2293 2297/2124/2297 2299/4212/2299 +f 829/923/829 826/3428/826 2297/2124/2297 2293/4209/2293 +f 2254/166/2254 2257/4186/2257 2300/2125/2300 2301/4214/2301 +f 2252/1125/2252 2302/4213/2302 2300/2125/2300 2257/4186/2257 +f 2294/578/2294 2299/4212/2299 2300/2125/2300 2302/4213/2302 +f 2298/1134/2298 2301/4214/2301 2300/2125/2300 2299/4212/2299 +f 2248/136/2248 2288/4206/2288 2303/2126/2303 2249/4182/2249 +f 2285/1131/2285 2295/4210/2295 2303/2126/2303 2288/4206/2288 +f 2294/578/2294 2302/4213/2302 2303/2126/2303 2295/4210/2295 +f 2252/1125/2252 2249/4182/2249 2303/2126/2303 2302/4213/2302 +f 698/177/698 2151/4135/2151 2304/2127/2304 874/3457/874 +f 2155/1115/2155 2305/4215/2305 2304/2127/2304 2151/4135/2151 +f 2306/579/2306 2307/4216/2307 2304/2127/2304 2305/4215/2305 +f 876/932/876 874/3457/874 2304/2127/2304 2307/4216/2307 +f 2142/316/2142 2308/4217/2308 2309/2128/2309 2163/4140/2163 +f 2310/1135/2310 2311/4218/2311 2309/2128/2309 2308/4217/2308 +f 2306/579/2306 2305/4215/2305 2309/2128/2309 2311/4218/2311 +f 2155/1115/2155 2163/4140/2163 2309/2128/2309 2305/4215/2305 +f 2312/319/2312 2313/4219/2313 2314/2129/2314 2315/4221/2315 +f 2316/1136/2316 2317/4220/2317 2314/2129/2314 2313/4219/2313 +f 2306/579/2306 2311/4218/2311 2314/2129/2314 2317/4220/2317 +f 2310/1135/2310 2315/4221/2315 2314/2129/2314 2311/4218/2311 +f 880/183/880 883/3462/883 2318/2130/2318 2319/4222/2319 +f 876/932/876 2307/4216/2307 2318/2130/2318 883/3462/883 +f 2306/579/2306 2317/4220/2317 2318/2130/2318 2307/4216/2307 +f 2316/1136/2316 2319/4222/2319 2318/2130/2318 2317/4220/2317 +f 2142/316/2142 2145/4131/2145 2320/2131/2320 2308/4217/2308 +f 2140/1112/2140 2321/4223/2321 2320/2131/2320 2145/4131/2145 +f 2322/580/2322 2323/4224/2323 2320/2131/2320 2321/4223/2321 +f 2310/1135/2310 2308/4217/2308 2320/2131/2320 2323/4224/2323 +f 1690/277/1690 2324/4225/2324 2325/2132/2325 2138/4127/2138 +f 2326/1137/2326 2327/4226/2327 2325/2132/2325 2324/4225/2324 +f 2322/580/2322 2321/4223/2321 2325/2132/2325 2327/4226/2327 +f 2140/1112/2140 2138/4127/2138 2325/2132/2325 2321/4223/2321 +f 2328/321/2328 2329/4227/2329 2330/2133/2330 2331/4229/2331 +f 2332/1138/2332 2333/4228/2333 2330/2133/2330 2329/4227/2329 +f 2322/580/2322 2327/4226/2327 2330/2133/2330 2333/4228/2333 +f 2326/1137/2326 2331/4229/2331 2330/2133/2330 2327/4226/2327 +f 2312/319/2312 2315/4221/2315 2334/2134/2334 2335/4230/2335 +f 2310/1135/2310 2323/4224/2323 2334/2134/2334 2315/4221/2315 +f 2322/580/2322 2333/4228/2333 2334/2134/2334 2323/4224/2323 +f 2332/1138/2332 2335/4230/2335 2334/2134/2334 2333/4228/2333 +f 1700/278/1700 2178/4149/2178 2336/2135/2336 2337/4233/2337 +f 2182/1119/2182 2338/4231/2338 2336/2135/2336 2178/4149/2178 +f 2339/581/2339 2340/4232/2340 2336/2135/2336 2338/4231/2338 +f 2341/1140/2341 2337/4233/2337 2336/2135/2336 2340/4232/2340 +f 2193/318/2193 2342/4234/2342 2343/2136/2343 2194/4155/2194 +f 2344/1139/2344 2345/4235/2345 2343/2136/2343 2342/4234/2342 +f 2339/581/2339 2338/4231/2338 2343/2136/2343 2345/4235/2345 +f 2182/1119/2182 2194/4155/2194 2343/2136/2343 2338/4231/2338 +f 2312/319/2312 2335/4230/2335 2346/2137/2346 2347/4237/2347 +f 2332/1138/2332 2348/4236/2348 2346/2137/2346 2335/4230/2335 +f 2339/581/2339 2345/4235/2345 2346/2137/2346 2348/4236/2348 +f 2344/1139/2344 2347/4237/2347 2346/2137/2346 2345/4235/2345 +f 2328/321/2328 2349/4238/2349 2350/2138/2350 2329/4227/2329 +f 2341/1140/2341 2340/4232/2340 2350/2138/2350 2349/4238/2349 +f 2339/581/2339 2348/4236/2348 2350/2138/2350 2340/4232/2340 +f 2332/1138/2332 2329/4227/2329 2350/2138/2350 2348/4236/2348 +f 2193/318/2193 2230/4174/2230 2351/2139/2351 2342/4234/2342 +f 2227/1122/2227 2352/4239/2352 2351/2139/2351 2230/4174/2230 +f 2353/582/2353 2354/4240/2354 2351/2139/2351 2352/4239/2352 +f 2344/1139/2344 2342/4234/2342 2351/2139/2351 2354/4240/2354 +f 756/181/756 901/3471/901 2355/2140/2355 2225/4171/2225 +f 896/935/896 2356/4241/2356 2355/2140/2355 901/3471/901 +f 2353/582/2353 2352/4239/2352 2355/2140/2355 2356/4241/2356 +f 2227/1122/2227 2225/4171/2225 2355/2140/2355 2352/4239/2352 +f 880/183/880 2319/4222/2319 2357/2141/2357 894/3467/894 +f 2316/1136/2316 2358/4242/2358 2357/2141/2357 2319/4222/2319 +f 2353/582/2353 2356/4241/2356 2357/2141/2357 2358/4242/2358 +f 896/935/896 894/3467/894 2357/2141/2357 2356/4241/2356 +f 2312/319/2312 2347/4237/2347 2359/2142/2359 2313/4219/2313 +f 2344/1139/2344 2354/4240/2354 2359/2142/2359 2347/4237/2347 +f 2353/582/2353 2358/4242/2358 2359/2142/2359 2354/4240/2354 +f 2316/1136/2316 2313/4219/2313 2359/2142/2359 2358/4242/2358 +f 1690/277/1690 1693/3888/1693 2360/2143/2360 2324/4225/2324 +f 1686/1043/1686 2361/4243/2361 2360/2143/2360 1693/3888/1693 +f 2362/583/2362 2363/4244/2363 2360/2143/2360 2361/4243/2361 +f 2326/1137/2326 2324/4225/2324 2360/2143/2360 2363/4244/2363 +f 1673/276/1673 2364/4245/2364 2365/2144/2365 1684/3883/1684 +f 2366/1141/2366 2367/4246/2367 2365/2144/2365 2364/4245/2364 +f 2362/583/2362 2361/4243/2361 2365/2144/2365 2367/4246/2367 +f 1686/1043/1686 1684/3883/1684 2365/2144/2365 2361/4243/2361 +f 2368/322/2368 2369/4247/2369 2370/2145/2370 2371/4249/2371 +f 2372/1142/2372 2373/4248/2373 2370/2145/2370 2369/4247/2369 +f 2362/583/2362 2367/4246/2367 2370/2145/2370 2373/4248/2373 +f 2366/1141/2366 2371/4249/2371 2370/2145/2370 2367/4246/2367 +f 2328/321/2328 2331/4229/2331 2374/2146/2374 2375/4250/2375 +f 2326/1137/2326 2363/4244/2363 2374/2146/2374 2331/4229/2331 +f 2362/583/2362 2373/4248/2373 2374/2146/2374 2363/4244/2363 +f 2372/1142/2372 2375/4250/2375 2374/2146/2374 2373/4248/2373 +f 1673/276/1673 1676/3879/1676 2376/2147/2376 2364/4245/2364 +f 1668/1040/1668 2377/4251/2377 2376/2147/2376 1676/3879/1676 +f 2378/584/2378 2379/4252/2379 2376/2147/2376 2377/4251/2377 +f 2366/1141/2366 2364/4245/2364 2376/2147/2376 2379/4252/2379 +f 1664/275/1664 2380/4253/2380 2381/2148/2381 1665/3873/1665 +f 2382/1143/2382 2383/4254/2383 2381/2148/2381 2380/4253/2380 +f 2378/584/2378 2377/4251/2377 2381/2148/2381 2383/4254/2383 +f 1668/1040/1668 1665/3873/1665 2381/2148/2381 2377/4251/2377 +f 2384/324/2384 2385/4255/2385 2386/2149/2386 2387/4257/2387 +f 2388/1144/2388 2389/4256/2389 2386/2149/2386 2385/4255/2385 +f 2378/584/2378 2383/4254/2383 2386/2149/2386 2389/4256/2389 +f 2382/1143/2382 2387/4257/2387 2386/2149/2386 2383/4254/2383 +f 2368/322/2368 2371/4249/2371 2390/2150/2390 2391/4258/2391 +f 2366/1141/2366 2379/4252/2379 2390/2150/2390 2371/4249/2371 +f 2378/584/2378 2389/4256/2389 2390/2150/2390 2379/4252/2379 +f 2388/1144/2388 2391/4258/2391 2390/2150/2390 2389/4256/2389 +f 1731/284/1731 1734/3908/1734 2392/2151/2392 2393/4261/2393 +f 1727/1049/1727 2394/4259/2394 2392/2151/2392 1734/3908/1734 +f 2395/585/2395 2396/4260/2396 2392/2151/2392 2394/4259/2394 +f 2397/1146/2397 2393/4261/2393 2392/2151/2392 2396/4260/2396 +f 1709/281/1709 2398/4262/2398 2399/2152/2399 1725/3903/1725 +f 2400/1145/2400 2401/4263/2401 2399/2152/2399 2398/4262/2398 +f 2395/585/2395 2394/4259/2394 2399/2152/2399 2401/4263/2401 +f 1727/1049/1727 1725/3903/1725 2399/2152/2399 2394/4259/2394 +f 2368/322/2368 2391/4258/2391 2402/2153/2402 2403/4265/2403 +f 2388/1144/2388 2404/4264/2404 2402/2153/2402 2391/4258/2391 +f 2395/585/2395 2401/4263/2401 2402/2153/2402 2404/4264/2404 +f 2400/1145/2400 2403/4265/2403 2402/2153/2402 2401/4263/2401 +f 2384/324/2384 2405/4266/2405 2406/2154/2406 2385/4255/2385 +f 2397/1146/2397 2396/4260/2396 2406/2154/2406 2405/4266/2405 +f 2395/585/2395 2404/4264/2404 2406/2154/2406 2396/4260/2396 +f 2388/1144/2388 2385/4255/2385 2406/2154/2406 2404/4264/2404 +f 1709/281/1709 1712/3897/1712 2407/2155/2407 2398/4262/2398 +f 1704/1045/1704 2408/4267/2408 2407/2155/2407 1712/3897/1712 +f 2409/586/2409 2410/4268/2410 2407/2155/2407 2408/4267/2408 +f 2400/1145/2400 2398/4262/2398 2407/2155/2407 2410/4268/2410 +f 1700/278/1700 2337/4233/2337 2411/2156/2411 1701/3891/1701 +f 2341/1140/2341 2412/4269/2412 2411/2156/2411 2337/4233/2337 +f 2409/586/2409 2408/4267/2408 2411/2156/2411 2412/4269/2412 +f 1704/1045/1704 1701/3891/1701 2411/2156/2411 2408/4267/2408 +f 2328/321/2328 2375/4250/2375 2413/2157/2413 2349/4238/2349 +f 2372/1142/2372 2414/4270/2414 2413/2157/2413 2375/4250/2375 +f 2409/586/2409 2412/4269/2412 2413/2157/2413 2414/4270/2414 +f 2341/1140/2341 2349/4238/2349 2413/2157/2413 2412/4269/2412 +f 2368/322/2368 2403/4265/2403 2415/2158/2415 2369/4247/2369 +f 2400/1145/2400 2410/4268/2410 2415/2158/2415 2403/4265/2403 +f 2409/586/2409 2414/4270/2414 2415/2158/2415 2410/4268/2410 +f 2372/1142/2372 2369/4247/2369 2415/2158/2415 2414/4270/2414 +f 1664/275/1664 1667/3876/1667 2416/2159/2416 2380/4253/2380 +f 1672/1042/1672 2417/4271/2417 2416/2159/2416 1667/3876/1667 +f 2418/587/2418 2419/4272/2419 2416/2159/2416 2417/4271/2417 +f 2382/1143/2382 2380/4253/2380 2416/2159/2416 2419/4272/2419 +f 1656/274/1656 2420/4273/2420 2421/2160/2421 1682/3882/1682 +f 2422/1147/2422 2423/4274/2423 2421/2160/2421 2420/4273/2420 +f 2418/587/2418 2417/4271/2417 2421/2160/2421 2423/4274/2423 +f 1672/1042/1672 1682/3882/1682 2421/2160/2421 2417/4271/2417 +f 2424/326/2424 2425/4275/2425 2426/2161/2426 2427/4277/2427 +f 2428/1148/2428 2429/4276/2429 2426/2161/2426 2425/4275/2425 +f 2418/587/2418 2423/4274/2423 2426/2161/2426 2429/4276/2429 +f 2422/1147/2422 2427/4277/2427 2426/2161/2426 2423/4274/2423 +f 2384/324/2384 2387/4257/2387 2430/2162/2430 2431/4278/2431 +f 2382/1143/2382 2419/4272/2419 2430/2162/2430 2387/4257/2387 +f 2418/587/2418 2429/4276/2429 2430/2162/2430 2419/4272/2419 +f 2428/1148/2428 2431/4278/2431 2430/2162/2430 2429/4276/2429 +f 1656/274/1656 1659/3871/1659 2432/2163/2432 2420/4273/2420 +f 1654/1038/1654 2433/4279/2433 2432/2163/2432 1659/3871/1659 +f 2434/588/2434 2435/4280/2435 2432/2163/2432 2433/4279/2433 +f 2422/1147/2422 2420/4273/2420 2432/2163/2432 2435/4280/2435 +f 1466/203/1466 2436/4281/2436 2437/2164/2437 1652/3867/1652 +f 2438/1149/2438 2439/4282/2439 2437/2164/2437 2436/4281/2436 +f 2434/588/2434 2433/4279/2433 2437/2164/2437 2439/4282/2439 +f 1654/1038/1654 1652/3867/1652 2437/2164/2437 2433/4279/2433 +f 2440/328/2440 2441/4283/2441 2442/2165/2442 2443/4285/2443 +f 2444/1150/2444 2445/4284/2445 2442/2165/2442 2441/4283/2441 +f 2434/588/2434 2439/4282/2439 2442/2165/2442 2445/4284/2445 +f 2438/1149/2438 2443/4285/2443 2442/2165/2442 2439/4282/2439 +f 2424/326/2424 2427/4277/2427 2446/2166/2446 2447/4286/2447 +f 2422/1147/2422 2435/4280/2435 2446/2166/2446 2427/4277/2427 +f 2434/588/2434 2445/4284/2445 2446/2166/2446 2435/4280/2435 +f 2444/1150/2444 2447/4286/2447 2446/2166/2446 2445/4284/2445 +f 1780/289/1780 1949/4025/1949 2448/2167/2448 2449/4289/2449 +f 1953/1084/1953 2450/4287/2450 2448/2167/2448 1949/4025/1949 +f 2451/589/2451 2452/4288/2452 2448/2167/2448 2450/4287/2450 +f 2453/1152/2453 2449/4289/2449 2448/2167/2448 2452/4288/2452 +f 1940/309/1940 2454/4290/2454 2455/2168/2455 1961/4030/1961 +f 2456/1151/2456 2457/4291/2457 2455/2168/2455 2454/4290/2454 +f 2451/589/2451 2450/4287/2450 2455/2168/2455 2457/4291/2457 +f 1953/1084/1953 1961/4030/1961 2455/2168/2455 2450/4287/2450 +f 2424/326/2424 2447/4286/2447 2458/2169/2458 2459/4293/2459 +f 2444/1150/2444 2460/4292/2460 2458/2169/2458 2447/4286/2447 +f 2451/589/2451 2457/4291/2457 2458/2169/2458 2460/4292/2460 +f 2456/1151/2456 2459/4293/2459 2458/2169/2458 2457/4291/2457 +f 2440/328/2440 2461/4294/2461 2462/2170/2462 2441/4283/2441 +f 2453/1152/2453 2452/4288/2452 2462/2170/2462 2461/4294/2461 +f 2451/589/2451 2460/4292/2460 2462/2170/2462 2452/4288/2452 +f 2444/1150/2444 2441/4283/2441 2462/2170/2462 2460/4292/2460 +f 1940/309/1940 1943/4021/1943 2463/2171/2463 2454/4290/2454 +f 1938/1081/1938 2464/4295/2464 2463/2171/2463 1943/4021/1943 +f 2465/590/2465 2466/4296/2466 2463/2171/2463 2464/4295/2464 +f 2456/1151/2456 2454/4290/2454 2463/2171/2463 2466/4296/2466 +f 1731/284/1731 2393/4261/2393 2467/2172/2467 1936/4017/1936 +f 2397/1146/2397 2468/4297/2468 2467/2172/2467 2393/4261/2393 +f 2465/590/2465 2464/4295/2464 2467/2172/2467 2468/4297/2468 +f 1938/1081/1938 1936/4017/1936 2467/2172/2467 2464/4295/2464 +f 2384/324/2384 2431/4278/2431 2469/2173/2469 2405/4266/2405 +f 2428/1148/2428 2470/4298/2470 2469/2173/2469 2431/4278/2431 +f 2465/590/2465 2468/4297/2468 2469/2173/2469 2470/4298/2470 +f 2397/1146/2397 2405/4266/2405 2469/2173/2469 2468/4297/2468 +f 2424/326/2424 2459/4293/2459 2471/2174/2471 2425/4275/2425 +f 2456/1151/2456 2466/4296/2466 2471/2174/2471 2459/4293/2459 +f 2465/590/2465 2470/4298/2470 2471/2174/2471 2466/4296/2466 +f 2428/1148/2428 2425/4275/2425 2471/2174/2471 2470/4298/2470 +f 1537/188/1537 1540/3806/1540 2472/2175/2472 2042/4072/2042 +f 1533/1018/1533 2473/4299/2473 2472/2175/2472 1540/3806/1540 +f 2474/591/2474 2475/4300/2475 2472/2175/2472 2473/4299/2473 +f 2045/1098/2045 2042/4072/2042 2472/2175/2472 2475/4300/2475 +f 1520/192/1520 2476/4301/2476 2477/2176/2477 1531/3800/1531 +f 2478/1153/2478 2479/4302/2479 2477/2176/2477 2476/4301/2476 +f 2474/591/2474 2473/4299/2473 2477/2176/2477 2479/4302/2479 +f 1533/1018/1533 1531/3800/1531 2477/2176/2477 2473/4299/2473 +f 2480/210/2480 2481/4303/2481 2482/2177/2482 2483/4306/2483 +f 2484/1154/2484 2485/4305/2485 2482/2177/2482 2481/4303/2481 +f 2474/591/2474 2479/4302/2479 2482/2177/2482 2485/4305/2485 +f 2478/1153/2478 2483/4306/2483 2482/2177/2482 2479/4302/2479 +f 1993/214/1993 2048/4078/2048 2486/2178/2486 2487/4307/2487 +f 2045/1098/2045 2475/4300/2475 2486/2178/2486 2048/4078/2048 +f 2474/591/2474 2485/4305/2485 2486/2178/2486 2475/4300/2475 +f 2484/1154/2484 2487/4307/2487 2486/2178/2486 2485/4305/2485 +f 1520/192/1520 1523/3795/1523 2488/2179/2488 2476/4301/2476 +f 1515/1014/1515 2489/4309/2489 2488/2179/2488 1523/3795/1523 +f 2490/592/2490 2491/4310/2491 2488/2179/2488 2489/4309/2489 +f 2478/1153/2478 2476/4301/2476 2488/2179/2488 2491/4310/2491 +f 1511/167/1511 2266/4193/2266 2492/2180/2492 1512/3788/1512 +f 2260/1127/2260 2493/4311/2493 2492/2180/2492 2266/4193/2266 +f 2490/592/2490 2489/4309/2489 2492/2180/2492 2493/4311/2493 +f 1515/1014/1515 1512/3788/1512 2492/2180/2492 2489/4309/2489 +f 2242/135/2242 2494/4312/2494 2495/2181/2495 2258/4187/2258 +f 2496/1156/2496 2497/4313/2497 2495/2181/2495 2494/4312/2494 +f 2490/592/2490 2493/4311/2493 2495/2181/2495 2497/4313/2497 +f 2260/1127/2260 2258/4187/2258 2495/2181/2495 2493/4311/2493 +f 2480/210/2480 2483/4306/2483 2498/2182/2498 2499/4314/2499 +f 2478/1153/2478 2491/4310/2491 2498/2182/2498 2483/4306/2483 +f 2490/592/2490 2497/4313/2497 2498/2182/2498 2491/4310/2491 +f 2496/1156/2496 2499/4314/2499 2498/2182/2498 2497/4313/2497 +f 2233/124/2233 2500/4315/2500 2501/2183/2501 2234/4175/2234 +f 2502/1157/2502 2503/4316/2503 2501/2183/2501 2500/4315/2500 +f 2504/593/2504 2505/4317/2505 2501/2183/2501 2503/4316/2503 +f 2237/1123/2237 2234/4175/2234 2501/2183/2501 2505/4317/2505 +f 2506/232/2506 2507/4318/2507 2508/2184/2508 2509/4321/2509 +f 2510/1158/2510 2511/4320/2511 2508/2184/2508 2507/4318/2507 +f 2504/593/2504 2503/4316/2503 2508/2184/2508 2511/4320/2511 +f 2502/1157/2502 2509/4321/2509 2508/2184/2508 2503/4316/2503 +f 2480/210/2480 2499/4314/2499 2512/2185/2512 2513/4323/2513 +f 2496/1156/2496 2514/4322/2514 2512/2185/2512 2499/4314/2499 +f 2504/593/2504 2511/4320/2511 2512/2185/2512 2514/4322/2514 +f 2510/1158/2510 2513/4323/2513 2512/2185/2512 2511/4320/2511 +f 2242/135/2242 2245/4181/2245 2515/2186/2515 2494/4312/2494 +f 2237/1123/2237 2505/4317/2505 2515/2186/2515 2245/4181/2245 +f 2504/593/2504 2514/4322/2514 2515/2186/2515 2505/4317/2505 +f 2496/1156/2496 2494/4312/2494 2515/2186/2515 2514/4322/2514 +f 2506/206/2506 2516/4325/2516 2517/2187/2517 2507/4319/2507 +f 2518/1160/2518 2519/4326/2519 2517/2187/2517 2516/4325/2516 +f 2520/594/2520 2521/4327/2521 2517/2187/2517 2519/4326/2519 +f 2510/1159/2510 2507/4319/2507 2517/2187/2517 2521/4327/2521 +f 1972/84/1972 1975/4038/1975 2522/2188/2522 2523/4329/2523 +f 1980/1088/1980 2524/4328/2524 2522/2188/2522 1975/4038/1975 +f 2520/594/2520 2519/4326/2519 2522/2188/2522 2524/4328/2524 +f 2518/1160/2518 2523/4329/2523 2522/2188/2522 2519/4326/2519 +f 1993/157/1993 2487/4308/2487 2525/2189/2525 1994/4045/1994 +f 2484/1155/2484 2526/4330/2526 2525/2189/2525 2487/4308/2487 +f 2520/594/2520 2524/4328/2524 2525/2189/2525 2526/4330/2526 +f 1980/1088/1980 1994/4045/1994 2525/2189/2525 2524/4328/2524 +f 2480/216/2480 2513/4324/2513 2527/2190/2527 2481/4304/2481 +f 2510/1159/2510 2521/4327/2521 2527/2190/2527 2513/4324/2513 +f 2520/594/2520 2526/4330/2526 2527/2190/2527 2521/4327/2521 +f 2484/1155/2484 2481/4304/2481 2527/2190/2527 2526/4330/2526 +f 1592/139/1592 1595/3839/1595 2528/2191/2528 2529/4333/2529 +f 1600/1032/1600 2530/4331/2530 2528/2191/2528 1595/3839/1595 +f 2531/595/2531 2532/4332/2532 2528/2191/2528 2530/4331/2530 +f 2533/1164/2533 2529/4333/2529 2528/2191/2528 2532/4332/2532 +f 1584/153/1584 2534/4334/2534 2535/2192/2535 1610/3846/1610 +f 2536/1161/2536 2537/4336/2537 2535/2192/2535 2534/4334/2534 +f 2531/595/2531 2530/4331/2530 2535/2192/2535 2537/4336/2537 +f 1600/1032/1600 1610/3846/1610 2535/2192/2535 2530/4331/2530 +f 2538/160/2538 2539/4337/2539 2540/2193/2540 2541/4339/2541 +f 2542/1163/2542 2543/4338/2543 2540/2193/2540 2539/4337/2539 +f 2531/595/2531 2537/4336/2537 2540/2193/2540 2543/4338/2543 +f 2536/1161/2536 2541/4339/2541 2540/2193/2540 2537/4336/2537 +f 2544/171/2544 2545/4341/2545 2546/2194/2546 2547/4342/2547 +f 2533/1164/2533 2532/4332/2532 2546/2194/2546 2545/4341/2545 +f 2531/595/2531 2543/4338/2543 2546/2194/2546 2532/4332/2532 +f 2542/1163/2542 2547/4342/2547 2546/2194/2546 2543/4338/2543 +f 1584/250/1584 1587/3833/1587 2548/2195/2548 2534/4335/2534 +f 1582/1027/1582 2549/4343/2549 2548/2195/2548 1587/3833/1587 +f 2550/596/2550 2551/4344/2551 2548/2195/2548 2549/4343/2549 +f 2536/1162/2536 2534/4335/2534 2548/2195/2548 2551/4344/2551 +f 1578/81/1578 2552/4345/2552 2553/2196/2553 1579/3826/1579 +f 2554/1165/2554 2555/4346/2555 2553/2196/2553 2552/4345/2552 +f 2550/596/2550 2549/4343/2549 2553/2196/2553 2555/4346/2555 +f 1582/1027/1582 1579/3826/1579 2553/2196/2553 2549/4343/2549 +f 2556/260/2556 2557/4347/2557 2558/2197/2558 2559/4349/2559 +f 2560/1166/2560 2561/4348/2561 2558/2197/2558 2557/4347/2557 +f 2550/596/2550 2555/4346/2555 2558/2197/2558 2561/4348/2561 +f 2554/1165/2554 2559/4349/2559 2558/2197/2558 2555/4346/2555 +f 2538/320/2538 2541/4340/2541 2562/2198/2562 2563/4350/2563 +f 2536/1162/2536 2551/4344/2551 2562/2198/2562 2541/4340/2541 +f 2550/596/2550 2561/4348/2561 2562/2198/2562 2551/4344/2551 +f 2560/1166/2560 2563/4350/2563 2562/2198/2562 2561/4348/2561 +f 2564/327/2564 2565/4351/2565 2566/2199/2566 2567/4354/2567 +f 2568/1167/2568 2569/4352/2569 2566/2199/2566 2565/4351/2565 +f 2570/597/2570 2571/4353/2571 2566/2199/2566 2569/4352/2569 +f 2572/1170/2572 2567/4354/2567 2566/2199/2566 2571/4353/2571 +f 2573/342/2573 2574/4355/2574 2575/2200/2575 2576/4358/2576 +f 2577/1168/2577 2578/4357/2578 2575/2200/2575 2574/4355/2574 +f 2570/597/2570 2569/4352/2569 2575/2200/2575 2578/4357/2578 +f 2568/1167/2568 2576/4358/2576 2575/2200/2575 2569/4352/2569 +f 2538/320/2538 2563/4350/2563 2579/2201/2579 2580/4360/2580 +f 2560/1166/2560 2581/4359/2581 2579/2201/2579 2563/4350/2563 +f 2570/597/2570 2578/4357/2578 2579/2201/2579 2581/4359/2581 +f 2577/1168/2577 2580/4360/2580 2579/2201/2579 2578/4357/2578 +f 2556/260/2556 2582/4362/2582 2583/2202/2583 2557/4347/2557 +f 2572/1170/2572 2571/4353/2571 2583/2202/2583 2582/4362/2582 +f 2570/597/2570 2581/4359/2581 2583/2202/2583 2571/4353/2571 +f 2560/1166/2560 2557/4347/2557 2583/2202/2583 2581/4359/2581 +f 2573/173/2573 2584/4363/2584 2585/2203/2585 2574/4356/2574 +f 2586/1171/2586 2587/4364/2587 2585/2203/2585 2584/4363/2584 +f 2588/598/2588 2589/4365/2589 2585/2203/2585 2587/4364/2587 +f 2577/1169/2577 2574/4356/2574 2585/2203/2585 2589/4365/2589 +f 2590/175/2590 2591/4366/2591 2592/2204/2592 2593/4368/2593 +f 2594/1172/2594 2595/4367/2595 2592/2204/2592 2591/4366/2591 +f 2588/598/2588 2587/4364/2587 2592/2204/2592 2595/4367/2595 +f 2586/1171/2586 2593/4368/2593 2592/2204/2592 2587/4364/2587 +f 2544/171/2544 2547/4342/2547 2596/2205/2596 2597/4370/2597 +f 2542/1163/2542 2598/4369/2598 2596/2205/2596 2547/4342/2547 +f 2588/598/2588 2595/4367/2595 2596/2205/2596 2598/4369/2598 +f 2594/1172/2594 2597/4370/2597 2596/2205/2596 2595/4367/2595 +f 2538/160/2538 2580/4361/2580 2599/2206/2599 2539/4337/2539 +f 2577/1169/2577 2589/4365/2589 2599/2206/2599 2580/4361/2580 +f 2588/598/2588 2598/4369/2598 2599/2206/2599 2589/4365/2589 +f 2542/1163/2542 2539/4337/2539 2599/2206/2599 2598/4369/2598 +f 1578/81/1578 1826/3957/1826 2600/2207/2600 2552/4345/2552 +f 1830/1067/1830 2601/4371/2601 2600/2207/2600 1826/3957/1826 +f 2602/599/2602 2603/4372/2603 2600/2207/2600 2601/4371/2601 +f 2554/1165/2554 2552/4345/2552 2600/2207/2600 2603/4372/2603 +f 1817/69/1817 2604/4373/2604 2605/2208/2605 1838/3964/1838 +f 2606/1173/2606 2607/4374/2607 2605/2208/2605 2604/4373/2604 +f 2602/599/2602 2601/4371/2601 2605/2208/2605 2607/4374/2607 +f 1830/1067/1830 1838/3964/1838 2605/2208/2605 2601/4371/2601 +f 2608/403/2608 2609/4375/2609 2610/2209/2610 2611/4377/2611 +f 2612/1174/2612 2613/4376/2613 2610/2209/2610 2609/4375/2609 +f 2602/599/2602 2607/4374/2607 2610/2209/2610 2613/4376/2613 +f 2606/1173/2606 2611/4377/2611 2610/2209/2610 2607/4374/2607 +f 2556/260/2556 2559/4349/2559 2614/2210/2614 2615/4378/2615 +f 2554/1165/2554 2603/4372/2603 2614/2210/2614 2559/4349/2559 +f 2602/599/2602 2613/4376/2613 2614/2210/2614 2603/4372/2603 +f 2612/1174/2612 2615/4378/2615 2614/2210/2614 2613/4376/2613 +f 1817/69/1817 1820/3953/1820 2616/2211/2616 2604/4373/2604 +f 1815/1063/1815 2617/4379/2617 2616/2211/2616 1820/3953/1820 +f 2618/600/2618 2619/4380/2619 2616/2211/2616 2617/4379/2617 +f 2606/1173/2606 2604/4373/2604 2616/2211/2616 2619/4380/2619 +f 1811/64/1811 2019/4060/2019 2620/2212/2620 1812/3948/1812 +f 2024/1094/2024 2621/4381/2621 2620/2212/2620 2019/4060/2019 +f 2618/600/2618 2617/4379/2617 2620/2212/2620 2621/4381/2621 +f 1815/1063/1815 1812/3948/1812 2620/2212/2620 2617/4379/2617 +f 2009/169/2009 2622/4382/2622 2623/2213/2623 2034/4066/2034 +f 2624/1175/2624 2625/4383/2625 2623/2213/2623 2622/4382/2622 +f 2618/600/2618 2621/4381/2621 2623/2213/2623 2625/4383/2625 +f 2024/1094/2024 2034/4066/2034 2623/2213/2623 2621/4381/2621 +f 2608/403/2608 2611/4377/2611 2626/2214/2626 2627/4384/2627 +f 2606/1173/2606 2619/4380/2619 2626/2214/2626 2611/4377/2611 +f 2618/600/2618 2625/4383/2625 2626/2214/2626 2619/4380/2619 +f 2624/1175/2624 2627/4384/2627 2626/2214/2626 2625/4383/2625 +f 2003/158/2003 2628/4385/2628 2629/2215/2629 2004/4050/2004 +f 2630/1176/2630 2631/4386/2631 2629/2215/2629 2628/4385/2628 +f 2632/601/2632 2633/4387/2633 2629/2215/2629 2631/4386/2631 +f 2007/1090/2007 2004/4050/2004 2629/2215/2629 2633/4387/2633 +f 2634/407/2634 2635/4388/2635 2636/2216/2636 2637/4390/2637 +f 2638/1177/2638 2639/4389/2639 2636/2216/2636 2635/4388/2635 +f 2632/601/2632 2631/4386/2631 2636/2216/2636 2639/4389/2639 +f 2630/1176/2630 2637/4390/2637 2636/2216/2636 2631/4386/2631 +f 2608/403/2608 2627/4384/2627 2640/2217/2640 2641/4392/2641 +f 2624/1175/2624 2642/4391/2642 2640/2217/2640 2627/4384/2627 +f 2632/601/2632 2639/4389/2639 2640/2217/2640 2642/4391/2642 +f 2638/1177/2638 2641/4392/2641 2640/2217/2640 2639/4389/2639 +f 2009/169/2009 2012/4055/2012 2643/2218/2643 2622/4382/2622 +f 2007/1090/2007 2633/4387/2633 2643/2218/2643 2012/4055/2012 +f 2632/601/2632 2642/4391/2642 2643/2218/2643 2633/4387/2633 +f 2624/1175/2624 2622/4382/2622 2643/2218/2643 2642/4391/2642 +f 2634/407/2634 2644/4393/2644 2645/2219/2645 2635/4388/2635 +f 2646/1178/2646 2647/4394/2647 2645/2219/2645 2644/4393/2644 +f 2648/602/2648 2649/4395/2649 2645/2219/2645 2647/4394/2647 +f 2638/1177/2638 2635/4388/2635 2645/2219/2645 2649/4395/2649 +f 2564/327/2564 2567/4354/2567 2650/2220/2650 2651/4397/2651 +f 2572/1170/2572 2652/4396/2652 2650/2220/2650 2567/4354/2567 +f 2648/602/2648 2647/4394/2647 2650/2220/2650 2652/4396/2652 +f 2646/1178/2646 2651/4397/2651 2650/2220/2650 2647/4394/2647 +f 2556/260/2556 2615/4378/2615 2653/2221/2653 2582/4362/2582 +f 2612/1174/2612 2654/4398/2654 2653/2221/2653 2615/4378/2615 +f 2648/602/2648 2652/4396/2652 2653/2221/2653 2654/4398/2654 +f 2572/1170/2572 2582/4362/2582 2653/2221/2653 2652/4396/2652 +f 2608/403/2608 2641/4392/2641 2655/2222/2655 2609/4375/2609 +f 2638/1177/2638 2649/4395/2649 2655/2222/2655 2641/4392/2641 +f 2648/602/2648 2654/4398/2654 2655/2222/2655 2649/4395/2649 +f 2612/1174/2612 2609/4375/2609 2655/2222/2655 2654/4398/2654 +f 1884/193/1884 1887/3993/1887 2656/2223/2656 2657/4401/2657 +f 1892/1077/1892 2658/4399/2658 2656/2223/2656 1887/3993/1887 +f 2659/603/2659 2660/4400/2660 2656/2223/2656 2658/4399/2658 +f 2661/1181/2661 2657/4401/2657 2656/2223/2656 2660/4400/2660 +f 1876/195/1876 2662/4402/2662 2663/2224/2663 1902/4000/1902 +f 2664/1179/2664 2665/4403/2665 2663/2224/2663 2662/4402/2662 +f 2659/603/2659 2658/4399/2658 2663/2224/2663 2665/4403/2665 +f 1892/1077/1892 1902/4000/1902 2663/2224/2663 2658/4399/2658 +f 2666/197/2666 2667/4404/2667 2668/2225/2668 2669/4406/2669 +f 2670/1180/2670 2671/4405/2671 2668/2225/2668 2667/4404/2667 +f 2659/603/2659 2665/4403/2665 2668/2225/2668 2671/4405/2671 +f 2664/1179/2664 2669/4406/2669 2668/2225/2668 2665/4403/2665 +f 2672/215/2672 2673/4407/2673 2674/2226/2674 2675/4408/2675 +f 2661/1181/2661 2660/4400/2660 2674/2226/2674 2673/4407/2673 +f 2659/603/2659 2671/4405/2671 2674/2226/2674 2660/4400/2660 +f 2670/1180/2670 2675/4408/2675 2674/2226/2674 2671/4405/2671 +f 1876/195/1876 1879/3987/1879 2676/2227/2676 2662/4402/2662 +f 1874/1072/1874 2677/4409/2677 2676/2227/2676 1879/3987/1879 +f 2678/604/2678 2679/4410/2679 2676/2227/2676 2677/4409/2677 +f 2664/1179/2664 2662/4402/2662 2676/2227/2676 2679/4410/2679 +f 1592/139/1592 2529/4333/2529 2680/2228/2680 1872/3982/1872 +f 2533/1164/2533 2681/4411/2681 2680/2228/2680 2529/4333/2529 +f 2678/604/2678 2677/4409/2677 2680/2228/2680 2681/4411/2681 +f 1874/1072/1874 1872/3982/1872 2680/2228/2680 2677/4409/2677 +f 2544/171/2544 2682/4412/2682 2683/2229/2683 2545/4341/2545 +f 2684/1182/2684 2685/4413/2685 2683/2229/2683 2682/4412/2682 +f 2678/604/2678 2681/4411/2681 2683/2229/2683 2685/4413/2685 +f 2533/1164/2533 2545/4341/2545 2683/2229/2683 2681/4411/2681 +f 2666/197/2666 2669/4406/2669 2686/2230/2686 2687/4414/2687 +f 2664/1179/2664 2679/4410/2679 2686/2230/2686 2669/4406/2669 +f 2678/604/2678 2685/4413/2685 2686/2230/2686 2679/4410/2679 +f 2684/1182/2684 2687/4414/2687 2686/2230/2686 2685/4413/2685 +f 2590/175/2590 2688/4415/2688 2689/2231/2689 2591/4366/2591 +f 2690/1183/2690 2691/4416/2691 2689/2231/2689 2688/4415/2688 +f 2692/605/2692 2693/4417/2693 2689/2231/2689 2691/4416/2691 +f 2594/1172/2594 2591/4366/2591 2689/2231/2689 2693/4417/2693 +f 2694/217/2694 2695/4418/2695 2696/2232/2696 2697/4420/2697 +f 2698/1184/2698 2699/4419/2699 2696/2232/2696 2695/4418/2695 +f 2692/605/2692 2691/4416/2691 2696/2232/2696 2699/4419/2699 +f 2690/1183/2690 2697/4420/2697 2696/2232/2696 2691/4416/2691 +f 2666/197/2666 2687/4414/2687 2700/2233/2700 2701/4422/2701 +f 2684/1182/2684 2702/4421/2702 2700/2233/2700 2687/4414/2687 +f 2692/605/2692 2699/4419/2699 2700/2233/2700 2702/4421/2702 +f 2698/1184/2698 2701/4422/2701 2700/2233/2700 2699/4419/2699 +f 2544/171/2544 2597/4370/2597 2703/2234/2703 2682/4412/2682 +f 2594/1172/2594 2693/4417/2693 2703/2234/2703 2597/4370/2597 +f 2692/605/2692 2702/4421/2702 2703/2234/2703 2693/4417/2693 +f 2684/1182/2684 2682/4412/2682 2703/2234/2703 2702/4421/2702 +f 2694/217/2694 2704/4423/2704 2705/2235/2705 2695/4418/2695 +f 2706/1185/2706 2707/4424/2707 2705/2235/2705 2704/4423/2704 +f 2708/606/2708 2709/4425/2709 2705/2235/2705 2707/4424/2707 +f 2698/1184/2698 2695/4418/2695 2705/2235/2705 2709/4425/2709 +f 2710/219/2710 2711/4426/2711 2712/2236/2712 2713/4428/2713 +f 2714/1186/2714 2715/4427/2715 2712/2236/2712 2711/4426/2711 +f 2708/606/2708 2707/4424/2707 2712/2236/2712 2715/4427/2715 +f 2706/1185/2706 2713/4428/2713 2712/2236/2712 2707/4424/2707 +f 2672/215/2672 2675/4408/2675 2716/2237/2716 2717/4430/2717 +f 2670/1180/2670 2718/4429/2718 2716/2237/2716 2675/4408/2675 +f 2708/606/2708 2715/4427/2715 2716/2237/2716 2718/4429/2718 +f 2714/1186/2714 2717/4430/2717 2716/2237/2716 2715/4427/2715 +f 2666/197/2666 2701/4422/2701 2719/2238/2719 2667/4404/2667 +f 2698/1184/2698 2709/4425/2709 2719/2238/2719 2701/4422/2701 +f 2708/606/2708 2718/4429/2718 2719/2238/2719 2709/4425/2709 +f 2670/1180/2670 2667/4404/2667 2719/2238/2719 2718/4429/2718 +f 1537/213/1537 2044/4075/2044 2720/2239/2720 1538/3803/1538 +f 2038/1096/2038 2721/4431/2721 2720/2239/2720 2044/4075/2044 +f 2722/607/2722 2723/4432/2723 2720/2239/2720 2721/4431/2721 +f 1541/1019/1541 1538/3803/1538 2720/2239/2720 2723/4432/2723 +f 2025/330/2025 2724/4433/2724 2725/2240/2725 2036/4068/2036 +f 2726/1187/2726 2727/4435/2727 2725/2240/2725 2724/4433/2724 +f 2722/607/2722 2721/4431/2721 2725/2240/2725 2727/4435/2727 +f 2038/1096/2038 2036/4068/2036 2725/2240/2725 2721/4431/2721 +f 2728/331/2728 2729/4436/2729 2730/2241/2730 2731/4438/2731 +f 2732/1189/2732 2733/4437/2733 2730/2241/2730 2729/4436/2729 +f 2722/607/2722 2727/4435/2727 2730/2241/2730 2733/4437/2733 +f 2726/1187/2726 2731/4438/2731 2730/2241/2730 2727/4435/2727 +f 1487/207/1487 1544/3808/1544 2734/2242/2734 2735/4440/2735 +f 1541/1019/1541 2723/4432/2723 2734/2242/2734 1544/3808/1544 +f 2722/607/2722 2733/4437/2733 2734/2242/2734 2723/4432/2723 +f 2732/1189/2732 2735/4440/2735 2734/2242/2734 2733/4437/2733 +f 2025/170/2025 2028/4063/2028 2736/2243/2736 2724/4434/2724 +f 2020/1092/2020 2737/4441/2737 2736/2243/2736 2028/4063/2028 +f 2738/608/2738 2739/4442/2739 2736/2243/2736 2737/4441/2737 +f 2726/1188/2726 2724/4434/2724 2736/2243/2736 2739/4442/2739 +f 1811/64/1811 1814/3950/1814 2740/2244/2740 2017/4057/2017 +f 1807/1062/1807 2741/4443/2741 2740/2244/2740 1814/3950/1814 +f 2738/608/2738 2737/4441/2737 2740/2244/2740 2741/4443/2741 +f 2020/1092/2020 2017/4057/2017 2740/2244/2740 2737/4441/2737 +f 1789/63/1789 2742/4444/2742 2743/2245/2743 1805/3945/1805 +f 2744/1190/2744 2745/4446/2745 2743/2245/2743 2742/4444/2742 +f 2738/608/2738 2741/4443/2741 2743/2245/2743 2745/4446/2745 +f 1807/1062/1807 1805/3945/1805 2743/2245/2743 2741/4443/2741 +f 2728/408/2728 2731/4439/2731 2746/2246/2746 2747/4447/2747 +f 2726/1188/2726 2739/4442/2739 2746/2246/2746 2731/4439/2731 +f 2738/608/2738 2745/4446/2745 2746/2246/2746 2739/4442/2739 +f 2744/1190/2744 2747/4447/2747 2746/2246/2746 2745/4446/2745 +f 1780/289/1780 2449/4289/2449 2748/2247/2748 1781/3931/1781 +f 2453/1152/2453 2749/4449/2749 2748/2247/2748 2449/4289/2449 +f 2750/609/2750 2751/4450/2751 2748/2247/2748 2749/4449/2749 +f 1784/1057/1784 1781/3931/1781 2748/2247/2748 2751/4450/2751 +f 2440/328/2440 2752/4451/2752 2753/2248/2753 2461/4294/2461 +f 2754/1192/2754 2755/4452/2755 2753/2248/2753 2752/4451/2752 +f 2750/609/2750 2749/4449/2749 2753/2248/2753 2755/4452/2755 +f 2453/1152/2453 2461/4294/2461 2753/2248/2753 2749/4449/2749 +f 2728/331/2728 2747/4448/2747 2756/2249/2756 2757/4454/2757 +f 2744/1191/2744 2758/4453/2758 2756/2249/2756 2747/4448/2747 +f 2750/609/2750 2755/4452/2755 2756/2249/2756 2758/4453/2758 +f 2754/1192/2754 2757/4454/2757 2756/2249/2756 2755/4452/2755 +f 1789/290/1789 1792/3938/1792 2759/2250/2759 2742/4445/2742 +f 1784/1057/1784 2751/4450/2751 2759/2250/2759 1792/3938/1792 +f 2750/609/2750 2758/4453/2758 2759/2250/2759 2751/4450/2751 +f 2744/1191/2744 2742/4445/2742 2759/2250/2759 2758/4453/2758 +f 2440/328/2440 2443/4285/2443 2760/2251/2760 2752/4451/2752 +f 2438/1149/2438 2761/4455/2761 2760/2251/2760 2443/4285/2443 +f 2762/610/2762 2763/4456/2763 2760/2251/2760 2761/4455/2761 +f 2754/1192/2754 2752/4451/2752 2760/2251/2760 2763/4456/2763 +f 1466/203/1466 1469/3768/1469 2764/2252/2764 2436/4281/2436 +f 1474/1009/1474 2765/4457/2765 2764/2252/2764 1469/3768/1469 +f 2762/610/2762 2761/4455/2761 2764/2252/2764 2765/4457/2765 +f 2438/1149/2438 2436/4281/2436 2764/2252/2764 2761/4455/2761 +f 1487/207/1487 2735/4440/2735 2766/2253/2766 1488/3775/1488 +f 2732/1189/2732 2767/4458/2767 2766/2253/2766 2735/4440/2735 +f 2762/610/2762 2765/4457/2765 2766/2253/2766 2767/4458/2767 +f 1474/1009/1474 1488/3775/1488 2766/2253/2766 2765/4457/2765 +f 2728/331/2728 2757/4454/2757 2768/2254/2768 2729/4436/2729 +f 2754/1192/2754 2763/4456/2763 2768/2254/2768 2757/4454/2757 +f 2762/610/2762 2767/4458/2767 2768/2254/2768 2763/4456/2763 +f 2732/1189/2732 2729/4436/2729 2768/2254/2768 2767/4458/2767 +f 626/95/626 2088/4102/2088 2769/2255/2769 1346/3705/1346 +f 2092/1107/2092 2770/4459/2770 2769/2255/2769 2088/4102/2088 +f 2771/611/2771 2772/4460/2772 2769/2255/2769 2770/4459/2770 +f 1348/992/1348 1346/3705/1346 2769/2255/2769 2772/4460/2772 +f 2079/237/2079 2773/4461/2773 2774/2256/2774 2100/4108/2100 +f 2775/1193/2775 2776/4462/2776 2774/2256/2774 2773/4461/2773 +f 2771/611/2771 2770/4459/2770 2774/2256/2774 2776/4462/2776 +f 2092/1107/2092 2100/4108/2100 2774/2256/2774 2770/4459/2770 +f 2777/239/2777 2778/4463/2778 2779/2257/2779 2780/4465/2780 +f 2781/1194/2781 2782/4464/2782 2779/2257/2779 2778/4463/2778 +f 2771/611/2771 2776/4462/2776 2779/2257/2779 2782/4464/2782 +f 2775/1193/2775 2780/4465/2780 2779/2257/2779 2776/4462/2776 +f 1352/110/1352 1355/3710/1355 2783/2258/2783 2784/4466/2784 +f 1348/992/1348 2772/4460/2772 2783/2258/2783 1355/3710/1355 +f 2771/611/2771 2782/4464/2782 2783/2258/2783 2772/4460/2772 +f 2781/1194/2781 2784/4466/2784 2783/2258/2783 2782/4464/2782 +f 2079/237/2079 2082/4097/2082 2785/2259/2785 2773/4461/2773 +f 2077/1103/2077 2786/4467/2786 2785/2259/2785 2082/4097/2082 +f 2787/612/2787 2788/4468/2788 2785/2259/2785 2786/4467/2786 +f 2775/1193/2775 2773/4461/2773 2785/2259/2785 2788/4468/2788 +f 1884/193/1884 2657/4401/2657 2789/2260/2789 2075/4092/2075 +f 2661/1181/2661 2790/4469/2790 2789/2260/2789 2657/4401/2657 +f 2787/612/2787 2786/4467/2786 2789/2260/2789 2790/4469/2790 +f 2077/1103/2077 2075/4092/2075 2789/2260/2789 2786/4467/2786 +f 2672/215/2672 2791/4470/2791 2792/2261/2792 2673/4407/2673 +f 2793/1195/2793 2794/4471/2794 2792/2261/2792 2791/4470/2791 +f 2787/612/2787 2790/4469/2790 2792/2261/2792 2794/4471/2794 +f 2661/1181/2661 2673/4407/2673 2792/2261/2792 2790/4469/2790 +f 2777/239/2777 2780/4465/2780 2795/2262/2795 2796/4472/2796 +f 2775/1193/2775 2788/4468/2788 2795/2262/2795 2780/4465/2780 +f 2787/612/2787 2794/4471/2794 2795/2262/2795 2788/4468/2788 +f 2793/1195/2793 2796/4472/2796 2795/2262/2795 2794/4471/2794 +f 2710/219/2710 2797/4473/2797 2798/2263/2798 2711/4426/2711 +f 2799/1196/2799 2800/4474/2800 2798/2263/2798 2797/4473/2797 +f 2801/613/2801 2802/4475/2802 2798/2263/2798 2800/4474/2800 +f 2714/1186/2714 2711/4426/2711 2798/2263/2798 2802/4475/2802 +f 2803/241/2803 2804/4476/2804 2805/2264/2805 2806/4478/2806 +f 2807/1197/2807 2808/4477/2808 2805/2264/2805 2804/4476/2804 +f 2801/613/2801 2800/4474/2800 2805/2264/2805 2808/4477/2808 +f 2799/1196/2799 2806/4478/2806 2805/2264/2805 2800/4474/2800 +f 2777/239/2777 2796/4472/2796 2809/2265/2809 2810/4480/2810 +f 2793/1195/2793 2811/4479/2811 2809/2265/2809 2796/4472/2796 +f 2801/613/2801 2808/4477/2808 2809/2265/2809 2811/4479/2811 +f 2807/1197/2807 2810/4480/2810 2809/2265/2809 2808/4477/2808 +f 2672/215/2672 2717/4430/2717 2812/2266/2812 2791/4470/2791 +f 2714/1186/2714 2802/4475/2802 2812/2266/2812 2717/4430/2717 +f 2801/613/2801 2811/4479/2811 2812/2266/2812 2802/4475/2802 +f 2793/1195/2793 2791/4470/2791 2812/2266/2812 2811/4479/2811 +f 2803/241/2803 2813/4481/2813 2814/2267/2814 2804/4476/2804 +f 2815/1198/2815 2816/4482/2816 2814/2267/2814 2813/4481/2813 +f 2817/614/2817 2818/4483/2818 2814/2267/2814 2816/4482/2816 +f 2807/1197/2807 2804/4476/2804 2814/2267/2814 2818/4483/2818 +f 1372/129/1372 1375/3720/1375 2819/2268/2819 2820/4485/2820 +f 1368/995/1368 2821/4484/2821 2819/2268/2819 1375/3720/1375 +f 2817/614/2817 2816/4482/2816 2819/2268/2819 2821/4484/2821 +f 2815/1198/2815 2820/4485/2820 2819/2268/2819 2816/4482/2816 +f 1352/110/1352 2784/4466/2784 2822/2269/2822 1366/3715/1366 +f 2781/1194/2781 2823/4486/2823 2822/2269/2822 2784/4466/2784 +f 2817/614/2817 2821/4484/2821 2822/2269/2822 2823/4486/2823 +f 1368/995/1368 1366/3715/1366 2822/2269/2822 2821/4484/2821 +f 2777/239/2777 2810/4480/2810 2824/2270/2824 2778/4463/2778 +f 2807/1197/2807 2818/4483/2818 2824/2270/2824 2810/4480/2810 +f 2817/614/2817 2823/4486/2823 2824/2270/2824 2818/4483/2818 +f 2781/1194/2781 2778/4463/2778 2824/2270/2824 2823/4486/2823 +f 839/199/839 2278/4202/2278 2825/2271/2825 1410/3737/1410 +f 2282/1133/2282 2826/4487/2826 2825/2271/2825 2278/4202/2278 +f 2827/615/2827 2828/4488/2828 2825/2271/2825 2826/4487/2826 +f 1412/1000/1412 1410/3737/1410 2825/2271/2825 2828/4488/2828 +f 2269/332/2269 2829/4489/2829 2830/2272/2830 2290/4208/2290 +f 2831/1199/2831 2832/4490/2832 2830/2272/2830 2829/4489/2829 +f 2827/615/2827 2826/4487/2826 2830/2272/2830 2832/4490/2832 +f 2282/1133/2282 2290/4208/2290 2830/2272/2830 2826/4487/2826 +f 2833/333/2833 2834/4491/2834 2835/2273/2835 2836/4493/2836 +f 2837/1200/2837 2838/4492/2838 2835/2273/2835 2834/4491/2834 +f 2827/615/2827 2832/4490/2832 2835/2273/2835 2838/4492/2838 +f 2831/1199/2831 2836/4493/2836 2835/2273/2835 2832/4490/2832 +f 1416/200/1416 1419/3742/1419 2839/2274/2839 2840/4494/2840 +f 1412/1000/1412 2828/4488/2828 2839/2274/2839 1419/3742/1419 +f 2827/615/2827 2838/4492/2838 2839/2274/2839 2828/4488/2828 +f 2837/1200/2837 2840/4494/2840 2839/2274/2839 2838/4492/2838 +f 2269/332/2269 2272/4197/2272 2841/2275/2841 2829/4489/2829 +f 2267/1129/2267 2842/4495/2842 2841/2275/2841 2272/4197/2272 +f 2843/616/2843 2844/4496/2844 2841/2275/2841 2842/4495/2842 +f 2831/1199/2831 2829/4489/2829 2841/2275/2841 2844/4496/2844 +f 1511/211/1511 1514/3791/1514 2845/2276/2845 2264/4191/2264 +f 1519/1016/1519 2846/4497/2846 2845/2276/2845 1514/3791/1514 +f 2843/616/2843 2842/4495/2842 2845/2276/2845 2846/4497/2846 +f 2267/1129/2267 2264/4191/2264 2845/2276/2845 2842/4495/2842 +f 1503/209/1503 2847/4498/2847 2848/2277/2848 1529/3798/1529 +f 2849/1201/2849 2850/4499/2850 2848/2277/2848 2847/4498/2847 +f 2843/616/2843 2846/4497/2846 2848/2277/2848 2850/4499/2850 +f 1519/1016/1519 1529/3798/1529 2848/2277/2848 2846/4497/2846 +f 2833/333/2833 2836/4493/2836 2851/2278/2851 2852/4500/2852 +f 2831/1199/2831 2844/4496/2844 2851/2278/2851 2836/4493/2836 +f 2843/616/2843 2850/4499/2850 2851/2278/2851 2844/4496/2844 +f 2849/1201/2849 2852/4500/2852 2851/2278/2851 2850/4499/2850 +f 1497/208/1497 2115/4117/2115 2853/2279/2853 1498/3780/1498 +f 2119/1111/2119 2854/4501/2854 2853/2279/2853 2115/4117/2115 +f 2855/617/2855 2856/4502/2856 2853/2279/2853 2854/4501/2854 +f 1501/1011/1501 1498/3780/1498 2853/2279/2853 2856/4502/2856 +f 2130/315/2130 2857/4503/2857 2858/2280/2858 2131/4123/2131 +f 2859/1202/2859 2860/4504/2860 2858/2280/2858 2857/4503/2857 +f 2855/617/2855 2854/4501/2854 2858/2280/2858 2860/4504/2860 +f 2119/1111/2119 2131/4123/2131 2858/2280/2858 2854/4501/2854 +f 2833/333/2833 2852/4500/2852 2861/2281/2861 2862/4506/2862 +f 2849/1201/2849 2863/4505/2863 2861/2281/2861 2852/4500/2852 +f 2855/617/2855 2860/4504/2860 2861/2281/2861 2863/4505/2863 +f 2859/1202/2859 2862/4506/2862 2861/2281/2861 2860/4504/2860 +f 1503/209/1503 1506/3785/1506 2864/2282/2864 2847/4498/2847 +f 1501/1011/1501 2856/4502/2856 2864/2282/2864 1506/3785/1506 +f 2855/617/2855 2863/4505/2863 2864/2282/2864 2856/4502/2856 +f 2849/1201/2849 2847/4498/2847 2864/2282/2864 2863/4505/2863 +f 2130/315/2130 2174/4146/2174 2865/2283/2865 2857/4503/2857 +f 2171/1116/2171 2866/4507/2866 2865/2283/2865 2174/4146/2174 +f 2867/618/2867 2868/4508/2868 2865/2283/2865 2866/4507/2866 +f 2859/1202/2859 2857/4503/2857 2865/2283/2865 2868/4508/2868 +f 684/86/684 1437/3751/1437 2869/2284/2869 2169/4143/2169 +f 1432/1003/1432 2870/4509/2870 2869/2284/2869 1437/3751/1437 +f 2867/618/2867 2866/4507/2866 2869/2284/2869 2870/4509/2870 +f 2171/1116/2171 2169/4143/2169 2869/2284/2869 2866/4507/2866 +f 1416/200/1416 2840/4494/2840 2871/2285/2871 1430/3747/1430 +f 2837/1200/2837 2872/4510/2872 2871/2285/2871 2840/4494/2840 +f 2867/618/2867 2870/4509/2870 2871/2285/2871 2872/4510/2872 +f 1432/1003/1432 1430/3747/1430 2871/2285/2871 2870/4509/2870 +f 2833/333/2833 2862/4506/2862 2873/2286/2873 2834/4491/2834 +f 2859/1202/2859 2868/4508/2868 2873/2286/2873 2862/4506/2862 +f 2867/618/2867 2872/4510/2872 2873/2286/2873 2868/4508/2868 +f 2837/1200/2837 2834/4491/2834 2873/2286/2873 2872/4510/2872 +f 2874/89/2874 2875/4511/2875 2876/2287/2876 2877/4514/2877 +f 2878/1203/2878 2879/4512/2879 2876/2287/2876 2875/4511/2875 +f 2880/619/2880 2881/4513/2881 2876/2287/2876 2879/4512/2879 +f 2882/1206/2882 2877/4514/2877 2876/2287/2876 2881/4513/2881 +f 2883/92/2883 2884/4515/2884 2885/2288/2885 2886/4517/2886 +f 2887/1204/2887 2888/4516/2888 2885/2288/2885 2884/4515/2884 +f 2880/619/2880 2879/4512/2879 2885/2288/2885 2888/4516/2888 +f 2878/1203/2878 2886/4517/2886 2885/2288/2885 2879/4512/2879 +f 2889/93/2889 2890/4518/2890 2891/2289/2891 2892/4520/2892 +f 2893/1205/2893 2894/4519/2894 2891/2289/2891 2890/4518/2890 +f 2880/619/2880 2888/4516/2888 2891/2289/2891 2894/4519/2894 +f 2887/1204/2887 2892/4520/2892 2891/2289/2891 2888/4516/2888 +f 2895/94/2895 2896/4521/2896 2897/2290/2897 2898/4522/2898 +f 2882/1206/2882 2881/4513/2881 2897/2290/2897 2896/4521/2896 +f 2880/619/2880 2894/4519/2894 2897/2290/2897 2881/4513/2881 +f 2893/1205/2893 2898/4522/2898 2897/2290/2897 2894/4519/2894 +f 2883/92/2883 2899/4523/2899 2900/2291/2900 2884/4515/2884 +f 2901/1207/2901 2902/4524/2902 2900/2291/2900 2899/4523/2899 +f 2903/620/2903 2904/4525/2904 2900/2291/2900 2902/4524/2902 +f 2887/1204/2887 2884/4515/2884 2900/2291/2900 2904/4525/2904 +f 2905/96/2905 2906/4526/2906 2907/2292/2907 2908/4528/2908 +f 2909/1208/2909 2910/4527/2910 2907/2292/2907 2906/4526/2906 +f 2903/620/2903 2902/4524/2902 2907/2292/2907 2910/4527/2910 +f 2901/1207/2901 2908/4528/2908 2907/2292/2907 2902/4524/2902 +f 2911/97/2911 2912/4529/2912 2913/2293/2913 2914/4531/2914 +f 2915/1209/2915 2916/4530/2916 2913/2293/2913 2912/4529/2912 +f 2903/620/2903 2910/4527/2910 2913/2293/2913 2916/4530/2916 +f 2909/1208/2909 2914/4531/2914 2913/2293/2913 2910/4527/2910 +f 2889/93/2889 2892/4520/2892 2917/2294/2917 2918/4532/2918 +f 2887/1204/2887 2904/4525/2904 2917/2294/2917 2892/4520/2892 +f 2903/620/2903 2916/4530/2916 2917/2294/2917 2904/4525/2904 +f 2915/1209/2915 2918/4532/2918 2917/2294/2917 2916/4530/2916 +f 2919/98/2919 2920/4533/2920 2921/2295/2921 2922/4537/2922 +f 2923/1210/2923 2924/4535/2924 2921/2295/2921 2920/4533/2920 +f 2925/621/2925 2926/4536/2926 2921/2295/2921 2924/4535/2924 +f 2927/1213/2927 2922/4537/2922 2921/2295/2921 2926/4536/2926 +f 2928/99/2928 2929/4538/2929 2930/2296/2930 2931/4540/2931 +f 2932/1212/2932 2933/4539/2933 2930/2296/2930 2929/4538/2929 +f 2925/621/2925 2924/4535/2924 2930/2296/2930 2933/4539/2933 +f 2923/1210/2923 2931/4540/2931 2930/2296/2930 2924/4535/2924 +f 2889/93/2889 2918/4532/2918 2934/2297/2934 2935/4543/2935 +f 2915/1209/2915 2936/4542/2936 2934/2297/2934 2918/4532/2918 +f 2925/621/2925 2933/4539/2933 2934/2297/2934 2936/4542/2936 +f 2932/1212/2932 2935/4543/2935 2934/2297/2934 2933/4539/2933 +f 2911/97/2911 2937/4544/2937 2938/2298/2938 2912/4529/2912 +f 2927/1213/2927 2926/4536/2926 2938/2298/2938 2937/4544/2937 +f 2925/621/2925 2936/4542/2936 2938/2298/2938 2926/4536/2926 +f 2915/1209/2915 2912/4529/2912 2938/2298/2938 2936/4542/2936 +f 2928/99/2928 2939/4545/2939 2940/2299/2940 2929/4538/2929 +f 2941/1214/2941 2942/4547/2942 2940/2299/2940 2939/4545/2939 +f 2943/622/2943 2944/4548/2944 2940/2299/2940 2942/4547/2942 +f 2932/1212/2932 2929/4538/2929 2940/2299/2940 2944/4548/2944 +f 2945/100/2945 2946/4549/2946 2947/2300/2947 2948/4551/2948 +f 2949/1216/2949 2950/4550/2950 2947/2300/2947 2946/4549/2946 +f 2943/622/2943 2942/4547/2942 2947/2300/2947 2950/4550/2950 +f 2941/1214/2941 2948/4551/2948 2947/2300/2947 2942/4547/2942 +f 2895/94/2895 2898/4522/2898 2951/2301/2951 2952/4554/2952 +f 2893/1205/2893 2953/4553/2953 2951/2301/2951 2898/4522/2898 +f 2943/622/2943 2950/4550/2950 2951/2301/2951 2953/4553/2953 +f 2949/1216/2949 2952/4554/2952 2951/2301/2951 2950/4550/2950 +f 2889/93/2889 2935/4543/2935 2954/2302/2954 2890/4518/2890 +f 2932/1212/2932 2944/4548/2944 2954/2302/2954 2935/4543/2935 +f 2943/622/2943 2953/4553/2953 2954/2302/2954 2944/4548/2944 +f 2893/1205/2893 2890/4518/2890 2954/2302/2954 2953/4553/2953 +f 2955/101/2955 2956/4555/2956 2957/2303/2957 2958/4558/2958 +f 2959/1217/2959 2960/4556/2960 2957/2303/2957 2956/4555/2956 +f 2961/623/2961 2962/4557/2962 2957/2303/2957 2960/4556/2960 +f 2963/1220/2963 2958/4558/2958 2957/2303/2957 2962/4557/2962 +f 2964/102/2964 2965/4559/2965 2966/2304/2966 2967/4561/2967 +f 2968/1218/2968 2969/4560/2969 2966/2304/2966 2965/4559/2965 +f 2961/623/2961 2960/4556/2960 2966/2304/2966 2969/4560/2969 +f 2959/1217/2959 2967/4561/2967 2966/2304/2966 2960/4556/2960 +f 2970/103/2970 2971/4562/2971 2972/2305/2972 2973/4564/2973 +f 2974/1219/2974 2975/4563/2975 2972/2305/2972 2971/4562/2971 +f 2961/623/2961 2969/4560/2969 2972/2305/2972 2975/4563/2975 +f 2968/1218/2968 2973/4564/2973 2972/2305/2972 2969/4560/2969 +f 2976/104/2976 2977/4565/2977 2978/2306/2978 2979/4566/2979 +f 2963/1220/2963 2962/4557/2962 2978/2306/2978 2977/4565/2977 +f 2961/623/2961 2975/4563/2975 2978/2306/2978 2962/4557/2962 +f 2974/1219/2974 2979/4566/2979 2978/2306/2978 2975/4563/2975 +f 2964/102/2964 2980/4567/2980 2981/2307/2981 2965/4559/2965 +f 2982/1221/2982 2983/4569/2983 2981/2307/2981 2980/4567/2980 +f 2984/624/2984 2985/4570/2985 2981/2307/2981 2983/4569/2983 +f 2968/1218/2968 2965/4559/2965 2981/2307/2981 2985/4570/2985 +f 2986/105/2986 2987/4571/2987 2988/2308/2988 2989/4574/2989 +f 2990/1223/2990 2991/4573/2991 2988/2308/2988 2987/4571/2987 +f 2984/624/2984 2983/4569/2983 2988/2308/2988 2991/4573/2991 +f 2982/1221/2982 2989/4574/2989 2988/2308/2988 2983/4569/2983 +f 2992/106/2992 2993/4576/2993 2994/2309/2994 2995/4578/2995 +f 2996/1225/2996 2997/4577/2997 2994/2309/2994 2993/4576/2993 +f 2984/624/2984 2991/4573/2991 2994/2309/2994 2997/4577/2997 +f 2990/1223/2990 2995/4578/2995 2994/2309/2994 2991/4573/2991 +f 2970/103/2970 2973/4564/2973 2998/2310/2998 2999/4580/2999 +f 2968/1218/2968 2985/4570/2985 2998/2310/2998 2973/4564/2973 +f 2984/624/2984 2997/4577/2997 2998/2310/2998 2985/4570/2985 +f 2996/1225/2996 2999/4580/2999 2998/2310/2998 2997/4577/2997 +f 3000/109/3000 3001/4581/3001 3002/2311/3002 3003/4584/3003 +f 3004/1226/3004 3005/4582/3005 3002/2311/3002 3001/4581/3001 +f 3006/625/3006 3007/4583/3007 3002/2311/3002 3005/4582/3005 +f 3008/1228/3008 3003/4584/3003 3002/2311/3002 3007/4583/3007 +f 3009/111/3009 3010/4586/3010 3011/2312/3011 3012/4588/3012 +f 3013/1227/3013 3014/4587/3014 3011/2312/3011 3010/4586/3010 +f 3006/625/3006 3005/4582/3005 3011/2312/3011 3014/4587/3014 +f 3004/1226/3004 3012/4588/3012 3011/2312/3011 3005/4582/3005 +f 2970/103/2970 2999/4580/2999 3015/2313/3015 3016/4590/3016 +f 2996/1225/2996 3017/4589/3017 3015/2313/3015 2999/4580/2999 +f 3006/625/3006 3014/4587/3014 3015/2313/3015 3017/4589/3017 +f 3013/1227/3013 3016/4590/3016 3015/2313/3015 3014/4587/3014 +f 2992/106/2992 3018/4591/3018 3019/2314/3019 2993/4576/2993 +f 3008/1228/3008 3007/4583/3007 3019/2314/3019 3018/4591/3018 +f 3006/625/3006 3017/4589/3017 3019/2314/3019 3007/4583/3007 +f 2996/1225/2996 2993/4576/2993 3019/2314/3019 3017/4589/3017 +f 3009/111/3009 3020/4593/3020 3021/2315/3021 3010/4586/3010 +f 3022/1230/3022 3023/4594/3023 3021/2315/3021 3020/4593/3020 +f 3024/626/3024 3025/4595/3025 3021/2315/3021 3023/4594/3023 +f 3013/1227/3013 3010/4586/3010 3021/2315/3021 3025/4595/3025 +f 3026/112/3026 3027/4596/3027 3028/2316/3028 3029/4598/3029 +f 3030/1231/3030 3031/4597/3031 3028/2316/3028 3027/4596/3027 +f 3024/626/3024 3023/4594/3023 3028/2316/3028 3031/4597/3031 +f 3022/1230/3022 3029/4598/3029 3028/2316/3028 3023/4594/3023 +f 2976/104/2976 2979/4566/2979 3032/2317/3032 3033/4600/3033 +f 2974/1219/2974 3034/4599/3034 3032/2317/3032 2979/4566/2979 +f 3024/626/3024 3031/4597/3031 3032/2317/3032 3034/4599/3034 +f 3030/1231/3030 3033/4600/3033 3032/2317/3032 3031/4597/3031 +f 2970/103/2970 3016/4590/3016 3035/2318/3035 2971/4562/2971 +f 3013/1227/3013 3025/4595/3025 3035/2318/3035 3016/4590/3016 +f 3024/626/3024 3034/4599/3034 3035/2318/3035 3025/4595/3025 +f 2974/1219/2974 2971/4562/2971 3035/2318/3035 3034/4599/3034 +f 2905/96/2905 2908/4528/2908 3036/2319/3036 3037/4603/3037 +f 2901/1207/2901 3038/4601/3038 3036/2319/3036 2908/4528/2908 +f 3039/627/3039 3040/4602/3040 3036/2319/3036 3038/4601/3038 +f 3041/1234/3041 3037/4603/3037 3036/2319/3036 3040/4602/3040 +f 2883/92/2883 3042/4604/3042 3043/2320/3043 2899/4523/2899 +f 3044/1232/3044 3045/4605/3045 3043/2320/3043 3042/4604/3042 +f 3039/627/3039 3038/4601/3038 3043/2320/3043 3045/4605/3045 +f 2901/1207/2901 2899/4523/2899 3043/2320/3043 3038/4601/3038 +f 3046/114/3046 3047/4606/3047 3048/2321/3048 3049/4608/3049 +f 3050/1233/3050 3051/4607/3051 3048/2321/3048 3047/4606/3047 +f 3039/627/3039 3045/4605/3045 3048/2321/3048 3051/4607/3051 +f 3044/1232/3044 3049/4608/3049 3048/2321/3048 3045/4605/3045 +f 3052/116/3052 3053/4609/3053 3054/2322/3054 3055/4610/3055 +f 3041/1234/3041 3040/4602/3040 3054/2322/3054 3053/4609/3053 +f 3039/627/3039 3051/4607/3051 3054/2322/3054 3040/4602/3040 +f 3050/1233/3050 3055/4610/3055 3054/2322/3054 3051/4607/3051 +f 2883/92/2883 2886/4517/2886 3056/2323/3056 3042/4604/3042 +f 2878/1203/2878 3057/4611/3057 3056/2323/3056 2886/4517/2886 +f 3058/628/3058 3059/4612/3059 3056/2323/3056 3057/4611/3057 +f 3044/1232/3044 3042/4604/3042 3056/2323/3056 3059/4612/3059 +f 2874/89/2874 3060/4613/3060 3061/2324/3061 2875/4511/2875 +f 3062/1235/3062 3063/4614/3063 3061/2324/3061 3060/4613/3060 +f 3058/628/3058 3057/4611/3057 3061/2324/3061 3063/4614/3063 +f 2878/1203/2878 2875/4511/2875 3061/2324/3061 3057/4611/3057 +f 3064/118/3064 3065/4615/3065 3066/2325/3066 3067/4617/3067 +f 3068/1236/3068 3069/4616/3069 3066/2325/3066 3065/4615/3065 +f 3058/628/3058 3063/4614/3063 3066/2325/3066 3069/4616/3069 +f 3062/1235/3062 3067/4617/3067 3066/2325/3066 3063/4614/3063 +f 3046/114/3046 3049/4608/3049 3070/2326/3070 3071/4618/3071 +f 3044/1232/3044 3059/4612/3059 3070/2326/3070 3049/4608/3049 +f 3058/628/3058 3069/4616/3069 3070/2326/3070 3059/4612/3059 +f 3068/1236/3068 3071/4618/3071 3070/2326/3070 3069/4616/3069 +f 3072/119/3072 3073/4619/3073 3074/2327/3074 3075/4622/3075 +f 3076/1237/3076 3077/4620/3077 3074/2327/3074 3073/4619/3073 +f 3078/629/3078 3079/4621/3079 3074/2327/3074 3077/4620/3077 +f 3080/1239/3080 3075/4622/3075 3074/2327/3074 3079/4621/3079 +f 3081/120/3081 3082/4623/3082 3083/2328/3083 3084/4625/3084 +f 3085/1238/3085 3086/4624/3086 3083/2328/3083 3082/4623/3082 +f 3078/629/3078 3077/4620/3077 3083/2328/3083 3086/4624/3086 +f 3076/1237/3076 3084/4625/3084 3083/2328/3083 3077/4620/3077 +f 3046/114/3046 3071/4618/3071 3087/2329/3087 3088/4627/3088 +f 3068/1236/3068 3089/4626/3089 3087/2329/3087 3071/4618/3071 +f 3078/629/3078 3086/4624/3086 3087/2329/3087 3089/4626/3089 +f 3085/1238/3085 3088/4627/3088 3087/2329/3087 3086/4624/3086 +f 3064/118/3064 3090/4628/3090 3091/2330/3091 3065/4615/3065 +f 3080/1239/3080 3079/4621/3079 3091/2330/3091 3090/4628/3090 +f 3078/629/3078 3089/4626/3089 3091/2330/3091 3079/4621/3079 +f 3068/1236/3068 3065/4615/3065 3091/2330/3091 3089/4626/3089 +f 3081/120/3081 3092/4629/3092 3093/2331/3093 3082/4623/3082 +f 3094/1240/3094 3095/4630/3095 3093/2331/3093 3092/4629/3092 +f 3096/630/3096 3097/4631/3097 3093/2331/3093 3095/4630/3095 +f 3085/1238/3085 3082/4623/3082 3093/2331/3093 3097/4631/3097 +f 3098/121/3098 3099/4632/3099 3100/2332/3100 3101/4634/3101 +f 3102/1241/3102 3103/4633/3103 3100/2332/3100 3099/4632/3099 +f 3096/630/3096 3095/4630/3095 3100/2332/3100 3103/4633/3103 +f 3094/1240/3094 3101/4634/3101 3100/2332/3100 3095/4630/3095 +f 3052/116/3052 3055/4610/3055 3104/2333/3104 3105/4636/3105 +f 3050/1233/3050 3106/4635/3106 3104/2333/3104 3055/4610/3055 +f 3096/630/3096 3103/4633/3103 3104/2333/3104 3106/4635/3106 +f 3102/1241/3102 3105/4636/3105 3104/2333/3104 3103/4633/3103 +f 3046/114/3046 3088/4627/3088 3107/2334/3107 3047/4606/3047 +f 3085/1238/3085 3097/4631/3097 3107/2334/3107 3088/4627/3088 +f 3096/630/3096 3106/4635/3106 3107/2334/3107 3097/4631/3097 +f 3050/1233/3050 3047/4606/3047 3107/2334/3107 3106/4635/3106 +f 3108/130/3108 3109/4637/3109 3110/2335/3110 3111/4640/3111 +f 3112/1242/3112 3113/4638/3113 3110/2335/3110 3109/4637/3109 +f 3114/631/3114 3115/4639/3115 3110/2335/3110 3113/4638/3113 +f 3116/1245/3116 3111/4640/3111 3110/2335/3110 3115/4639/3115 +f 3117/132/3117 3118/4641/3118 3119/2336/3119 3120/4643/3120 +f 3121/1243/3121 3122/4642/3122 3119/2336/3119 3118/4641/3118 +f 3114/631/3114 3113/4638/3113 3119/2336/3119 3122/4642/3122 +f 3112/1242/3112 3120/4643/3120 3119/2336/3119 3113/4638/3113 +f 3123/133/3123 3124/4644/3124 3125/2337/3125 3126/4646/3126 +f 3127/1244/3127 3128/4645/3128 3125/2337/3125 3124/4644/3124 +f 3114/631/3114 3122/4642/3122 3125/2337/3125 3128/4645/3128 +f 3121/1243/3121 3126/4646/3126 3125/2337/3125 3122/4642/3122 +f 3129/134/3129 3130/4647/3130 3131/2338/3131 3132/4648/3132 +f 3116/1245/3116 3115/4639/3115 3131/2338/3131 3130/4647/3130 +f 3114/631/3114 3128/4645/3128 3131/2338/3131 3115/4639/3115 +f 3127/1244/3127 3132/4648/3132 3131/2338/3131 3128/4645/3128 +f 3117/132/3117 3133/4649/3133 3134/2339/3134 3118/4641/3118 +f 3135/1246/3135 3136/4650/3136 3134/2339/3134 3133/4649/3133 +f 3137/632/3137 3138/4651/3138 3134/2339/3134 3136/4650/3136 +f 3121/1243/3121 3118/4641/3118 3134/2339/3134 3138/4651/3138 +f 3139/137/3139 3140/4652/3140 3141/2340/3141 3142/4654/3142 +f 3143/1247/3143 3144/4653/3144 3141/2340/3141 3140/4652/3140 +f 3137/632/3137 3136/4650/3136 3141/2340/3141 3144/4653/3144 +f 3135/1246/3135 3142/4654/3142 3141/2340/3141 3136/4650/3136 +f 3145/138/3145 3146/4655/3146 3147/2341/3147 3148/4657/3148 +f 3149/1248/3149 3150/4656/3150 3147/2341/3147 3146/4655/3146 +f 3137/632/3137 3144/4653/3144 3147/2341/3147 3150/4656/3150 +f 3143/1247/3143 3148/4657/3148 3147/2341/3147 3144/4653/3144 +f 3123/133/3123 3126/4646/3126 3151/2342/3151 3152/4658/3152 +f 3121/1243/3121 3138/4651/3138 3151/2342/3151 3126/4646/3126 +f 3137/632/3137 3150/4656/3150 3151/2342/3151 3138/4651/3138 +f 3149/1248/3149 3152/4658/3152 3151/2342/3151 3150/4656/3150 +f 3026/112/3026 3153/4659/3153 3154/2343/3154 3155/4662/3155 +f 3156/1249/3156 3157/4660/3157 3154/2343/3154 3153/4659/3153 +f 3158/633/3158 3159/4661/3159 3154/2343/3154 3157/4660/3157 +f 3160/1251/3160 3155/4662/3155 3154/2343/3154 3159/4661/3159 +f 3161/140/3161 3162/4663/3162 3163/2344/3163 3164/4665/3164 +f 3165/1250/3165 3166/4664/3166 3163/2344/3163 3162/4663/3162 +f 3158/633/3158 3157/4660/3157 3163/2344/3163 3166/4664/3166 +f 3156/1249/3156 3164/4665/3164 3163/2344/3163 3157/4660/3157 +f 3123/133/3123 3152/4658/3152 3167/2345/3167 3168/4667/3168 +f 3149/1248/3149 3169/4666/3169 3167/2345/3167 3152/4658/3152 +f 3158/633/3158 3166/4664/3166 3167/2345/3167 3169/4666/3169 +f 3165/1250/3165 3168/4667/3168 3167/2345/3167 3166/4664/3166 +f 3145/138/3145 3170/4668/3170 3171/2346/3171 3146/4655/3146 +f 3160/1251/3160 3159/4661/3159 3171/2346/3171 3170/4668/3170 +f 3158/633/3158 3169/4666/3169 3171/2346/3171 3159/4661/3159 +f 3149/1248/3149 3146/4655/3146 3171/2346/3171 3169/4666/3169 +f 3161/140/3161 3172/4669/3172 3173/2347/3173 3162/4663/3162 +f 3174/1252/3174 3175/4670/3175 3173/2347/3173 3172/4669/3172 +f 3176/634/3176 3177/4671/3177 3173/2347/3173 3175/4670/3175 +f 3165/1250/3165 3162/4663/3162 3173/2347/3173 3177/4671/3177 +f 3178/141/3178 3179/4672/3179 3180/2348/3180 3181/4674/3181 +f 3182/1253/3182 3183/4673/3183 3180/2348/3180 3179/4672/3179 +f 3176/634/3176 3175/4670/3175 3180/2348/3180 3183/4673/3183 +f 3174/1252/3174 3181/4674/3181 3180/2348/3180 3175/4670/3175 +f 3129/134/3129 3132/4648/3132 3184/2349/3184 3185/4676/3185 +f 3127/1244/3127 3186/4675/3186 3184/2349/3184 3132/4648/3132 +f 3176/634/3176 3183/4673/3183 3184/2349/3184 3186/4675/3186 +f 3182/1253/3182 3185/4676/3185 3184/2349/3184 3183/4673/3183 +f 3123/133/3123 3168/4667/3168 3187/2350/3187 3124/4644/3124 +f 3165/1250/3165 3177/4671/3177 3187/2350/3187 3168/4667/3168 +f 3176/634/3176 3186/4675/3186 3187/2350/3187 3177/4671/3177 +f 3127/1244/3127 3124/4644/3124 3187/2350/3187 3186/4675/3186 +f 3188/142/3188 3189/4677/3189 3190/2351/3190 3191/4680/3191 +f 3192/1254/3192 3193/4678/3193 3190/2351/3190 3189/4677/3189 +f 3194/635/3194 3195/4679/3195 3190/2351/3190 3193/4678/3193 +f 3196/1258/3196 3191/4680/3191 3190/2351/3190 3195/4679/3195 +f 3197/143/3197 3198/4681/3198 3199/2352/3199 3200/4684/3200 +f 3201/1255/3201 3202/4683/3202 3199/2352/3199 3198/4681/3198 +f 3194/635/3194 3193/4678/3193 3199/2352/3199 3202/4683/3202 +f 3192/1254/3192 3200/4684/3200 3199/2352/3199 3193/4678/3193 +f 3203/144/3203 3204/4685/3204 3205/2353/3205 3206/4687/3206 +f 3207/1257/3207 3208/4686/3208 3205/2353/3205 3204/4685/3204 +f 3194/635/3194 3202/4683/3202 3205/2353/3205 3208/4686/3208 +f 3201/1255/3201 3206/4687/3206 3205/2353/3205 3202/4683/3202 +f 3209/145/3209 3210/4689/3210 3211/2354/3211 3212/4690/3212 +f 3196/1258/3196 3195/4679/3195 3211/2354/3211 3210/4689/3210 +f 3194/635/3194 3208/4686/3208 3211/2354/3211 3195/4679/3195 +f 3207/1257/3207 3212/4690/3212 3211/2354/3211 3208/4686/3208 +f 3197/386/3197 3213/4691/3213 3214/2355/3214 3198/4682/3198 +f 3215/1259/3215 3216/4692/3216 3214/2355/3214 3213/4691/3213 +f 3217/636/3217 3218/4693/3218 3214/2355/3214 3216/4692/3216 +f 3201/1256/3201 3198/4682/3198 3214/2355/3214 3218/4693/3218 +f 3219/387/3219 3220/4694/3220 3221/2356/3221 3222/4696/3222 +f 3223/1260/3223 3224/4695/3224 3221/2356/3221 3220/4694/3220 +f 3217/636/3217 3216/4692/3216 3221/2356/3221 3224/4695/3224 +f 3215/1259/3215 3222/4696/3222 3221/2356/3221 3216/4692/3216 +f 3225/413/3225 3226/4697/3226 3227/2357/3227 3228/4699/3228 +f 3229/1261/3229 3230/4698/3230 3227/2357/3227 3226/4697/3226 +f 3217/636/3217 3224/4695/3224 3227/2357/3227 3230/4698/3230 +f 3223/1260/3223 3228/4699/3228 3227/2357/3227 3224/4695/3224 +f 3203/414/3203 3206/4688/3206 3231/2358/3231 3232/4700/3232 +f 3201/1256/3201 3218/4693/3218 3231/2358/3231 3206/4688/3206 +f 3217/636/3217 3230/4698/3230 3231/2358/3231 3218/4693/3218 +f 3229/1261/3229 3232/4700/3232 3231/2358/3231 3230/4698/3230 +f 2986/417/2986 2989/4575/2989 3233/2359/3233 3234/4703/3234 +f 2982/1222/2982 3235/4701/3235 3233/2359/3233 2989/4575/2989 +f 3236/637/3236 3237/4702/3237 3233/2359/3233 3235/4701/3235 +f 3238/1264/3238 3234/4703/3234 3233/2359/3233 3237/4702/3237 +f 2964/418/2964 3239/4704/3239 3240/2360/3240 2980/4568/2980 +f 3241/1262/3241 3242/4706/3242 3240/2360/3240 3239/4704/3239 +f 3236/637/3236 3235/4701/3235 3240/2360/3240 3242/4706/3242 +f 2982/1222/2982 2980/4568/2980 3240/2360/3240 3235/4701/3235 +f 3203/414/3203 3232/4700/3232 3243/2361/3243 3244/4708/3244 +f 3229/1261/3229 3245/4707/3245 3243/2361/3243 3232/4700/3232 +f 3236/637/3236 3242/4706/3242 3243/2361/3243 3245/4707/3245 +f 3241/1262/3241 3244/4708/3244 3243/2361/3243 3242/4706/3242 +f 3225/413/3225 3246/4710/3246 3247/2362/3247 3226/4697/3226 +f 3238/1264/3238 3237/4702/3237 3247/2362/3247 3246/4710/3246 +f 3236/637/3236 3245/4707/3245 3247/2362/3247 3237/4702/3237 +f 3229/1261/3229 3226/4697/3226 3247/2362/3247 3245/4707/3245 +f 2964/102/2964 2967/4561/2967 3248/2363/3248 3239/4705/3239 +f 2959/1217/2959 3249/4711/3249 3248/2363/3248 2967/4561/2967 +f 3250/638/3250 3251/4712/3251 3248/2363/3248 3249/4711/3249 +f 3241/1263/3241 3239/4705/3239 3248/2363/3248 3251/4712/3251 +f 2955/101/2955 3252/4713/3252 3253/2364/3253 2956/4555/2956 +f 3254/1265/3254 3255/4714/3255 3253/2364/3253 3252/4713/3252 +f 3250/638/3250 3249/4711/3249 3253/2364/3253 3255/4714/3255 +f 2959/1217/2959 2956/4555/2956 3253/2364/3253 3249/4711/3249 +f 3209/145/3209 3212/4690/3212 3256/2365/3256 3257/4716/3257 +f 3207/1257/3207 3258/4715/3258 3256/2365/3256 3212/4690/3212 +f 3250/638/3250 3255/4714/3255 3256/2365/3256 3258/4715/3258 +f 3254/1265/3254 3257/4716/3257 3256/2365/3256 3255/4714/3255 +f 3203/144/3203 3244/4709/3244 3259/2366/3259 3204/4685/3204 +f 3241/1263/3241 3251/4712/3251 3259/2366/3259 3244/4709/3244 +f 3250/638/3250 3258/4715/3258 3259/2366/3259 3251/4712/3251 +f 3207/1257/3207 3204/4685/3204 3259/2366/3259 3258/4715/3258 +f 3026/112/3026 3029/4598/3029 3260/2367/3260 3153/4659/3153 +f 3022/1230/3022 3261/4717/3261 3260/2367/3260 3029/4598/3029 +f 3262/639/3262 3263/4718/3263 3260/2367/3260 3261/4717/3261 +f 3156/1249/3156 3153/4659/3153 3260/2367/3260 3263/4718/3263 +f 3009/111/3009 3264/4719/3264 3265/2368/3265 3020/4593/3020 +f 3266/1266/3266 3267/4720/3267 3265/2368/3265 3264/4719/3264 +f 3262/639/3262 3261/4717/3261 3265/2368/3265 3267/4720/3267 +f 3022/1230/3022 3020/4593/3020 3265/2368/3265 3261/4717/3261 +f 3268/146/3268 3269/4721/3269 3270/2369/3270 3271/4723/3271 +f 3272/1267/3272 3273/4722/3273 3270/2369/3270 3269/4721/3269 +f 3262/639/3262 3267/4720/3267 3270/2369/3270 3273/4722/3273 +f 3266/1266/3266 3271/4723/3271 3270/2369/3270 3267/4720/3267 +f 3161/140/3161 3164/4665/3164 3274/2370/3274 3275/4724/3275 +f 3156/1249/3156 3263/4718/3263 3274/2370/3274 3164/4665/3164 +f 3262/639/3262 3273/4722/3273 3274/2370/3274 3263/4718/3263 +f 3272/1267/3272 3275/4724/3275 3274/2370/3274 3273/4722/3273 +f 3009/111/3009 3012/4588/3012 3276/2371/3276 3264/4719/3264 +f 3004/1226/3004 3277/4725/3277 3276/2371/3276 3012/4588/3012 +f 3278/640/3278 3279/4726/3279 3276/2371/3276 3277/4725/3277 +f 3266/1266/3266 3264/4719/3264 3276/2371/3276 3279/4726/3279 +f 3000/109/3000 3280/4727/3280 3281/2372/3281 3001/4581/3001 +f 3282/1268/3282 3283/4729/3283 3281/2372/3281 3280/4727/3280 +f 3278/640/3278 3277/4725/3277 3281/2372/3281 3283/4729/3283 +f 3004/1226/3004 3001/4581/3001 3281/2372/3281 3277/4725/3277 +f 3284/147/3284 3285/4730/3285 3286/2373/3286 3287/4732/3287 +f 3288/1270/3288 3289/4731/3289 3286/2373/3286 3285/4730/3285 +f 3278/640/3278 3283/4729/3283 3286/2373/3286 3289/4731/3289 +f 3282/1268/3282 3287/4732/3287 3286/2373/3286 3283/4729/3283 +f 3268/146/3268 3271/4723/3271 3290/2374/3290 3291/4734/3291 +f 3266/1266/3266 3279/4726/3279 3290/2374/3290 3271/4723/3271 +f 3278/640/3278 3289/4731/3289 3290/2374/3290 3279/4726/3279 +f 3288/1270/3288 3291/4734/3291 3290/2374/3290 3289/4731/3289 +f 3292/148/3292 3293/4735/3293 3294/2375/3294 3295/4738/3295 +f 3296/1271/3296 3297/4736/3297 3294/2375/3294 3293/4735/3293 +f 3298/641/3298 3299/4737/3299 3294/2375/3294 3297/4736/3297 +f 3300/1273/3300 3295/4738/3295 3294/2375/3294 3299/4737/3299 +f 3301/149/3301 3302/4740/3302 3303/2376/3303 3304/4742/3304 +f 3305/1272/3305 3306/4741/3306 3303/2376/3303 3302/4740/3302 +f 3298/641/3298 3297/4736/3297 3303/2376/3303 3306/4741/3306 +f 3296/1271/3296 3304/4742/3304 3303/2376/3303 3297/4736/3297 +f 3268/146/3268 3291/4734/3291 3307/2377/3307 3308/4744/3308 +f 3288/1270/3288 3309/4743/3309 3307/2377/3307 3291/4734/3291 +f 3298/641/3298 3306/4741/3306 3307/2377/3307 3309/4743/3309 +f 3305/1272/3305 3308/4744/3308 3307/2377/3307 3306/4741/3306 +f 3284/147/3284 3310/4745/3310 3311/2378/3311 3285/4730/3285 +f 3300/1273/3300 3299/4737/3299 3311/2378/3311 3310/4745/3310 +f 3298/641/3298 3309/4743/3309 3311/2378/3311 3299/4737/3299 +f 3288/1270/3288 3285/4730/3285 3311/2378/3311 3309/4743/3309 +f 3301/149/3301 3312/4747/3312 3313/2379/3313 3302/4740/3302 +f 3314/1275/3314 3315/4748/3315 3313/2379/3313 3312/4747/3312 +f 3316/642/3316 3317/4749/3317 3313/2379/3313 3315/4748/3315 +f 3305/1272/3305 3302/4740/3302 3313/2379/3313 3317/4749/3317 +f 3178/141/3178 3181/4674/3181 3318/2380/3318 3319/4751/3319 +f 3174/1252/3174 3320/4750/3320 3318/2380/3318 3181/4674/3181 +f 3316/642/3316 3315/4748/3315 3318/2380/3318 3320/4750/3320 +f 3314/1275/3314 3319/4751/3319 3318/2380/3318 3315/4748/3315 +f 3161/140/3161 3275/4724/3275 3321/2381/3321 3172/4669/3172 +f 3272/1267/3272 3322/4752/3322 3321/2381/3321 3275/4724/3275 +f 3316/642/3316 3320/4750/3320 3321/2381/3321 3322/4752/3322 +f 3174/1252/3174 3172/4669/3172 3321/2381/3321 3320/4750/3320 +f 3268/146/3268 3308/4744/3308 3323/2382/3323 3269/4721/3269 +f 3305/1272/3305 3317/4749/3317 3323/2382/3323 3308/4744/3308 +f 3316/642/3316 3322/4752/3322 3323/2382/3323 3317/4749/3317 +f 3272/1267/3272 3269/4721/3269 3323/2382/3323 3322/4752/3322 +f 3026/112/3026 3155/4662/3155 3324/2383/3324 3027/4596/3027 +f 3160/1251/3160 3325/4753/3325 3324/2383/3324 3155/4662/3155 +f 3326/643/3326 3327/4754/3327 3324/2383/3324 3325/4753/3325 +f 3030/1231/3030 3027/4596/3027 3324/2383/3324 3327/4754/3327 +f 3145/138/3145 3328/4755/3328 3329/2384/3329 3170/4668/3170 +f 3330/1276/3330 3331/4756/3331 3329/2384/3329 3328/4755/3328 +f 3326/643/3326 3325/4753/3325 3329/2384/3329 3331/4756/3331 +f 3160/1251/3160 3170/4668/3170 3329/2384/3329 3325/4753/3325 +f 3332/152/3332 3333/4757/3333 3334/2385/3334 3335/4759/3335 +f 3336/1277/3336 3337/4758/3337 3334/2385/3334 3333/4757/3333 +f 3326/643/3326 3331/4756/3331 3334/2385/3334 3337/4758/3337 +f 3330/1276/3330 3335/4759/3335 3334/2385/3334 3331/4756/3331 +f 2976/104/2976 3033/4600/3033 3338/2386/3338 3339/4760/3339 +f 3030/1231/3030 3327/4754/3327 3338/2386/3338 3033/4600/3033 +f 3326/643/3326 3337/4758/3337 3338/2386/3338 3327/4754/3327 +f 3336/1277/3336 3339/4760/3339 3338/2386/3338 3337/4758/3337 +f 3145/138/3145 3148/4657/3148 3340/2387/3340 3328/4755/3328 +f 3143/1247/3143 3341/4761/3341 3340/2387/3340 3148/4657/3148 +f 3342/644/3342 3343/4762/3343 3340/2387/3340 3341/4761/3341 +f 3330/1276/3330 3328/4755/3328 3340/2387/3340 3343/4762/3343 +f 3139/137/3139 3344/4763/3344 3345/2388/3345 3140/4652/3140 +f 3346/1278/3346 3347/4764/3347 3345/2388/3345 3344/4763/3344 +f 3342/644/3342 3341/4761/3341 3345/2388/3345 3347/4764/3347 +f 3143/1247/3143 3140/4652/3140 3345/2388/3345 3341/4761/3341 +f 3348/154/3348 3349/4765/3349 3350/2389/3350 3351/4767/3351 +f 3352/1279/3352 3353/4766/3353 3350/2389/3350 3349/4765/3349 +f 3342/644/3342 3347/4764/3347 3350/2389/3350 3353/4766/3353 +f 3346/1278/3346 3351/4767/3351 3350/2389/3350 3347/4764/3347 +f 3332/152/3332 3335/4759/3335 3354/2390/3354 3355/4768/3355 +f 3330/1276/3330 3343/4762/3343 3354/2390/3354 3335/4759/3335 +f 3342/644/3342 3353/4766/3353 3354/2390/3354 3343/4762/3343 +f 3352/1279/3352 3355/4768/3355 3354/2390/3354 3353/4766/3353 +f 3188/142/3188 3191/4680/3191 3356/2391/3356 3357/4771/3357 +f 3196/1258/3196 3358/4769/3358 3356/2391/3356 3191/4680/3191 +f 3359/645/3359 3360/4770/3360 3356/2391/3356 3358/4769/3358 +f 3361/1281/3361 3357/4771/3357 3356/2391/3356 3360/4770/3360 +f 3209/145/3209 3362/4772/3362 3363/2392/3363 3210/4689/3210 +f 3364/1280/3364 3365/4773/3365 3363/2392/3363 3362/4772/3362 +f 3359/645/3359 3358/4769/3358 3363/2392/3363 3365/4773/3365 +f 3196/1258/3196 3210/4689/3210 3363/2392/3363 3358/4769/3358 +f 3332/152/3332 3355/4768/3355 3366/2393/3366 3367/4775/3367 +f 3352/1279/3352 3368/4774/3368 3366/2393/3366 3355/4768/3355 +f 3359/645/3359 3365/4773/3365 3366/2393/3366 3368/4774/3368 +f 3364/1280/3364 3367/4775/3367 3366/2393/3366 3365/4773/3365 +f 3348/154/3348 3369/4776/3369 3370/2394/3370 3349/4765/3349 +f 3361/1281/3361 3360/4770/3360 3370/2394/3370 3369/4776/3369 +f 3359/645/3359 3368/4774/3368 3370/2394/3370 3360/4770/3360 +f 3352/1279/3352 3349/4765/3349 3370/2394/3370 3368/4774/3368 +f 3209/145/3209 3257/4716/3257 3371/2395/3371 3362/4772/3362 +f 3254/1265/3254 3372/4777/3372 3371/2395/3371 3257/4716/3257 +f 3373/646/3373 3374/4778/3374 3371/2395/3371 3372/4777/3372 +f 3364/1280/3364 3362/4772/3362 3371/2395/3371 3374/4778/3374 +f 2955/101/2955 2958/4558/2958 3375/2396/3375 3252/4713/3252 +f 2963/1220/2963 3376/4779/3376 3375/2396/3375 2958/4558/2958 +f 3373/646/3373 3372/4777/3372 3375/2396/3375 3376/4779/3376 +f 3254/1265/3254 3252/4713/3252 3375/2396/3375 3372/4777/3372 +f 2976/104/2976 3339/4760/3339 3377/2397/3377 2977/4565/2977 +f 3336/1277/3336 3378/4780/3378 3377/2397/3377 3339/4760/3339 +f 3373/646/3373 3376/4779/3376 3377/2397/3377 3378/4780/3378 +f 2963/1220/2963 2977/4565/2977 3377/2397/3377 3376/4779/3376 +f 3332/152/3332 3367/4775/3367 3379/2398/3379 3333/4757/3333 +f 3364/1280/3364 3374/4778/3374 3379/2398/3379 3367/4775/3367 +f 3373/646/3373 3378/4780/3378 3379/2398/3379 3374/4778/3374 +f 3336/1277/3336 3333/4757/3333 3379/2398/3379 3378/4780/3378 +f 507/41/507 510/3264/510 3380/2399/3380 3381/4783/3381 +f 515/877/515 3382/4781/3382 3380/2399/3380 510/3264/510 +f 3383/647/3383 3384/4782/3384 3380/2399/3380 3382/4781/3382 +f 3385/1284/3385 3381/4783/3381 3380/2399/3380 3384/4782/3384 +f 528/113/528 3386/4784/3386 3387/2400/3387 529/3271/529 +f 3388/1282/3388 3389/4785/3389 3387/2400/3387 3386/4784/3386 +f 3383/647/3383 3382/4781/3382 3387/2400/3387 3389/4785/3389 +f 515/877/515 529/3271/529 3387/2400/3387 3382/4781/3382 +f 3390/419/3390 3391/4786/3391 3392/2401/3392 3393/4788/3393 +f 3394/1283/3394 3395/4787/3395 3392/2401/3392 3391/4786/3391 +f 3383/647/3383 3389/4785/3389 3392/2401/3392 3395/4787/3395 +f 3388/1282/3388 3393/4788/3393 3392/2401/3392 3389/4785/3389 +f 3396/420/3396 3397/4789/3397 3398/2402/3398 3399/4790/3399 +f 3385/1284/3385 3384/4782/3384 3398/2402/3398 3397/4789/3397 +f 3383/647/3383 3395/4787/3395 3398/2402/3398 3384/4782/3384 +f 3394/1283/3394 3399/4790/3399 3398/2402/3398 3395/4787/3395 +f 528/113/528 583/3304/583 3400/2403/3400 3386/4784/3386 +f 580/887/580 3401/4791/3401 3400/2403/3400 583/3304/583 +f 3402/648/3402 3403/4792/3403 3400/2403/3400 3401/4791/3401 +f 3388/1282/3388 3386/4784/3386 3400/2403/3400 3403/4792/3403 +f 576/128/576 3404/4793/3404 3405/2404/3405 577/3300/577 +f 3406/1285/3406 3407/4794/3407 3405/2404/3405 3404/4793/3404 +f 3402/648/3402 3401/4791/3401 3405/2404/3405 3407/4794/3407 +f 580/887/580 577/3300/577 3405/2404/3405 3401/4791/3401 +f 3408/434/3408 3409/4795/3409 3410/2405/3410 3411/4797/3411 +f 3412/1286/3412 3413/4796/3413 3410/2405/3410 3409/4795/3409 +f 3402/648/3402 3407/4794/3407 3410/2405/3410 3413/4796/3413 +f 3406/1285/3406 3411/4797/3411 3410/2405/3410 3407/4794/3407 +f 3390/419/3390 3393/4788/3393 3414/2406/3414 3415/4798/3415 +f 3388/1282/3388 3403/4792/3403 3414/2406/3414 3393/4788/3393 +f 3402/648/3402 3413/4796/3413 3414/2406/3414 3403/4792/3403 +f 3412/1286/3412 3415/4798/3415 3414/2406/3414 3413/4796/3413 +f 3219/387/3219 3416/4799/3416 3417/2407/3417 3418/4802/3418 +f 3419/1287/3419 3420/4800/3420 3417/2407/3417 3416/4799/3416 +f 3421/649/3421 3422/4801/3422 3417/2407/3417 3420/4800/3420 +f 3423/1289/3423 3418/4802/3418 3417/2407/3417 3422/4801/3422 +f 3424/435/3424 3425/4803/3425 3426/2408/3426 3427/4805/3427 +f 3428/1288/3428 3429/4804/3429 3426/2408/3426 3425/4803/3425 +f 3421/649/3421 3420/4800/3420 3426/2408/3426 3429/4804/3429 +f 3419/1287/3419 3427/4805/3427 3426/2408/3426 3420/4800/3420 +f 3390/419/3390 3415/4798/3415 3430/2409/3430 3431/4807/3431 +f 3412/1286/3412 3432/4806/3432 3430/2409/3430 3415/4798/3415 +f 3421/649/3421 3429/4804/3429 3430/2409/3430 3432/4806/3432 +f 3428/1288/3428 3431/4807/3431 3430/2409/3430 3429/4804/3429 +f 3408/434/3408 3433/4808/3433 3434/2410/3434 3409/4795/3409 +f 3423/1289/3423 3422/4801/3422 3434/2410/3434 3433/4808/3433 +f 3421/649/3421 3432/4806/3432 3434/2410/3434 3422/4801/3422 +f 3412/1286/3412 3409/4795/3409 3434/2410/3434 3432/4806/3432 +f 3424/435/3424 3435/4809/3435 3436/2411/3436 3425/4803/3425 +f 3437/1290/3437 3438/4811/3438 3436/2411/3436 3435/4809/3435 +f 3439/650/3439 3440/4812/3440 3436/2411/3436 3438/4811/3438 +f 3428/1288/3428 3425/4803/3425 3436/2411/3436 3440/4812/3440 +f 2945/436/2945 3441/4813/3441 3442/2412/3442 3443/4816/3443 +f 3444/1292/3444 3445/4815/3445 3442/2412/3442 3441/4813/3441 +f 3439/650/3439 3438/4811/3438 3442/2412/3442 3445/4815/3445 +f 3437/1290/3437 3443/4816/3443 3442/2412/3442 3438/4811/3438 +f 3396/420/3396 3399/4790/3399 3446/2413/3446 3447/4819/3447 +f 3394/1283/3394 3448/4818/3448 3446/2413/3446 3399/4790/3399 +f 3439/650/3439 3445/4815/3445 3446/2413/3446 3448/4818/3448 +f 3444/1292/3444 3447/4819/3447 3446/2413/3446 3445/4815/3445 +f 3390/419/3390 3431/4807/3431 3449/2414/3449 3391/4786/3391 +f 3428/1288/3428 3440/4812/3440 3449/2414/3449 3431/4807/3431 +f 3439/650/3439 3448/4818/3448 3449/2414/3449 3440/4812/3440 +f 3394/1283/3394 3391/4786/3391 3449/2414/3449 3448/4818/3448 +f 3178/141/3178 3319/4751/3319 3450/2415/3450 3451/4823/3451 +f 3314/1275/3314 3452/4821/3452 3450/2415/3450 3319/4751/3319 +f 3453/651/3453 3454/4822/3454 3450/2415/3450 3452/4821/3452 +f 3455/1296/3455 3451/4823/3451 3450/2415/3450 3454/4822/3454 +f 3301/149/3301 3456/4824/3456 3457/2416/3457 3312/4747/3312 +f 3458/1294/3458 3459/4825/3459 3457/2416/3457 3456/4824/3456 +f 3453/651/3453 3452/4821/3452 3457/2416/3457 3459/4825/3459 +f 3314/1275/3314 3312/4747/3312 3457/2416/3457 3452/4821/3452 +f 3460/155/3460 3461/4826/3461 3462/2417/3462 3463/4828/3463 +f 3464/1295/3464 3465/4827/3465 3462/2417/3462 3461/4826/3461 +f 3453/651/3453 3459/4825/3459 3462/2417/3462 3465/4827/3465 +f 3458/1294/3458 3463/4828/3463 3462/2417/3462 3459/4825/3459 +f 3466/156/3466 3467/4829/3467 3468/2418/3468 3469/4830/3469 +f 3455/1296/3455 3454/4822/3454 3468/2418/3468 3467/4829/3467 +f 3453/651/3453 3465/4827/3465 3468/2418/3468 3454/4822/3454 +f 3464/1295/3464 3469/4830/3469 3468/2418/3468 3465/4827/3465 +f 3301/149/3301 3304/4742/3304 3470/2419/3470 3456/4824/3456 +f 3296/1271/3296 3471/4831/3471 3470/2419/3470 3304/4742/3304 +f 3472/652/3472 3473/4832/3473 3470/2419/3470 3471/4831/3471 +f 3458/1294/3458 3456/4824/3456 3470/2419/3470 3473/4832/3473 +f 3292/148/3292 3474/4833/3474 3475/2420/3475 3293/4735/3293 +f 3476/1297/3476 3477/4835/3477 3475/2420/3475 3474/4833/3474 +f 3472/652/3472 3471/4831/3471 3475/2420/3475 3477/4835/3477 +f 3296/1271/3296 3293/4735/3293 3475/2420/3475 3471/4831/3471 +f 3478/159/3478 3479/4836/3479 3480/2421/3480 3481/4838/3481 +f 3482/1299/3482 3483/4837/3483 3480/2421/3480 3479/4836/3479 +f 3472/652/3472 3477/4835/3477 3480/2421/3480 3483/4837/3483 +f 3476/1297/3476 3481/4838/3481 3480/2421/3480 3477/4835/3477 +f 3460/155/3460 3463/4828/3463 3484/2422/3484 3485/4840/3485 +f 3458/1294/3458 3473/4832/3473 3484/2422/3484 3463/4828/3463 +f 3472/652/3472 3483/4837/3483 3484/2422/3484 3473/4832/3473 +f 3482/1299/3482 3485/4840/3485 3484/2422/3484 3483/4837/3483 +f 3486/161/3486 3487/4841/3487 3488/2423/3488 3489/4844/3489 +f 3490/1300/3490 3491/4842/3491 3488/2423/3488 3487/4841/3487 +f 3492/653/3492 3493/4843/3493 3488/2423/3488 3491/4842/3491 +f 3494/1302/3494 3489/4844/3489 3488/2423/3488 3493/4843/3493 +f 3495/162/3495 3496/4846/3496 3497/2424/3497 3498/4848/3498 +f 3499/1301/3499 3500/4847/3500 3497/2424/3497 3496/4846/3496 +f 3492/653/3492 3491/4842/3491 3497/2424/3497 3500/4847/3500 +f 3490/1300/3490 3498/4848/3498 3497/2424/3497 3491/4842/3491 +f 3460/155/3460 3485/4840/3485 3501/2425/3501 3502/4850/3502 +f 3482/1299/3482 3503/4849/3503 3501/2425/3501 3485/4840/3485 +f 3492/653/3492 3500/4847/3500 3501/2425/3501 3503/4849/3503 +f 3499/1301/3499 3502/4850/3502 3501/2425/3501 3500/4847/3500 +f 3478/159/3478 3504/4851/3504 3505/2426/3505 3479/4836/3479 +f 3494/1302/3494 3493/4843/3493 3505/2426/3505 3504/4851/3504 +f 3492/653/3492 3503/4849/3503 3505/2426/3505 3493/4843/3493 +f 3482/1299/3482 3479/4836/3479 3505/2426/3505 3503/4849/3503 +f 3495/162/3495 3506/4853/3506 3507/2427/3507 3496/4846/3496 +f 3508/1304/3508 3509/4854/3509 3507/2427/3507 3506/4853/3506 +f 3510/654/3510 3511/4855/3511 3507/2427/3507 3509/4854/3509 +f 3499/1301/3499 3496/4846/3496 3507/2427/3507 3511/4855/3511 +f 3512/163/3512 3513/4856/3513 3514/2428/3514 3515/4858/3515 +f 3516/1305/3516 3517/4857/3517 3514/2428/3514 3513/4856/3513 +f 3510/654/3510 3509/4854/3509 3514/2428/3514 3517/4857/3517 +f 3508/1304/3508 3515/4858/3515 3514/2428/3514 3509/4854/3509 +f 3466/156/3466 3469/4830/3469 3518/2429/3518 3519/4860/3519 +f 3464/1295/3464 3520/4859/3520 3518/2429/3518 3469/4830/3469 +f 3510/654/3510 3517/4857/3517 3518/2429/3518 3520/4859/3520 +f 3516/1305/3516 3519/4860/3519 3518/2429/3518 3517/4857/3517 +f 3460/155/3460 3502/4850/3502 3521/2430/3521 3461/4826/3461 +f 3499/1301/3499 3511/4855/3511 3521/2430/3521 3502/4850/3502 +f 3510/654/3510 3520/4859/3520 3521/2430/3521 3511/4855/3511 +f 3464/1295/3464 3461/4826/3461 3521/2430/3521 3520/4859/3520 +f 2905/96/2905 3037/4603/3037 3522/2431/3522 3523/4863/3523 +f 3041/1234/3041 3524/4861/3524 3522/2431/3522 3037/4603/3037 +f 3525/655/3525 3526/4862/3526 3522/2431/3522 3524/4861/3524 +f 3527/1308/3527 3523/4863/3523 3522/2431/3522 3526/4862/3526 +f 3052/116/3052 3528/4864/3528 3529/2432/3529 3053/4609/3053 +f 3530/1306/3530 3531/4865/3531 3529/2432/3529 3528/4864/3528 +f 3525/655/3525 3524/4861/3524 3529/2432/3529 3531/4865/3531 +f 3041/1234/3041 3053/4609/3053 3529/2432/3529 3524/4861/3524 +f 3532/164/3532 3533/4866/3533 3534/2433/3534 3535/4868/3535 +f 3536/1307/3536 3537/4867/3537 3534/2433/3534 3533/4866/3533 +f 3525/655/3525 3531/4865/3531 3534/2433/3534 3537/4867/3537 +f 3530/1306/3530 3535/4868/3535 3534/2433/3534 3531/4865/3531 +f 3538/165/3538 3539/4869/3539 3540/2434/3540 3541/4870/3541 +f 3527/1308/3527 3526/4862/3526 3540/2434/3540 3539/4869/3539 +f 3525/655/3525 3537/4867/3537 3540/2434/3540 3526/4862/3526 +f 3536/1307/3536 3541/4870/3541 3540/2434/3540 3537/4867/3537 +f 3052/116/3052 3105/4636/3105 3542/2435/3542 3528/4864/3528 +f 3102/1241/3102 3543/4871/3543 3542/2435/3542 3105/4636/3105 +f 3544/656/3544 3545/4872/3545 3542/2435/3542 3543/4871/3543 +f 3530/1306/3530 3528/4864/3528 3542/2435/3542 3545/4872/3545 +f 3098/121/3098 3546/4873/3546 3547/2436/3547 3099/4632/3099 +f 3548/1309/3548 3549/4874/3549 3547/2436/3547 3546/4873/3546 +f 3544/656/3544 3543/4871/3543 3547/2436/3547 3549/4874/3549 +f 3102/1241/3102 3099/4632/3099 3547/2436/3547 3543/4871/3543 +f 3550/174/3550 3551/4875/3551 3552/2437/3552 3553/4877/3553 +f 3554/1310/3554 3555/4876/3555 3552/2437/3552 3551/4875/3551 +f 3544/656/3544 3549/4874/3549 3552/2437/3552 3555/4876/3555 +f 3548/1309/3548 3553/4877/3553 3552/2437/3552 3549/4874/3549 +f 3532/164/3532 3535/4868/3535 3556/2438/3556 3557/4878/3557 +f 3530/1306/3530 3545/4872/3545 3556/2438/3556 3535/4868/3535 +f 3544/656/3544 3555/4876/3555 3556/2438/3556 3545/4872/3545 +f 3554/1310/3554 3557/4878/3557 3556/2438/3556 3555/4876/3555 +f 3558/176/3558 3559/4879/3559 3560/2439/3560 3561/4882/3561 +f 3562/1311/3562 3563/4880/3563 3560/2439/3560 3559/4879/3559 +f 3564/657/3564 3565/4881/3565 3560/2439/3560 3563/4880/3563 +f 3566/1313/3566 3561/4882/3561 3560/2439/3560 3565/4881/3565 +f 3567/221/3567 3568/4883/3568 3569/2440/3569 3570/4885/3570 +f 3571/1312/3571 3572/4884/3572 3569/2440/3569 3568/4883/3568 +f 3564/657/3564 3563/4880/3563 3569/2440/3569 3572/4884/3572 +f 3562/1311/3562 3570/4885/3570 3569/2440/3569 3563/4880/3563 +f 3532/164/3532 3557/4878/3557 3573/2441/3573 3574/4887/3574 +f 3554/1310/3554 3575/4886/3575 3573/2441/3573 3557/4878/3557 +f 3564/657/3564 3572/4884/3572 3573/2441/3573 3575/4886/3575 +f 3571/1312/3571 3574/4887/3574 3573/2441/3573 3572/4884/3572 +f 3550/174/3550 3576/4888/3576 3577/2442/3577 3551/4875/3551 +f 3566/1313/3566 3565/4881/3565 3577/2442/3577 3576/4888/3576 +f 3564/657/3564 3575/4886/3575 3577/2442/3577 3565/4881/3565 +f 3554/1310/3554 3551/4875/3551 3577/2442/3577 3575/4886/3575 +f 3567/221/3567 3578/4889/3578 3579/2443/3579 3568/4883/3568 +f 3580/1314/3580 3581/4890/3581 3579/2443/3579 3578/4889/3578 +f 3582/658/3582 3583/4891/3583 3579/2443/3579 3581/4890/3581 +f 3571/1312/3571 3568/4883/3568 3579/2443/3579 3583/4891/3583 +f 3584/222/3584 3585/4892/3585 3586/2444/3586 3587/4894/3587 +f 3588/1315/3588 3589/4893/3589 3586/2444/3586 3585/4892/3585 +f 3582/658/3582 3581/4890/3581 3586/2444/3586 3589/4893/3589 +f 3580/1314/3580 3587/4894/3587 3586/2444/3586 3581/4890/3581 +f 3538/165/3538 3541/4870/3541 3590/2445/3590 3591/4896/3591 +f 3536/1307/3536 3592/4895/3592 3590/2445/3590 3541/4870/3541 +f 3582/658/3582 3589/4893/3589 3590/2445/3590 3592/4895/3592 +f 3588/1315/3588 3591/4896/3591 3590/2445/3590 3589/4893/3589 +f 3532/164/3532 3574/4887/3574 3593/2446/3593 3533/4866/3533 +f 3571/1312/3571 3583/4891/3583 3593/2446/3593 3574/4887/3574 +f 3582/658/3582 3592/4895/3592 3593/2446/3593 3583/4891/3583 +f 3536/1307/3536 3533/4866/3533 3593/2446/3593 3592/4895/3592 +f 3108/130/3108 3111/4640/3111 3594/2447/3594 3595/4899/3595 +f 3116/1245/3116 3596/4897/3596 3594/2447/3594 3111/4640/3111 +f 3597/659/3597 3598/4898/3598 3594/2447/3594 3596/4897/3596 +f 3599/1318/3599 3595/4899/3595 3594/2447/3594 3598/4898/3598 +f 3129/134/3129 3600/4900/3600 3601/2448/3601 3130/4647/3130 +f 3602/1316/3602 3603/4901/3603 3601/2448/3601 3600/4900/3600 +f 3597/659/3597 3596/4897/3596 3601/2448/3601 3603/4901/3603 +f 3116/1245/3116 3130/4647/3130 3601/2448/3601 3596/4897/3596 +f 3604/223/3604 3605/4902/3605 3606/2449/3606 3607/4904/3607 +f 3608/1317/3608 3609/4903/3609 3606/2449/3606 3605/4902/3605 +f 3597/659/3597 3603/4901/3603 3606/2449/3606 3609/4903/3609 +f 3602/1316/3602 3607/4904/3607 3606/2449/3606 3603/4901/3603 +f 3610/224/3610 3611/4905/3611 3612/2450/3612 3613/4906/3613 +f 3599/1318/3599 3598/4898/3598 3612/2450/3612 3611/4905/3611 +f 3597/659/3597 3609/4903/3609 3612/2450/3612 3598/4898/3598 +f 3608/1317/3608 3613/4906/3613 3612/2450/3612 3609/4903/3609 +f 3129/134/3129 3185/4676/3185 3614/2451/3614 3600/4900/3600 +f 3182/1253/3182 3615/4907/3615 3614/2451/3614 3185/4676/3185 +f 3616/660/3616 3617/4908/3617 3614/2451/3614 3615/4907/3615 +f 3602/1316/3602 3600/4900/3600 3614/2451/3614 3617/4908/3617 +f 3178/141/3178 3451/4823/3451 3618/2452/3618 3179/4672/3179 +f 3455/1296/3455 3619/4909/3619 3618/2452/3618 3451/4823/3451 +f 3616/660/3616 3615/4907/3615 3618/2452/3618 3619/4909/3619 +f 3182/1253/3182 3179/4672/3179 3618/2452/3618 3615/4907/3615 +f 3466/156/3466 3620/4910/3620 3621/2453/3621 3467/4829/3467 +f 3622/1319/3622 3623/4911/3623 3621/2453/3621 3620/4910/3620 +f 3616/660/3616 3619/4909/3619 3621/2453/3621 3623/4911/3623 +f 3455/1296/3455 3467/4829/3467 3621/2453/3621 3619/4909/3619 +f 3604/223/3604 3607/4904/3607 3624/2454/3624 3625/4912/3625 +f 3602/1316/3602 3617/4908/3617 3624/2454/3624 3607/4904/3607 +f 3616/660/3616 3623/4911/3623 3624/2454/3624 3617/4908/3617 +f 3622/1319/3622 3625/4912/3625 3624/2454/3624 3623/4911/3623 +f 3512/163/3512 3626/4913/3626 3627/2455/3627 3513/4856/3513 +f 3628/1320/3628 3629/4914/3629 3627/2455/3627 3626/4913/3626 +f 3630/661/3630 3631/4915/3631 3627/2455/3627 3629/4914/3629 +f 3516/1305/3516 3513/4856/3513 3627/2455/3627 3631/4915/3631 +f 3632/225/3632 3633/4916/3633 3634/2456/3634 3635/4918/3635 +f 3636/1321/3636 3637/4917/3637 3634/2456/3634 3633/4916/3633 +f 3630/661/3630 3629/4914/3629 3634/2456/3634 3637/4917/3637 +f 3628/1320/3628 3635/4918/3635 3634/2456/3634 3629/4914/3629 +f 3604/223/3604 3625/4912/3625 3638/2457/3638 3639/4920/3639 +f 3622/1319/3622 3640/4919/3640 3638/2457/3638 3625/4912/3625 +f 3630/661/3630 3637/4917/3637 3638/2457/3638 3640/4919/3640 +f 3636/1321/3636 3639/4920/3639 3638/2457/3638 3637/4917/3637 +f 3466/156/3466 3519/4860/3519 3641/2458/3641 3620/4910/3620 +f 3516/1305/3516 3631/4915/3631 3641/2458/3641 3519/4860/3519 +f 3630/661/3630 3640/4919/3640 3641/2458/3641 3631/4915/3631 +f 3622/1319/3622 3620/4910/3620 3641/2458/3641 3640/4919/3640 +f 3632/225/3632 3642/4921/3642 3643/2459/3643 3633/4916/3633 +f 3644/1322/3644 3645/4922/3645 3643/2459/3643 3642/4921/3642 +f 3646/662/3646 3647/4923/3647 3643/2459/3643 3645/4922/3645 +f 3636/1321/3636 3633/4916/3633 3643/2459/3643 3647/4923/3647 +f 3648/226/3648 3649/4924/3649 3650/2460/3650 3651/4926/3651 +f 3652/1323/3652 3653/4925/3653 3650/2460/3650 3649/4924/3649 +f 3646/662/3646 3645/4922/3645 3650/2460/3650 3653/4925/3653 +f 3644/1322/3644 3651/4926/3651 3650/2460/3650 3645/4922/3645 +f 3610/224/3610 3613/4906/3613 3654/2461/3654 3655/4928/3655 +f 3608/1317/3608 3656/4927/3656 3654/2461/3654 3613/4906/3613 +f 3646/662/3646 3653/4925/3653 3654/2461/3654 3656/4927/3656 +f 3652/1323/3652 3655/4928/3655 3654/2461/3654 3653/4925/3653 +f 3604/223/3604 3639/4920/3639 3657/2462/3657 3605/4902/3605 +f 3636/1321/3636 3647/4923/3647 3657/2462/3657 3639/4920/3639 +f 3646/662/3646 3656/4927/3656 3657/2462/3657 3647/4923/3647 +f 3608/1317/3608 3605/4902/3605 3657/2462/3657 3656/4927/3656 +f 794/21/794 3658/4929/3658 3659/2463/3659 795/3413/795 +f 3660/1324/3660 3661/4930/3661 3659/2463/3659 3658/4929/3658 +f 3662/663/3662 3663/4931/3663 3659/2463/3659 3661/4930/3661 +f 798/918/798 795/3413/795 3659/2463/3659 3663/4931/3663 +f 3664/236/3664 3665/4932/3665 3666/2464/3666 3667/4934/3667 +f 3668/1325/3668 3669/4933/3669 3666/2464/3666 3665/4932/3665 +f 3662/663/3662 3661/4930/3661 3666/2464/3666 3669/4933/3669 +f 3660/1324/3660 3667/4934/3667 3666/2464/3666 3661/4930/3661 +f 3670/254/3670 3671/4935/3671 3672/2465/3672 3673/4937/3673 +f 3674/1326/3674 3675/4936/3675 3672/2465/3672 3671/4935/3671 +f 3662/663/3662 3669/4933/3669 3672/2465/3672 3675/4936/3675 +f 3668/1325/3668 3673/4937/3673 3672/2465/3672 3669/4933/3669 +f 803/28/803 806/3419/806 3676/2466/3676 3677/4938/3677 +f 798/918/798 3663/4931/3663 3676/2466/3676 806/3419/806 +f 3662/663/3662 3675/4936/3675 3676/2466/3676 3663/4931/3663 +f 3674/1326/3674 3677/4938/3677 3676/2466/3676 3675/4936/3675 +f 3664/236/3664 3678/4939/3678 3679/2467/3679 3665/4932/3665 +f 3680/1327/3680 3681/4940/3681 3679/2467/3679 3678/4939/3678 +f 3682/664/3682 3683/4941/3683 3679/2467/3679 3681/4940/3681 +f 3668/1325/3668 3665/4932/3665 3679/2467/3679 3683/4941/3683 +f 2919/258/2919 3684/4942/3684 3685/2468/3685 3686/4945/3686 +f 3687/1328/3687 3688/4944/3688 3685/2468/3685 3684/4942/3684 +f 3682/664/3682 3681/4940/3681 3685/2468/3685 3688/4944/3688 +f 3680/1327/3680 3686/4945/3686 3685/2468/3685 3681/4940/3681 +f 3689/280/3689 3690/4946/3690 3691/2469/3691 3692/4948/3692 +f 3693/1330/3693 3694/4947/3694 3691/2469/3691 3690/4946/3690 +f 3682/664/3682 3688/4944/3688 3691/2469/3691 3694/4947/3694 +f 3687/1328/3687 3692/4948/3692 3691/2469/3691 3688/4944/3688 +f 3670/254/3670 3673/4937/3673 3695/2470/3695 3696/4950/3696 +f 3668/1325/3668 3683/4941/3683 3695/2470/3695 3673/4937/3673 +f 3682/664/3682 3694/4947/3694 3695/2470/3695 3683/4941/3683 +f 3693/1330/3693 3696/4950/3696 3695/2470/3695 3694/4947/3694 +f 3697/285/3697 3698/4951/3698 3699/2471/3699 3700/4954/3700 +f 3701/1331/3701 3702/4952/3702 3699/2471/3699 3698/4951/3698 +f 3703/665/3703 3704/4953/3704 3699/2471/3699 3702/4952/3702 +f 3705/1333/3705 3700/4954/3700 3699/2471/3699 3704/4953/3704 +f 3706/291/3706 3707/4956/3707 3708/2472/3708 3709/4958/3709 +f 3710/1332/3710 3711/4957/3711 3708/2472/3708 3707/4956/3707 +f 3703/665/3703 3702/4952/3702 3708/2472/3708 3711/4957/3711 +f 3701/1331/3701 3709/4958/3709 3708/2472/3708 3702/4952/3702 +f 3670/254/3670 3696/4950/3696 3712/2473/3712 3713/4960/3713 +f 3693/1330/3693 3714/4959/3714 3712/2473/3712 3696/4950/3696 +f 3703/665/3703 3711/4957/3711 3712/2473/3712 3714/4959/3714 +f 3710/1332/3710 3713/4960/3713 3712/2473/3712 3711/4957/3711 +f 3689/280/3689 3715/4961/3715 3716/2474/3716 3690/4946/3690 +f 3705/1333/3705 3704/4953/3704 3716/2474/3716 3715/4961/3715 +f 3703/665/3703 3714/4959/3714 3716/2474/3716 3704/4953/3704 +f 3693/1330/3693 3690/4946/3690 3716/2474/3716 3714/4959/3714 +f 3706/291/3706 3717/4963/3717 3718/2475/3718 3707/4956/3707 +f 3719/1335/3719 3720/4964/3720 3718/2475/3718 3717/4963/3717 +f 3721/666/3721 3722/4965/3722 3718/2475/3718 3720/4964/3720 +f 3710/1332/3710 3707/4956/3707 3718/2475/3718 3722/4965/3722 +f 825/44/825 828/3430/828 3723/2476/3723 3724/4967/3724 +f 821/922/821 3725/4966/3725 3723/2476/3723 828/3430/828 +f 3721/666/3721 3720/4964/3720 3723/2476/3723 3725/4966/3725 +f 3719/1335/3719 3724/4967/3724 3723/2476/3723 3720/4964/3720 +f 803/28/803 3677/4938/3677 3726/2477/3726 819/3425/819 +f 3674/1326/3674 3727/4968/3727 3726/2477/3726 3677/4938/3677 +f 3721/666/3721 3725/4966/3725 3726/2477/3726 3727/4968/3727 +f 821/922/821 819/3425/819 3726/2477/3726 3725/4966/3725 +f 3670/254/3670 3713/4960/3713 3728/2478/3728 3671/4935/3671 +f 3710/1332/3710 3722/4965/3722 3728/2478/3728 3713/4960/3713 +f 3721/666/3721 3727/4968/3727 3728/2478/3728 3722/4965/3722 +f 3674/1326/3674 3671/4935/3671 3728/2478/3728 3727/4968/3727 +f 3558/176/3558 3561/4882/3561 3729/2479/3729 3730/4971/3730 +f 3566/1313/3566 3731/4969/3731 3729/2479/3729 3561/4882/3561 +f 3732/667/3732 3733/4970/3733 3729/2479/3729 3731/4969/3731 +f 3734/1338/3734 3730/4971/3730 3729/2479/3729 3733/4970/3733 +f 3550/174/3550 3735/4972/3735 3736/2480/3736 3576/4888/3576 +f 3737/1336/3737 3738/4973/3738 3736/2480/3736 3735/4972/3735 +f 3732/667/3732 3731/4969/3731 3736/2480/3736 3738/4973/3738 +f 3566/1313/3566 3576/4888/3576 3736/2480/3736 3731/4969/3731 +f 3739/227/3739 3740/4974/3740 3741/2481/3741 3742/4976/3742 +f 3743/1337/3743 3744/4975/3744 3741/2481/3741 3740/4974/3740 +f 3732/667/3732 3738/4973/3738 3741/2481/3741 3744/4975/3744 +f 3737/1336/3737 3742/4976/3742 3741/2481/3741 3738/4973/3738 +f 3745/229/3745 3746/4977/3746 3747/2482/3747 3748/4978/3748 +f 3734/1338/3734 3733/4970/3733 3747/2482/3747 3746/4977/3746 +f 3732/667/3732 3744/4975/3744 3747/2482/3747 3733/4970/3733 +f 3743/1337/3743 3748/4978/3748 3747/2482/3747 3744/4975/3744 +f 3550/174/3550 3553/4877/3553 3749/2483/3749 3735/4972/3735 +f 3548/1309/3548 3750/4979/3750 3749/2483/3749 3553/4877/3553 +f 3751/668/3751 3752/4980/3752 3749/2483/3749 3750/4979/3750 +f 3737/1336/3737 3735/4972/3735 3749/2483/3749 3752/4980/3752 +f 3098/121/3098 3753/4981/3753 3754/2484/3754 3546/4873/3546 +f 3755/1339/3755 3756/4982/3756 3754/2484/3754 3753/4981/3753 +f 3751/668/3751 3750/4979/3750 3754/2484/3754 3756/4982/3756 +f 3548/1309/3548 3546/4873/3546 3754/2484/3754 3750/4979/3750 +f 3757/230/3757 3758/4983/3758 3759/2485/3759 3760/4985/3760 +f 3761/1340/3761 3762/4984/3762 3759/2485/3759 3758/4983/3758 +f 3751/668/3751 3756/4982/3756 3759/2485/3759 3762/4984/3762 +f 3755/1339/3755 3760/4985/3760 3759/2485/3759 3756/4982/3756 +f 3739/227/3739 3742/4976/3742 3763/2486/3763 3764/4986/3764 +f 3737/1336/3737 3752/4980/3752 3763/2486/3763 3742/4976/3742 +f 3751/668/3751 3762/4984/3762 3763/2486/3763 3752/4980/3752 +f 3761/1340/3761 3764/4986/3764 3763/2486/3763 3762/4984/3762 +f 3108/130/3108 3595/4899/3595 3765/2487/3765 3766/4989/3766 +f 3599/1318/3599 3767/4987/3767 3765/2487/3765 3595/4899/3595 +f 3768/669/3768 3769/4988/3769 3765/2487/3765 3767/4987/3767 +f 3770/1342/3770 3766/4989/3766 3765/2487/3765 3769/4988/3769 +f 3610/224/3610 3771/4990/3771 3772/2488/3772 3611/4905/3611 +f 3773/1341/3773 3774/4991/3774 3772/2488/3772 3771/4990/3771 +f 3768/669/3768 3767/4987/3767 3772/2488/3772 3774/4991/3774 +f 3599/1318/3599 3611/4905/3611 3772/2488/3772 3767/4987/3767 +f 3739/227/3739 3764/4986/3764 3775/2489/3775 3776/4993/3776 +f 3761/1340/3761 3777/4992/3777 3775/2489/3775 3764/4986/3764 +f 3768/669/3768 3774/4991/3774 3775/2489/3775 3777/4992/3777 +f 3773/1341/3773 3776/4993/3776 3775/2489/3775 3774/4991/3774 +f 3757/230/3757 3778/4994/3778 3779/2490/3779 3758/4983/3758 +f 3770/1342/3770 3769/4988/3769 3779/2490/3779 3778/4994/3778 +f 3768/669/3768 3777/4992/3777 3779/2490/3779 3769/4988/3769 +f 3761/1340/3761 3758/4983/3758 3779/2490/3779 3777/4992/3777 +f 3610/224/3610 3655/4928/3655 3780/2491/3780 3771/4990/3771 +f 3652/1323/3652 3781/4995/3781 3780/2491/3780 3655/4928/3655 +f 3782/670/3782 3783/4996/3783 3780/2491/3780 3781/4995/3781 +f 3773/1341/3773 3771/4990/3771 3780/2491/3780 3783/4996/3783 +f 3648/226/3648 3784/4997/3784 3785/2492/3785 3649/4924/3649 +f 3786/1343/3786 3787/4998/3787 3785/2492/3785 3784/4997/3784 +f 3782/670/3782 3781/4995/3781 3785/2492/3785 3787/4998/3787 +f 3652/1323/3652 3649/4924/3649 3785/2492/3785 3781/4995/3781 +f 3745/229/3745 3748/4978/3748 3788/2493/3788 3789/5000/3789 +f 3743/1337/3743 3790/4999/3790 3788/2493/3788 3748/4978/3748 +f 3782/670/3782 3787/4998/3787 3788/2493/3788 3790/4999/3790 +f 3786/1343/3786 3789/5000/3789 3788/2493/3788 3787/4998/3787 +f 3739/227/3739 3776/4993/3776 3791/2494/3791 3740/4974/3740 +f 3773/1341/3773 3783/4996/3783 3791/2494/3791 3776/4993/3776 +f 3782/670/3782 3790/4999/3790 3791/2494/3791 3783/4996/3783 +f 3743/1337/3743 3740/4974/3740 3791/2494/3791 3790/4999/3790 +f 3098/121/3098 3101/4634/3101 3792/2495/3792 3753/4981/3753 +f 3094/1240/3094 3793/5001/3793 3792/2495/3792 3101/4634/3101 +f 3794/671/3794 3795/5002/3795 3792/2495/3792 3793/5001/3793 +f 3755/1339/3755 3753/4981/3753 3792/2495/3792 3795/5002/3795 +f 3081/120/3081 3796/5003/3796 3797/2496/3797 3092/4629/3092 +f 3798/1344/3798 3799/5004/3799 3797/2496/3797 3796/5003/3796 +f 3794/671/3794 3793/5001/3793 3797/2496/3797 3799/5004/3799 +f 3094/1240/3094 3092/4629/3092 3797/2496/3797 3793/5001/3793 +f 3800/231/3800 3801/5005/3801 3802/2497/3802 3803/5007/3803 +f 3804/1345/3804 3805/5006/3805 3802/2497/3802 3801/5005/3801 +f 3794/671/3794 3799/5004/3799 3802/2497/3802 3805/5006/3805 +f 3798/1344/3798 3803/5007/3803 3802/2497/3802 3799/5004/3799 +f 3757/230/3757 3760/4985/3760 3806/2498/3806 3807/5008/3807 +f 3755/1339/3755 3795/5002/3795 3806/2498/3806 3760/4985/3760 +f 3794/671/3794 3805/5006/3805 3806/2498/3806 3795/5002/3795 +f 3804/1345/3804 3807/5008/3807 3806/2498/3806 3805/5006/3805 +f 3081/120/3081 3084/4625/3084 3808/2499/3808 3796/5003/3796 +f 3076/1237/3076 3809/5009/3809 3808/2499/3808 3084/4625/3084 +f 3810/672/3810 3811/5010/3811 3808/2499/3808 3809/5009/3809 +f 3798/1344/3798 3796/5003/3796 3808/2499/3808 3811/5010/3811 +f 3072/119/3072 3812/5011/3812 3813/2500/3813 3073/4619/3073 +f 3814/1346/3814 3815/5012/3815 3813/2500/3813 3812/5011/3812 +f 3810/672/3810 3809/5009/3809 3813/2500/3813 3815/5012/3815 +f 3076/1237/3076 3073/4619/3073 3813/2500/3813 3809/5009/3809 +f 3816/233/3816 3817/5013/3817 3818/2501/3818 3819/5015/3819 +f 3820/1347/3820 3821/5014/3821 3818/2501/3818 3817/5013/3817 +f 3810/672/3810 3815/5012/3815 3818/2501/3818 3821/5014/3821 +f 3814/1346/3814 3819/5015/3819 3818/2501/3818 3815/5012/3815 +f 3800/231/3800 3803/5007/3803 3822/2502/3822 3823/5016/3823 +f 3798/1344/3798 3811/5010/3811 3822/2502/3822 3803/5007/3803 +f 3810/672/3810 3821/5014/3821 3822/2502/3822 3811/5010/3811 +f 3820/1347/3820 3823/5016/3823 3822/2502/3822 3821/5014/3821 +f 3139/137/3139 3142/4654/3142 3824/2503/3824 3825/5019/3825 +f 3135/1246/3135 3826/5017/3826 3824/2503/3824 3142/4654/3142 +f 3827/673/3827 3828/5018/3828 3824/2503/3824 3826/5017/3826 +f 3829/1349/3829 3825/5019/3825 3824/2503/3824 3828/5018/3828 +f 3117/132/3117 3830/5020/3830 3831/2504/3831 3133/4649/3133 +f 3832/1348/3832 3833/5021/3833 3831/2504/3831 3830/5020/3830 +f 3827/673/3827 3826/5017/3826 3831/2504/3831 3833/5021/3833 +f 3135/1246/3135 3133/4649/3133 3831/2504/3831 3826/5017/3826 +f 3800/231/3800 3823/5016/3823 3834/2505/3834 3835/5023/3835 +f 3820/1347/3820 3836/5022/3836 3834/2505/3834 3823/5016/3823 +f 3827/673/3827 3833/5021/3833 3834/2505/3834 3836/5022/3836 +f 3832/1348/3832 3835/5023/3835 3834/2505/3834 3833/5021/3833 +f 3816/233/3816 3837/5024/3837 3838/2506/3838 3817/5013/3817 +f 3829/1349/3829 3828/5018/3828 3838/2506/3838 3837/5024/3837 +f 3827/673/3827 3836/5022/3836 3838/2506/3838 3828/5018/3828 +f 3820/1347/3820 3817/5013/3817 3838/2506/3838 3836/5022/3836 +f 3117/132/3117 3120/4643/3120 3839/2507/3839 3830/5020/3830 +f 3112/1242/3112 3840/5025/3840 3839/2507/3839 3120/4643/3120 +f 3841/674/3841 3842/5026/3842 3839/2507/3839 3840/5025/3840 +f 3832/1348/3832 3830/5020/3830 3839/2507/3839 3842/5026/3842 +f 3108/130/3108 3766/4989/3766 3843/2508/3843 3109/4637/3109 +f 3770/1342/3770 3844/5027/3844 3843/2508/3843 3766/4989/3766 +f 3841/674/3841 3840/5025/3840 3843/2508/3843 3844/5027/3844 +f 3112/1242/3112 3109/4637/3109 3843/2508/3843 3840/5025/3840 +f 3757/230/3757 3807/5008/3807 3845/2509/3845 3778/4994/3778 +f 3804/1345/3804 3846/5028/3846 3845/2509/3845 3807/5008/3807 +f 3841/674/3841 3844/5027/3844 3845/2509/3845 3846/5028/3846 +f 3770/1342/3770 3778/4994/3778 3845/2509/3845 3844/5027/3844 +f 3800/231/3800 3835/5023/3835 3847/2510/3847 3801/5005/3801 +f 3832/1348/3832 3842/5026/3842 3847/2510/3847 3835/5023/3835 +f 3841/674/3841 3846/5028/3846 3847/2510/3847 3842/5026/3842 +f 3804/1345/3804 3801/5005/3801 3847/2510/3847 3846/5028/3846 +f 3072/119/3072 3075/4622/3075 3848/2511/3848 3812/5011/3812 +f 3080/1239/3080 3849/5029/3849 3848/2511/3848 3075/4622/3075 +f 3850/675/3850 3851/5030/3851 3848/2511/3848 3849/5029/3849 +f 3814/1346/3814 3812/5011/3812 3848/2511/3848 3851/5030/3851 +f 3064/118/3064 3852/5031/3852 3853/2512/3853 3090/4628/3090 +f 3854/1350/3854 3855/5032/3855 3853/2512/3853 3852/5031/3852 +f 3850/675/3850 3849/5029/3849 3853/2512/3853 3855/5032/3855 +f 3080/1239/3080 3090/4628/3090 3853/2512/3853 3849/5029/3849 +f 3856/234/3856 3857/5033/3857 3858/2513/3858 3859/5035/3859 +f 3860/1351/3860 3861/5034/3861 3858/2513/3858 3857/5033/3857 +f 3850/675/3850 3855/5032/3855 3858/2513/3858 3861/5034/3861 +f 3854/1350/3854 3859/5035/3859 3858/2513/3858 3855/5032/3855 +f 3816/233/3816 3819/5015/3819 3862/2514/3862 3863/5036/3863 +f 3814/1346/3814 3851/5030/3851 3862/2514/3862 3819/5015/3819 +f 3850/675/3850 3861/5034/3861 3862/2514/3862 3851/5030/3851 +f 3860/1351/3860 3863/5036/3863 3862/2514/3862 3861/5034/3861 +f 3064/118/3064 3067/4617/3067 3864/2515/3864 3852/5031/3852 +f 3062/1235/3062 3865/5037/3865 3864/2515/3864 3067/4617/3067 +f 3866/676/3866 3867/5038/3867 3864/2515/3864 3865/5037/3865 +f 3854/1350/3854 3852/5031/3852 3864/2515/3864 3867/5038/3867 +f 2874/89/2874 3868/5039/3868 3869/2516/3869 3060/4613/3060 +f 3870/1352/3870 3871/5040/3871 3869/2516/3869 3868/5039/3868 +f 3866/676/3866 3865/5037/3865 3869/2516/3869 3871/5040/3871 +f 3062/1235/3062 3060/4613/3060 3869/2516/3869 3865/5037/3865 +f 3872/235/3872 3873/5041/3873 3874/2517/3874 3875/5043/3875 +f 3876/1353/3876 3877/5042/3877 3874/2517/3874 3873/5041/3873 +f 3866/676/3866 3871/5040/3871 3874/2517/3874 3877/5042/3877 +f 3870/1352/3870 3875/5043/3875 3874/2517/3874 3871/5040/3871 +f 3856/234/3856 3859/5035/3859 3878/2518/3878 3879/5044/3879 +f 3854/1350/3854 3867/5038/3867 3878/2518/3878 3859/5035/3859 +f 3866/676/3866 3877/5042/3877 3878/2518/3878 3867/5038/3867 +f 3876/1353/3876 3879/5044/3879 3878/2518/3878 3877/5042/3877 +f 3188/142/3188 3357/4771/3357 3880/2519/3880 3881/5047/3881 +f 3361/1281/3361 3882/5045/3882 3880/2519/3880 3357/4771/3357 +f 3883/677/3883 3884/5046/3884 3880/2519/3880 3882/5045/3882 +f 3885/1355/3885 3881/5047/3881 3880/2519/3880 3884/5046/3884 +f 3348/154/3348 3886/5048/3886 3887/2520/3887 3369/4776/3369 +f 3888/1354/3888 3889/5049/3889 3887/2520/3887 3886/5048/3886 +f 3883/677/3883 3882/5045/3882 3887/2520/3887 3889/5049/3889 +f 3361/1281/3361 3369/4776/3369 3887/2520/3887 3882/5045/3882 +f 3856/234/3856 3879/5044/3879 3890/2521/3890 3891/5051/3891 +f 3876/1353/3876 3892/5050/3892 3890/2521/3890 3879/5044/3879 +f 3883/677/3883 3889/5049/3889 3890/2521/3890 3892/5050/3892 +f 3888/1354/3888 3891/5051/3891 3890/2521/3890 3889/5049/3889 +f 3872/235/3872 3893/5052/3893 3894/2522/3894 3873/5041/3873 +f 3885/1355/3885 3884/5046/3884 3894/2522/3894 3893/5052/3893 +f 3883/677/3883 3892/5050/3892 3894/2522/3894 3884/5046/3884 +f 3876/1353/3876 3873/5041/3873 3894/2522/3894 3892/5050/3892 +f 3348/154/3348 3351/4767/3351 3895/2523/3895 3886/5048/3886 +f 3346/1278/3346 3896/5053/3896 3895/2523/3895 3351/4767/3351 +f 3897/678/3897 3898/5054/3898 3895/2523/3895 3896/5053/3896 +f 3888/1354/3888 3886/5048/3886 3895/2523/3895 3898/5054/3898 +f 3139/137/3139 3825/5019/3825 3899/2524/3899 3344/4763/3344 +f 3829/1349/3829 3900/5055/3900 3899/2524/3899 3825/5019/3825 +f 3897/678/3897 3896/5053/3896 3899/2524/3899 3900/5055/3900 +f 3346/1278/3346 3344/4763/3344 3899/2524/3899 3896/5053/3896 +f 3816/233/3816 3863/5036/3863 3901/2525/3901 3837/5024/3837 +f 3860/1351/3860 3902/5056/3902 3901/2525/3901 3863/5036/3863 +f 3897/678/3897 3900/5055/3900 3901/2525/3901 3902/5056/3902 +f 3829/1349/3829 3837/5024/3837 3901/2525/3901 3900/5055/3900 +f 3856/234/3856 3891/5051/3891 3903/2526/3903 3857/5033/3857 +f 3888/1354/3888 3898/5054/3898 3903/2526/3903 3891/5051/3891 +f 3897/678/3897 3902/5056/3902 3903/2526/3903 3898/5054/3898 +f 3860/1351/3860 3857/5033/3857 3903/2526/3903 3902/5056/3902 +f 2945/297/2945 2948/4552/2948 3904/2527/3904 3441/4814/3441 +f 2941/1215/2941 3905/5057/3905 3904/2527/3904 2948/4552/2948 +f 3906/679/3906 3907/5058/3907 3904/2527/3904 3905/5057/3905 +f 3444/1293/3444 3441/4814/3441 3904/2527/3904 3907/5058/3907 +f 2928/303/2928 3908/5059/3908 3909/2528/3909 2939/4546/2939 +f 3910/1356/3910 3911/5060/3911 3909/2528/3909 3908/5059/3908 +f 3906/679/3906 3905/5057/3905 3909/2528/3909 3911/5060/3911 +f 2941/1215/2941 2939/4546/2939 3909/2528/3909 3905/5057/3905 +f 3912/305/3912 3913/5061/3913 3914/2529/3914 3915/5064/3915 +f 3916/1357/3916 3917/5063/3917 3914/2529/3914 3913/5061/3913 +f 3906/679/3906 3911/5060/3911 3914/2529/3914 3917/5063/3917 +f 3910/1356/3910 3915/5064/3915 3914/2529/3914 3911/5060/3911 +f 3396/325/3396 3447/4820/3447 3918/2530/3918 3919/5065/3919 +f 3444/1293/3444 3907/5058/3907 3918/2530/3918 3447/4820/3447 +f 3906/679/3906 3917/5063/3917 3918/2530/3918 3907/5058/3907 +f 3916/1357/3916 3919/5065/3919 3918/2530/3918 3917/5063/3917 +f 2928/303/2928 2931/4541/2931 3920/2531/3920 3908/5059/3908 +f 2923/1211/2923 3921/5067/3921 3920/2531/3920 2931/4541/2931 +f 3922/680/3922 3923/5068/3923 3920/2531/3920 3921/5067/3921 +f 3910/1356/3910 3908/5059/3908 3920/2531/3920 3923/5068/3923 +f 2919/258/2919 3686/4945/3686 3924/2532/3924 2920/4534/2920 +f 3680/1327/3680 3925/5069/3925 3924/2532/3924 3686/4945/3686 +f 3922/680/3922 3921/5067/3921 3924/2532/3924 3925/5069/3925 +f 2923/1211/2923 2920/4534/2920 3924/2532/3924 3921/5067/3921 +f 3664/236/3664 3926/5070/3926 3927/2533/3927 3678/4939/3678 +f 3928/1359/3928 3929/5071/3929 3927/2533/3927 3926/5070/3926 +f 3922/680/3922 3925/5069/3925 3927/2533/3927 3929/5071/3929 +f 3680/1327/3680 3678/4939/3678 3927/2533/3927 3925/5069/3925 +f 3912/305/3912 3915/5064/3915 3930/2534/3930 3931/5072/3931 +f 3910/1356/3910 3923/5068/3923 3930/2534/3930 3915/5064/3915 +f 3922/680/3922 3929/5071/3929 3930/2534/3930 3923/5068/3923 +f 3928/1359/3928 3931/5072/3931 3930/2534/3930 3929/5071/3929 +f 794/21/794 1082/3567/1082 3932/2535/3932 3658/4929/3658 +f 1086/959/1086 3933/5073/3933 3932/2535/3932 1082/3567/1082 +f 3934/681/3934 3935/5074/3935 3932/2535/3932 3933/5073/3933 +f 3660/1324/3660 3658/4929/3658 3932/2535/3932 3935/5074/3935 +f 1073/123/1073 3936/5075/3936 3937/2536/3937 1094/3572/1094 +f 3938/1360/3938 3939/5077/3939 3937/2536/3937 3936/5075/3936 +f 3934/681/3934 3933/5073/3933 3937/2536/3937 3939/5077/3939 +f 1086/959/1086 1094/3572/1094 3937/2536/3937 3933/5073/3933 +f 3912/305/3912 3931/5072/3931 3940/2537/3940 3941/5079/3941 +f 3928/1359/3928 3942/5078/3942 3940/2537/3940 3931/5072/3931 +f 3934/681/3934 3939/5077/3939 3940/2537/3940 3942/5078/3942 +f 3938/1360/3938 3941/5079/3941 3940/2537/3940 3939/5077/3939 +f 3664/236/3664 3667/4934/3667 3943/2538/3943 3926/5070/3926 +f 3660/1324/3660 3935/5074/3935 3943/2538/3943 3667/4934/3667 +f 3934/681/3934 3942/5078/3942 3943/2538/3943 3935/5074/3935 +f 3928/1359/3928 3926/5070/3926 3943/2538/3943 3942/5078/3942 +f 1073/184/1073 1076/3562/1076 3944/2539/3944 3936/5076/3936 +f 1071/955/1071 3945/5081/3945 3944/2539/3944 1076/3562/1076 +f 3946/682/3946 3947/5082/3947 3944/2539/3944 3945/5081/3945 +f 3938/1361/3938 3936/5076/3936 3944/2539/3944 3947/5082/3947 +f 507/41/507 3381/4783/3381 3948/2540/3948 1069/3557/1069 +f 3385/1284/3385 3949/5083/3949 3948/2540/3948 3381/4783/3381 +f 3946/682/3946 3945/5081/3945 3948/2540/3948 3949/5083/3949 +f 1071/955/1071 1069/3557/1069 3948/2540/3948 3945/5081/3945 +f 3396/420/3396 3919/5066/3919 3950/2541/3950 3397/4789/3397 +f 3916/1358/3916 3951/5084/3951 3950/2541/3950 3919/5066/3919 +f 3946/682/3946 3949/5083/3949 3950/2541/3950 3951/5084/3951 +f 3385/1284/3385 3397/4789/3397 3950/2541/3950 3949/5083/3949 +f 3912/437/3912 3941/5080/3941 3952/2542/3952 3913/5062/3913 +f 3938/1361/3938 3947/5082/3947 3952/2542/3952 3941/5080/3941 +f 3946/682/3946 3951/5084/3951 3952/2542/3952 3947/5082/3947 +f 3916/1358/3916 3913/5062/3913 3952/2542/3952 3951/5084/3951 +f 3000/259/3000 3003/4585/3003 3953/2543/3953 3954/5087/3954 +f 3008/1229/3008 3955/5085/3955 3953/2543/3953 3003/4585/3003 +f 3956/683/3956 3957/5086/3957 3953/2543/3953 3955/5085/3955 +f 3958/1365/3958 3954/5087/3954 3953/2543/3953 3957/5086/3957 +f 2992/261/2992 3959/5088/3959 3960/2544/3960 3018/4592/3018 +f 3961/1362/3961 3962/5090/3962 3960/2544/3960 3959/5088/3959 +f 3956/683/3956 3955/5085/3955 3960/2544/3960 3962/5090/3962 +f 3008/1229/3008 3018/4592/3018 3960/2544/3960 3955/5085/3955 +f 3963/263/3963 3964/5091/3964 3965/2545/3965 3966/5093/3966 +f 3967/1364/3967 3968/5092/3968 3965/2545/3965 3964/5091/3964 +f 3956/683/3956 3962/5090/3962 3965/2545/3965 3968/5092/3968 +f 3961/1362/3961 3966/5093/3966 3965/2545/3965 3962/5090/3962 +f 3969/292/3969 3970/5095/3970 3971/2546/3971 3972/5096/3972 +f 3958/1365/3958 3957/5086/3957 3971/2546/3971 3970/5095/3970 +f 3956/683/3956 3968/5092/3968 3971/2546/3971 3957/5086/3957 +f 3967/1364/3967 3972/5096/3972 3971/2546/3971 3968/5092/3968 +f 2992/438/2992 2995/4579/2995 3973/2547/3973 3959/5089/3959 +f 2990/1224/2990 3974/5097/3974 3973/2547/3973 2995/4579/2995 +f 3975/684/3975 3976/5098/3976 3973/2547/3973 3974/5097/3974 +f 3961/1363/3961 3959/5089/3959 3973/2547/3973 3976/5098/3976 +f 2986/417/2986 3977/5099/3977 3978/2548/3978 2987/4572/2987 +f 3979/1366/3979 3980/5100/3980 3978/2548/3978 3977/5099/3977 +f 3975/684/3975 3974/5097/3974 3978/2548/3978 3980/5100/3980 +f 2990/1224/2990 2987/4572/2987 3978/2548/3978 3974/5097/3974 +f 3981/439/3981 3982/5101/3982 3983/2549/3983 3984/5103/3984 +f 3985/1367/3985 3986/5102/3986 3983/2549/3983 3982/5101/3982 +f 3975/684/3975 3980/5100/3980 3983/2549/3983 3986/5102/3986 +f 3979/1366/3979 3984/5103/3984 3983/2549/3983 3980/5100/3980 +f 3963/440/3963 3966/5094/3966 3987/2550/3987 3988/5104/3988 +f 3961/1363/3961 3976/5098/3976 3987/2550/3987 3966/5094/3966 +f 3975/684/3975 3986/5102/3986 3987/2550/3987 3976/5098/3976 +f 3985/1367/3985 3988/5104/3988 3987/2550/3987 3986/5102/3986 +f 1145/228/1145 1148/3604/1148 3989/2551/3989 3990/5107/3990 +f 1153/970/1153 3991/5105/3991 3989/2551/3989 1148/3604/1148 +f 3992/685/3992 3993/5106/3993 3989/2551/3989 3991/5105/3991 +f 3994/1370/3994 3990/5107/3990 3989/2551/3989 3993/5106/3993 +f 1137/293/1137 3995/5108/3995 3996/2552/3996 1163/3610/1163 +f 3997/1368/3997 3998/5110/3998 3996/2552/3996 3995/5108/3995 +f 3992/685/3992 3991/5105/3991 3996/2552/3996 3998/5110/3998 +f 1153/970/1153 1163/3610/1163 3996/2552/3996 3991/5105/3991 +f 3963/440/3963 3988/5104/3988 3999/2553/3999 4000/5112/4000 +f 3985/1367/3985 4001/5111/4001 3999/2553/3999 3988/5104/3988 +f 3992/685/3992 3998/5110/3998 3999/2553/3999 4001/5111/4001 +f 3997/1368/3997 4000/5112/4000 3999/2553/3999 3998/5110/3998 +f 3981/439/3981 4002/5114/4002 4003/2554/4003 3982/5101/3982 +f 3994/1370/3994 3993/5106/3993 4003/2554/4003 4002/5114/4002 +f 3992/685/3992 4001/5111/4001 4003/2554/4003 3993/5106/3993 +f 3985/1367/3985 3982/5101/3982 4003/2554/4003 4001/5111/4001 +f 1137/43/1137 1140/3598/1140 4004/2555/4004 3995/5109/3995 +f 1135/965/1135 4005/5115/4005 4004/2555/4004 1140/3598/1140 +f 4006/686/4006 4007/5116/4007 4004/2555/4004 4005/5115/4005 +f 3997/1369/3997 3995/5109/3995 4004/2555/4004 4007/5116/4007 +f 1131/39/1131 4008/5117/4008 4009/2556/4009 1132/3592/1132 +f 4010/1371/4010 4011/5118/4011 4009/2556/4009 4008/5117/4008 +f 4006/686/4006 4005/5115/4005 4009/2556/4009 4011/5118/4011 +f 1135/965/1135 1132/3592/1132 4009/2556/4009 4005/5115/4005 +f 3969/292/3969 3972/5096/3972 4012/2557/4012 4013/5120/4013 +f 3967/1364/3967 4014/5119/4014 4012/2557/4012 3972/5096/3972 +f 4006/686/4006 4011/5118/4011 4012/2557/4012 4014/5119/4014 +f 4010/1371/4010 4013/5120/4013 4012/2557/4012 4011/5118/4011 +f 3963/263/3963 4000/5113/4000 4015/2558/4015 3964/5091/3964 +f 3997/1369/3997 4007/5116/4007 4015/2558/4015 4000/5113/4000 +f 4006/686/4006 4014/5119/4014 4015/2558/4015 4007/5116/4007 +f 3967/1364/3967 3964/5091/3964 4015/2558/4015 4014/5119/4014 +f 2986/417/2986 3234/4703/3234 4016/2559/4016 3977/5099/3977 +f 3238/1264/3238 4017/5121/4017 4016/2559/4016 3234/4703/3234 +f 4018/687/4018 4019/5122/4019 4016/2559/4016 4017/5121/4017 +f 3979/1366/3979 3977/5099/3977 4016/2559/4016 4019/5122/4019 +f 3225/413/3225 4020/5123/4020 4021/2560/4021 3246/4710/3246 +f 4022/1372/4022 4023/5124/4023 4021/2560/4021 4020/5123/4020 +f 4018/687/4018 4017/5121/4017 4021/2560/4021 4023/5124/4023 +f 3238/1264/3238 3246/4710/3246 4021/2560/4021 4017/5121/4017 +f 4024/441/4024 4025/5125/4025 4026/2561/4026 4027/5127/4027 +f 4028/1373/4028 4029/5126/4029 4026/2561/4026 4025/5125/4025 +f 4018/687/4018 4023/5124/4023 4026/2561/4026 4029/5126/4029 +f 4022/1372/4022 4027/5127/4027 4026/2561/4026 4023/5124/4023 +f 3981/439/3981 3984/5103/3984 4030/2562/4030 4031/5128/4031 +f 3979/1366/3979 4019/5122/4019 4030/2562/4030 3984/5103/3984 +f 4018/687/4018 4029/5126/4029 4030/2562/4030 4019/5122/4019 +f 4028/1373/4028 4031/5128/4031 4030/2562/4030 4029/5126/4029 +f 3225/413/3225 3228/4699/3228 4032/2563/4032 4020/5123/4020 +f 3223/1260/3223 4033/5129/4033 4032/2563/4032 3228/4699/3228 +f 4034/688/4034 4035/5130/4035 4032/2563/4032 4033/5129/4033 +f 4022/1372/4022 4020/5123/4020 4032/2563/4032 4035/5130/4035 +f 3219/387/3219 3418/4802/3418 4036/2564/4036 3220/4694/3220 +f 3423/1289/3423 4037/5131/4037 4036/2564/4036 3418/4802/3418 +f 4034/688/4034 4033/5129/4033 4036/2564/4036 4037/5131/4037 +f 3223/1260/3223 3220/4694/3220 4036/2564/4036 4033/5129/4033 +f 3408/434/3408 4038/5132/4038 4039/2565/4039 3433/4808/3433 +f 4040/1374/4040 4041/5133/4041 4039/2565/4039 4038/5132/4038 +f 4034/688/4034 4037/5131/4037 4039/2565/4039 4041/5133/4041 +f 3423/1289/3423 3433/4808/3433 4039/2565/4039 4037/5131/4037 +f 4024/441/4024 4027/5127/4027 4042/2566/4042 4043/5134/4043 +f 4022/1372/4022 4035/5130/4035 4042/2566/4042 4027/5127/4027 +f 4034/688/4034 4041/5133/4041 4042/2566/4042 4035/5130/4035 +f 4040/1374/4040 4043/5134/4043 4042/2566/4042 4041/5133/4041 +f 576/128/576 1210/3635/1210 4044/2567/4044 3404/4793/3404 +f 1214/977/1214 4045/5135/4045 4044/2567/4044 1210/3635/1210 +f 4046/689/4046 4047/5136/4047 4044/2567/4044 4045/5135/4045 +f 3406/1285/3406 3404/4793/3404 4044/2567/4044 4047/5136/4047 +f 1201/369/1201 4048/5137/4048 4049/2568/4049 1222/3640/1222 +f 4050/1375/4050 4051/5138/4051 4049/2568/4049 4048/5137/4048 +f 4046/689/4046 4045/5135/4045 4049/2568/4049 4051/5138/4051 +f 1214/977/1214 1222/3640/1222 4049/2568/4049 4045/5135/4045 +f 4024/441/4024 4043/5134/4043 4052/2569/4052 4053/5140/4053 +f 4040/1374/4040 4054/5139/4054 4052/2569/4052 4043/5134/4043 +f 4046/689/4046 4051/5138/4051 4052/2569/4052 4054/5139/4054 +f 4050/1375/4050 4053/5140/4053 4052/2569/4052 4051/5138/4051 +f 3408/434/3408 3411/4797/3411 4055/2570/4055 4038/5132/4038 +f 3406/1285/3406 4047/5136/4047 4055/2570/4055 3411/4797/3411 +f 4046/689/4046 4054/5139/4054 4055/2570/4055 4047/5136/4047 +f 4040/1374/4040 4038/5132/4038 4055/2570/4055 4054/5139/4054 +f 1201/369/1201 1204/3631/1204 4056/2571/4056 4048/5137/4048 +f 1199/974/1199 4057/5141/4057 4056/2571/4056 1204/3631/1204 +f 4058/690/4058 4059/5142/4059 4056/2571/4056 4057/5141/4057 +f 4050/1375/4050 4048/5137/4048 4056/2571/4056 4059/5142/4059 +f 1145/228/1145 3990/5107/3990 4060/2572/4060 1197/3627/1197 +f 3994/1370/3994 4061/5143/4061 4060/2572/4060 3990/5107/3990 +f 4058/690/4058 4057/5141/4057 4060/2572/4060 4061/5143/4061 +f 1199/974/1199 1197/3627/1197 4060/2572/4060 4057/5141/4057 +f 3981/439/3981 4031/5128/4031 4062/2573/4062 4002/5114/4002 +f 4028/1373/4028 4063/5144/4063 4062/2573/4062 4031/5128/4031 +f 4058/690/4058 4061/5143/4061 4062/2573/4062 4063/5144/4063 +f 3994/1370/3994 4002/5114/4002 4062/2573/4062 4061/5143/4061 +f 4024/441/4024 4053/5140/4053 4064/2574/4064 4025/5125/4025 +f 4050/1375/4050 4059/5142/4059 4064/2574/4064 4053/5140/4053 +f 4058/690/4058 4063/5144/4063 4064/2574/4064 4059/5142/4059 +f 4028/1373/4028 4025/5125/4025 4064/2574/4064 4063/5144/4063 +f 3292/294/3292 3295/4739/3295 4065/2575/4065 4066/5147/4066 +f 3300/1274/3300 4067/5145/4067 4065/2575/4065 3295/4739/3295 +f 4068/691/4068 4069/5146/4069 4065/2575/4065 4067/5145/4067 +f 4070/1378/4070 4066/5147/4066 4065/2575/4065 4069/5146/4069 +f 3284/298/3284 4071/5148/4071 4072/2576/4072 3310/4746/3310 +f 4073/1376/4073 4074/5149/4074 4072/2576/4072 4071/5148/4071 +f 4068/691/4068 4067/5145/4067 4072/2576/4072 4074/5149/4074 +f 3300/1274/3300 3310/4746/3310 4072/2576/4072 4067/5145/4067 +f 4075/300/4075 4076/5150/4076 4077/2577/4077 4078/5152/4078 +f 4079/1377/4079 4080/5151/4080 4077/2577/4077 4076/5150/4076 +f 4068/691/4068 4074/5149/4074 4077/2577/4077 4080/5151/4080 +f 4073/1376/4073 4078/5152/4078 4077/2577/4077 4074/5149/4074 +f 4081/302/4081 4082/5153/4082 4083/2578/4083 4084/5154/4084 +f 4070/1378/4070 4069/5146/4069 4083/2578/4083 4082/5153/4082 +f 4068/691/4068 4080/5151/4080 4083/2578/4083 4069/5146/4069 +f 4079/1377/4079 4084/5154/4084 4083/2578/4083 4080/5151/4080 +f 3284/298/3284 3287/4733/3287 4085/2579/4085 4071/5148/4071 +f 3282/1269/3282 4086/5155/4086 4085/2579/4085 3287/4733/3287 +f 4087/692/4087 4088/5156/4088 4085/2579/4085 4086/5155/4086 +f 4073/1376/4073 4071/5148/4071 4085/2579/4085 4088/5156/4088 +f 3000/259/3000 3954/5087/3954 4089/2580/4089 3280/4728/3280 +f 3958/1365/3958 4090/5157/4090 4089/2580/4089 3954/5087/3954 +f 4087/692/4087 4086/5155/4086 4089/2580/4089 4090/5157/4090 +f 3282/1269/3282 3280/4728/3280 4089/2580/4089 4086/5155/4086 +f 3969/292/3969 4091/5158/4091 4092/2581/4092 3970/5095/3970 +f 4093/1379/4093 4094/5159/4094 4092/2581/4092 4091/5158/4091 +f 4087/692/4087 4090/5157/4090 4092/2581/4092 4094/5159/4094 +f 3958/1365/3958 3970/5095/3970 4092/2581/4092 4090/5157/4090 +f 4075/300/4075 4078/5152/4078 4095/2582/4095 4096/5160/4096 +f 4073/1376/4073 4088/5156/4088 4095/2582/4095 4078/5152/4078 +f 4087/692/4087 4094/5159/4094 4095/2582/4095 4088/5156/4088 +f 4093/1379/4093 4096/5160/4096 4095/2582/4095 4094/5159/4094 +f 1131/39/1131 1274/3667/1274 4097/2583/4097 4008/5117/4008 +f 1278/985/1278 4098/5161/4098 4097/2583/4097 1274/3667/1274 +f 4099/693/4099 4100/5162/4100 4097/2583/4097 4098/5161/4098 +f 4010/1371/4010 4008/5117/4008 4097/2583/4097 4100/5162/4100 +f 1265/87/1265 4101/5163/4101 4102/2584/4102 1286/3672/1286 +f 4103/1380/4103 4104/5164/4104 4102/2584/4102 4101/5163/4101 +f 4099/693/4099 4098/5161/4098 4102/2584/4102 4104/5164/4104 +f 1278/985/1278 1286/3672/1286 4102/2584/4102 4098/5161/4098 +f 4075/300/4075 4096/5160/4096 4105/2585/4105 4106/5166/4106 +f 4093/1379/4093 4107/5165/4107 4105/2585/4105 4096/5160/4096 +f 4099/693/4099 4104/5164/4104 4105/2585/4105 4107/5165/4107 +f 4103/1380/4103 4106/5166/4106 4105/2585/4105 4104/5164/4104 +f 3969/292/3969 4013/5120/4013 4108/2586/4108 4091/5158/4091 +f 4010/1371/4010 4100/5162/4100 4108/2586/4108 4013/5120/4013 +f 4099/693/4099 4107/5165/4107 4108/2586/4108 4100/5162/4100 +f 4093/1379/4093 4091/5158/4091 4108/2586/4108 4107/5165/4107 +f 1265/87/1265 1268/3663/1268 4109/2587/4109 4101/5163/4101 +f 1263/982/1263 4110/5167/4110 4109/2587/4109 1268/3663/1268 +f 4111/694/4111 4112/5168/4112 4109/2587/4109 4110/5167/4110 +f 4103/1380/4103 4101/5163/4101 4109/2587/4109 4112/5168/4112 +f 1259/85/1259 4113/5169/4113 4114/2588/4114 1260/3658/1260 +f 4115/1381/4115 4116/5170/4116 4114/2588/4114 4113/5169/4113 +f 4111/694/4111 4110/5167/4110 4114/2588/4114 4116/5170/4116 +f 1263/982/1263 1260/3658/1260 4114/2588/4114 4110/5167/4110 +f 4081/302/4081 4084/5154/4084 4117/2589/4117 4118/5172/4118 +f 4079/1377/4079 4119/5171/4119 4117/2589/4117 4084/5154/4084 +f 4111/694/4111 4116/5170/4116 4117/2589/4117 4119/5171/4119 +f 4115/1381/4115 4118/5172/4118 4117/2589/4117 4116/5170/4116 +f 4075/300/4075 4106/5166/4106 4120/2590/4120 4076/5150/4076 +f 4103/1380/4103 4112/5168/4112 4120/2590/4120 4106/5166/4106 +f 4111/694/4111 4119/5171/4119 4120/2590/4120 4112/5168/4112 +f 4079/1377/4079 4076/5150/4076 4120/2590/4120 4119/5171/4119 +f 2945/100/2945 3443/4817/3443 4121/2591/4121 2946/4549/2946 +f 3437/1291/3437 4122/5173/4122 4121/2591/4121 3443/4817/3443 +f 4123/695/4123 4124/5174/4124 4121/2591/4121 4122/5173/4122 +f 2949/1216/2949 2946/4549/2946 4121/2591/4121 4124/5174/4124 +f 3424/240/3424 4125/5175/4125 4126/2592/4126 3435/4810/3435 +f 4127/1382/4127 4128/5177/4128 4126/2592/4126 4125/5175/4125 +f 4123/695/4123 4122/5173/4122 4126/2592/4126 4128/5177/4128 +f 3437/1291/3437 3435/4810/3435 4126/2592/4126 4122/5173/4122 +f 4129/242/4129 4130/5178/4130 4131/2593/4131 4132/5180/4132 +f 4133/1384/4133 4134/5179/4134 4131/2593/4131 4130/5178/4130 +f 4123/695/4123 4128/5177/4128 4131/2593/4131 4134/5179/4134 +f 4127/1382/4127 4132/5180/4132 4131/2593/4131 4128/5177/4128 +f 2895/94/2895 2952/4554/2952 4135/2594/4135 4136/5182/4136 +f 2949/1216/2949 4124/5174/4124 4135/2594/4135 2952/4554/2952 +f 4123/695/4123 4134/5179/4134 4135/2594/4135 4124/5174/4124 +f 4133/1384/4133 4136/5182/4136 4135/2594/4135 4134/5179/4134 +f 3424/435/3424 3427/4805/3427 4137/2595/4137 4125/5176/4125 +f 3419/1287/3419 4138/5183/4138 4137/2595/4137 3427/4805/3427 +f 4139/696/4139 4140/5184/4140 4137/2595/4137 4138/5183/4138 +f 4127/1383/4127 4125/5176/4125 4137/2595/4137 4140/5184/4140 +f 3219/387/3219 3222/4696/3222 4141/2596/4141 3416/4799/3416 +f 3215/1259/3215 4142/5185/4142 4141/2596/4141 3222/4696/3222 +f 4139/696/4139 4138/5183/4138 4141/2596/4141 4142/5185/4142 +f 3419/1287/3419 3416/4799/3416 4141/2596/4141 4138/5183/4138 +f 3197/386/3197 4143/5186/4143 4144/2597/4144 3213/4691/3213 +f 4145/1385/4145 4146/5188/4146 4144/2597/4144 4143/5186/4143 +f 4139/696/4139 4142/5185/4142 4144/2597/4144 4146/5188/4146 +f 3215/1259/3215 3213/4691/3213 4144/2597/4144 4142/5185/4142 +f 4129/442/4129 4132/5181/4132 4147/2598/4147 4148/5189/4148 +f 4127/1383/4127 4140/5184/4140 4147/2598/4147 4132/5181/4132 +f 4139/696/4139 4146/5188/4146 4147/2598/4147 4140/5184/4140 +f 4145/1385/4145 4148/5189/4148 4147/2598/4147 4146/5188/4146 +f 3188/142/3188 3881/5047/3881 4149/2599/4149 3189/4677/3189 +f 3885/1355/3885 4150/5191/4150 4149/2599/4149 3881/5047/3881 +f 4151/697/4151 4152/5192/4152 4149/2599/4149 4150/5191/4150 +f 3192/1254/3192 3189/4677/3189 4149/2599/4149 4152/5192/4152 +f 3872/235/3872 4153/5193/4153 4154/2600/4154 3893/5052/3893 +f 4155/1387/4155 4156/5194/4156 4154/2600/4154 4153/5193/4153 +f 4151/697/4151 4150/5191/4150 4154/2600/4154 4156/5194/4156 +f 3885/1355/3885 3893/5052/3893 4154/2600/4154 4150/5191/4150 +f 4129/242/4129 4148/5190/4148 4157/2601/4157 4158/5196/4158 +f 4145/1386/4145 4159/5195/4159 4157/2601/4157 4148/5190/4148 +f 4151/697/4151 4156/5194/4156 4157/2601/4157 4159/5195/4159 +f 4155/1387/4155 4158/5196/4158 4157/2601/4157 4156/5194/4156 +f 3197/143/3197 3200/4684/3200 4160/2602/4160 4143/5187/4143 +f 3192/1254/3192 4152/5192/4152 4160/2602/4160 3200/4684/3200 +f 4151/697/4151 4159/5195/4159 4160/2602/4160 4152/5192/4152 +f 4145/1386/4145 4143/5187/4143 4160/2602/4160 4159/5195/4159 +f 3872/235/3872 3875/5043/3875 4161/2603/4161 4153/5193/4153 +f 3870/1352/3870 4162/5197/4162 4161/2603/4161 3875/5043/3875 +f 4163/698/4163 4164/5198/4164 4161/2603/4161 4162/5197/4162 +f 4155/1387/4155 4153/5193/4153 4161/2603/4161 4164/5198/4164 +f 2874/89/2874 2877/4514/2877 4165/2604/4165 3868/5039/3868 +f 2882/1206/2882 4166/5199/4166 4165/2604/4165 2877/4514/2877 +f 4163/698/4163 4162/5197/4162 4165/2604/4165 4166/5199/4166 +f 3870/1352/3870 3868/5039/3868 4165/2604/4165 4162/5197/4162 +f 2895/94/2895 4136/5182/4136 4167/2605/4167 2896/4521/2896 +f 4133/1384/4133 4168/5200/4168 4167/2605/4167 4136/5182/4136 +f 4163/698/4163 4166/5199/4166 4167/2605/4167 4168/5200/4168 +f 2882/1206/2882 2896/4521/2896 4167/2605/4167 4166/5199/4166 +f 4129/242/4129 4158/5196/4158 4169/2606/4169 4130/5178/4130 +f 4155/1387/4155 4164/5198/4164 4169/2606/4169 4158/5196/4158 +f 4163/698/4163 4168/5200/4168 4169/2606/4169 4164/5198/4164 +f 4133/1384/4133 4130/5178/4130 4169/2606/4169 4168/5200/4168 +f 3486/310/3486 3489/4845/3489 4170/2607/4170 4171/5203/4171 +f 3494/1303/3494 4172/5201/4172 4170/2607/4170 3489/4845/3489 +f 4173/699/4173 4174/5202/4174 4170/2607/4170 4172/5201/4172 +f 4175/1390/4175 4171/5203/4171 4170/2607/4170 4174/5202/4174 +f 3478/323/3478 4176/5204/4176 4177/2608/4177 3504/4852/3504 +f 4178/1388/4178 4179/5205/4179 4177/2608/4177 4176/5204/4176 +f 4173/699/4173 4172/5201/4172 4177/2608/4177 4179/5205/4179 +f 3494/1303/3494 3504/4852/3504 4177/2608/4177 4172/5201/4172 +f 4180/329/4180 4181/5206/4181 4182/2609/4182 4183/5208/4183 +f 4184/1389/4184 4185/5207/4185 4182/2609/4182 4181/5206/4181 +f 4173/699/4173 4179/5205/4179 4182/2609/4182 4185/5207/4185 +f 4178/1388/4178 4183/5208/4183 4182/2609/4182 4179/5205/4179 +f 4186/334/4186 4187/5209/4187 4188/2610/4188 4189/5210/4189 +f 4175/1390/4175 4174/5202/4174 4188/2610/4188 4187/5209/4187 +f 4173/699/4173 4185/5207/4185 4188/2610/4188 4174/5202/4174 +f 4184/1389/4184 4189/5210/4189 4188/2610/4188 4185/5207/4185 +f 3478/323/3478 3481/4839/3481 4190/2611/4190 4176/5204/4176 +f 3476/1298/3476 4191/5211/4191 4190/2611/4190 3481/4839/3481 +f 4192/700/4192 4193/5212/4193 4190/2611/4190 4191/5211/4191 +f 4178/1388/4178 4176/5204/4176 4190/2611/4190 4193/5212/4193 +f 3292/294/3292 4066/5147/4066 4194/2612/4194 3474/4834/3474 +f 4070/1378/4070 4195/5213/4195 4194/2612/4194 4066/5147/4066 +f 4192/700/4192 4191/5211/4191 4194/2612/4194 4195/5213/4195 +f 3476/1298/3476 3474/4834/3474 4194/2612/4194 4191/5211/4191 +f 4081/302/4081 4196/5214/4196 4197/2613/4197 4082/5153/4082 +f 4198/1391/4198 4199/5215/4199 4197/2613/4197 4196/5214/4196 +f 4192/700/4192 4195/5213/4195 4197/2613/4197 4199/5215/4199 +f 4070/1378/4070 4082/5153/4082 4197/2613/4197 4195/5213/4195 +f 4180/329/4180 4183/5208/4183 4200/2614/4200 4201/5216/4201 +f 4178/1388/4178 4193/5212/4193 4200/2614/4200 4183/5208/4183 +f 4192/700/4192 4199/5215/4199 4200/2614/4200 4193/5212/4193 +f 4198/1391/4198 4201/5216/4201 4200/2614/4200 4199/5215/4199 +f 1259/85/1259 1387/3727/1387 4202/2615/4202 4113/5169/4113 +f 1391/999/1391 4203/5217/4203 4202/2615/4202 1387/3727/1387 +f 4204/701/4204 4205/5218/4205 4202/2615/4202 4203/5217/4203 +f 4115/1381/4115 4113/5169/4113 4202/2615/4202 4205/5218/4205 +f 1378/131/1378 4206/5219/4206 4207/2616/4207 1399/3732/1399 +f 4208/1392/4208 4209/5220/4209 4207/2616/4207 4206/5219/4206 +f 4204/701/4204 4203/5217/4203 4207/2616/4207 4209/5220/4209 +f 1391/999/1391 1399/3732/1399 4207/2616/4207 4203/5217/4203 +f 4180/329/4180 4201/5216/4201 4210/2617/4210 4211/5222/4211 +f 4198/1391/4198 4212/5221/4212 4210/2617/4210 4201/5216/4201 +f 4204/701/4204 4209/5220/4209 4210/2617/4210 4212/5221/4212 +f 4208/1392/4208 4211/5222/4211 4210/2617/4210 4209/5220/4209 +f 4081/302/4081 4118/5172/4118 4213/2618/4213 4196/5214/4196 +f 4115/1381/4115 4205/5218/4205 4213/2618/4213 4118/5172/4118 +f 4204/701/4204 4212/5221/4212 4213/2618/4213 4205/5218/4205 +f 4198/1391/4198 4196/5214/4196 4213/2618/4213 4212/5221/4212 +f 1378/131/1378 1381/3723/1381 4214/2619/4214 4206/5219/4206 +f 1376/996/1376 4215/5223/4215 4214/2619/4214 1381/3723/1381 +f 4216/702/4216 4217/5224/4217 4214/2619/4214 4215/5223/4215 +f 4208/1392/4208 4206/5219/4206 4214/2619/4214 4217/5224/4217 +f 1372/129/1372 4218/5225/4218 4219/2620/4219 1373/3718/1373 +f 4220/1393/4220 4221/5226/4221 4219/2620/4219 4218/5225/4218 +f 4216/702/4216 4215/5223/4215 4219/2620/4219 4221/5226/4221 +f 1376/996/1376 1373/3718/1373 4219/2620/4219 4215/5223/4215 +f 4186/334/4186 4189/5210/4189 4222/2621/4222 4223/5228/4223 +f 4184/1389/4184 4224/5227/4224 4222/2621/4222 4189/5210/4189 +f 4216/702/4216 4221/5226/4221 4222/2621/4222 4224/5227/4224 +f 4220/1393/4220 4223/5228/4223 4222/2621/4222 4221/5226/4221 +f 4180/329/4180 4211/5222/4211 4225/2622/4225 4181/5206/4181 +f 4208/1392/4208 4217/5224/4217 4225/2622/4225 4211/5222/4211 +f 4216/702/4216 4224/5227/4224 4225/2622/4225 4217/5224/4217 +f 4184/1389/4184 4181/5206/4181 4225/2622/4225 4224/5227/4224 +f 3697/243/3697 3700/4955/3700 4226/2623/4226 4227/5231/4227 +f 3705/1334/3705 4228/5229/4228 4226/2623/4226 3700/4955/3700 +f 4229/703/4229 4230/5230/4230 4226/2623/4226 4228/5229/4228 +f 4231/1396/4231 4227/5231/4227 4226/2623/4226 4230/5230/4230 +f 3689/244/3689 4232/5232/4232 4233/2624/4233 3715/4962/3715 +f 4234/1394/4234 4235/5233/4235 4233/2624/4233 4232/5232/4232 +f 4229/703/4229 4228/5229/4228 4233/2624/4233 4235/5233/4235 +f 3705/1334/3705 3715/4962/3715 4233/2624/4233 4228/5229/4228 +f 4236/245/4236 4237/5234/4237 4238/2625/4238 4239/5236/4239 +f 4240/1395/4240 4241/5235/4241 4238/2625/4238 4237/5234/4237 +f 4229/703/4229 4235/5233/4235 4238/2625/4238 4241/5235/4241 +f 4234/1394/4234 4239/5236/4239 4238/2625/4238 4235/5233/4235 +f 4242/246/4242 4243/5237/4243 4244/2626/4244 4245/5238/4245 +f 4231/1396/4231 4230/5230/4230 4244/2626/4244 4243/5237/4243 +f 4229/703/4229 4241/5235/4241 4244/2626/4244 4230/5230/4230 +f 4240/1395/4240 4245/5238/4245 4244/2626/4244 4241/5235/4241 +f 3689/244/3689 3692/4949/3692 4246/2627/4246 4232/5232/4232 +f 3687/1329/3687 4247/5239/4247 4246/2627/4246 3692/4949/3692 +f 4248/704/4248 4249/5240/4249 4246/2627/4246 4247/5239/4247 +f 4234/1394/4234 4232/5232/4232 4246/2627/4246 4249/5240/4249 +f 2919/98/2919 2922/4537/2922 4250/2628/4250 3684/4943/3684 +f 2927/1213/2927 4251/5241/4251 4250/2628/4250 2922/4537/2922 +f 4248/704/4248 4247/5239/4247 4250/2628/4250 4251/5241/4251 +f 3687/1329/3687 3684/4943/3684 4250/2628/4250 4247/5239/4247 +f 2911/97/2911 4252/5242/4252 4253/2629/4253 2937/4544/2937 +f 4254/1397/4254 4255/5243/4255 4253/2629/4253 4252/5242/4252 +f 4248/704/4248 4251/5241/4251 4253/2629/4253 4255/5243/4255 +f 2927/1213/2927 2937/4544/2937 4253/2629/4253 4251/5241/4251 +f 4236/245/4236 4239/5236/4239 4256/2630/4256 4257/5244/4257 +f 4234/1394/4234 4249/5240/4249 4256/2630/4256 4239/5236/4239 +f 4248/704/4248 4255/5243/4255 4256/2630/4256 4249/5240/4249 +f 4254/1397/4254 4257/5244/4257 4256/2630/4256 4255/5243/4255 +f 2905/96/2905 3523/4863/3523 4258/2631/4258 2906/4526/2906 +f 3527/1308/3527 4259/5245/4259 4258/2631/4258 3523/4863/3523 +f 4260/705/4260 4261/5246/4261 4258/2631/4258 4259/5245/4259 +f 2909/1208/2909 2906/4526/2906 4258/2631/4258 4261/5246/4261 +f 3538/165/3538 4262/5247/4262 4263/2632/4263 3539/4869/3539 +f 4264/1398/4264 4265/5248/4265 4263/2632/4263 4262/5247/4262 +f 4260/705/4260 4259/5245/4259 4263/2632/4263 4265/5248/4265 +f 3527/1308/3527 3539/4869/3539 4263/2632/4263 4259/5245/4259 +f 4236/245/4236 4257/5244/4257 4266/2633/4266 4267/5250/4267 +f 4254/1397/4254 4268/5249/4268 4266/2633/4266 4257/5244/4257 +f 4260/705/4260 4265/5248/4265 4266/2633/4266 4268/5249/4268 +f 4264/1398/4264 4267/5250/4267 4266/2633/4266 4265/5248/4265 +f 2911/97/2911 2914/4531/2914 4269/2634/4269 4252/5242/4252 +f 2909/1208/2909 4261/5246/4261 4269/2634/4269 2914/4531/2914 +f 4260/705/4260 4268/5249/4268 4269/2634/4269 4261/5246/4261 +f 4254/1397/4254 4252/5242/4252 4269/2634/4269 4268/5249/4268 +f 3538/165/3538 3591/4896/3591 4270/2635/4270 4262/5247/4262 +f 3588/1315/3588 4271/5251/4271 4270/2635/4270 3591/4896/3591 +f 4272/706/4272 4273/5252/4273 4270/2635/4270 4271/5251/4271 +f 4264/1398/4264 4262/5247/4262 4270/2635/4270 4273/5252/4273 +f 3584/222/3584 4274/5253/4274 4275/2636/4275 3585/4892/3585 +f 4276/1399/4276 4277/5254/4277 4275/2636/4275 4274/5253/4274 +f 4272/706/4272 4271/5251/4271 4275/2636/4275 4277/5254/4277 +f 3588/1315/3588 3585/4892/3585 4275/2636/4275 4271/5251/4271 +f 4242/246/4242 4245/5238/4245 4278/2637/4278 4279/5256/4279 +f 4240/1395/4240 4280/5255/4280 4278/2637/4278 4245/5238/4245 +f 4272/706/4272 4277/5254/4277 4278/2637/4278 4280/5255/4280 +f 4276/1399/4276 4279/5256/4279 4278/2637/4278 4277/5254/4277 +f 4236/245/4236 4267/5250/4267 4281/2638/4281 4237/5234/4237 +f 4264/1398/4264 4273/5252/4273 4281/2638/4281 4267/5250/4267 +f 4272/706/4272 4280/5255/4280 4281/2638/4281 4273/5252/4273 +f 4240/1395/4240 4237/5234/4237 4281/2638/4281 4280/5255/4280 +f 4282/247/4282 4283/5257/4283 4284/2639/4284 4285/5260/4285 +f 4286/1400/4286 4287/5258/4287 4284/2639/4284 4283/5257/4283 +f 4288/707/4288 4289/5259/4289 4284/2639/4284 4287/5258/4287 +f 4290/1403/4290 4285/5260/4285 4284/2639/4284 4289/5259/4289 +f 4291/248/4291 4292/5261/4292 4293/2640/4293 4294/5263/4294 +f 4295/1401/4295 4296/5262/4296 4293/2640/4293 4292/5261/4292 +f 4288/707/4288 4287/5258/4287 4293/2640/4293 4296/5262/4296 +f 4286/1400/4286 4294/5263/4294 4293/2640/4293 4287/5258/4287 +f 4297/249/4297 4298/5264/4298 4299/2641/4299 4300/5266/4300 +f 4301/1402/4301 4302/5265/4302 4299/2641/4299 4298/5264/4298 +f 4288/707/4288 4296/5262/4296 4299/2641/4299 4302/5265/4302 +f 4295/1401/4295 4300/5266/4300 4299/2641/4299 4296/5262/4296 +f 4303/251/4303 4304/5267/4304 4305/2642/4305 4306/5268/4306 +f 4290/1403/4290 4289/5259/4289 4305/2642/4305 4304/5267/4304 +f 4288/707/4288 4302/5265/4302 4305/2642/4305 4289/5259/4289 +f 4301/1402/4301 4306/5268/4306 4305/2642/4305 4302/5265/4302 +f 4291/248/4291 4307/5269/4307 4308/2643/4308 4292/5261/4292 +f 4309/1404/4309 4310/5270/4310 4308/2643/4308 4307/5269/4307 +f 4311/708/4311 4312/5271/4312 4308/2643/4308 4310/5270/4310 +f 4295/1401/4295 4292/5261/4292 4308/2643/4308 4312/5271/4312 +f 4313/252/4313 4314/5272/4314 4315/2644/4315 4316/5275/4316 +f 4317/1405/4317 4318/5274/4318 4315/2644/4315 4314/5272/4314 +f 4311/708/4311 4310/5270/4310 4315/2644/4315 4318/5274/4318 +f 4309/1404/4309 4316/5275/4316 4315/2644/4315 4310/5270/4310 +f 4319/253/4319 4320/5276/4320 4321/2645/4321 4322/5278/4322 +f 4323/1407/4323 4324/5277/4324 4321/2645/4321 4320/5276/4320 +f 4311/708/4311 4318/5274/4318 4321/2645/4321 4324/5277/4324 +f 4317/1405/4317 4322/5278/4322 4321/2645/4321 4318/5274/4318 +f 4297/249/4297 4300/5266/4300 4325/2646/4325 4326/5280/4326 +f 4295/1401/4295 4312/5271/4312 4325/2646/4325 4300/5266/4300 +f 4311/708/4311 4324/5277/4324 4325/2646/4325 4312/5271/4312 +f 4323/1407/4323 4326/5280/4326 4325/2646/4325 4324/5277/4324 +f 4327/255/4327 4328/5281/4328 4329/2647/4329 4330/5284/4330 +f 4331/1408/4331 4332/5282/4332 4329/2647/4329 4328/5281/4328 +f 4333/709/4333 4334/5283/4334 4329/2647/4329 4332/5282/4332 +f 4335/1410/4335 4330/5284/4330 4329/2647/4329 4334/5283/4334 +f 4336/256/4336 4337/5286/4337 4338/2648/4338 4339/5288/4339 +f 4340/1409/4340 4341/5287/4341 4338/2648/4338 4337/5286/4337 +f 4333/709/4333 4332/5282/4332 4338/2648/4338 4341/5287/4341 +f 4331/1408/4331 4339/5288/4339 4338/2648/4338 4332/5282/4332 +f 4297/249/4297 4326/5280/4326 4342/2649/4342 4343/5290/4343 +f 4323/1407/4323 4344/5289/4344 4342/2649/4342 4326/5280/4326 +f 4333/709/4333 4341/5287/4341 4342/2649/4342 4344/5289/4344 +f 4340/1409/4340 4343/5290/4343 4342/2649/4342 4341/5287/4341 +f 4319/253/4319 4345/5291/4345 4346/2650/4346 4320/5276/4320 +f 4335/1410/4335 4334/5283/4334 4346/2650/4346 4345/5291/4345 +f 4333/709/4333 4344/5289/4344 4346/2650/4346 4334/5283/4334 +f 4323/1407/4323 4320/5276/4320 4346/2650/4346 4344/5289/4344 +f 4336/256/4336 4347/5293/4347 4348/2651/4348 4337/5286/4337 +f 4349/1412/4349 4350/5294/4350 4348/2651/4348 4347/5293/4347 +f 4351/710/4351 4352/5295/4352 4348/2651/4348 4350/5294/4350 +f 4340/1409/4340 4337/5286/4337 4348/2651/4348 4352/5295/4352 +f 4353/257/4353 4354/5296/4354 4355/2652/4355 4356/5298/4356 +f 4357/1413/4357 4358/5297/4358 4355/2652/4355 4354/5296/4354 +f 4351/710/4351 4350/5294/4350 4355/2652/4355 4358/5297/4358 +f 4349/1412/4349 4356/5298/4356 4355/2652/4355 4350/5294/4350 +f 4303/251/4303 4306/5268/4306 4359/2653/4359 4360/5300/4360 +f 4301/1402/4301 4361/5299/4361 4359/2653/4359 4306/5268/4306 +f 4351/710/4351 4358/5297/4358 4359/2653/4359 4361/5299/4361 +f 4357/1413/4357 4360/5300/4360 4359/2653/4359 4358/5297/4358 +f 4297/249/4297 4343/5290/4343 4362/2654/4362 4298/5264/4298 +f 4340/1409/4340 4352/5295/4352 4362/2654/4362 4343/5290/4343 +f 4351/710/4351 4361/5299/4361 4362/2654/4362 4352/5295/4352 +f 4301/1402/4301 4298/5264/4298 4362/2654/4362 4361/5299/4361 +f 4363/262/4363 4364/5301/4364 4365/2655/4365 4366/5304/4366 +f 4367/1414/4367 4368/5302/4368 4365/2655/4365 4364/5301/4364 +f 4369/711/4369 4370/5303/4370 4365/2655/4365 4368/5302/4368 +f 4371/1417/4371 4366/5304/4366 4365/2655/4365 4370/5303/4370 +f 4372/264/4372 4373/5305/4373 4374/2656/4374 4375/5307/4375 +f 4376/1415/4376 4377/5306/4377 4374/2656/4374 4373/5305/4373 +f 4369/711/4369 4368/5302/4368 4374/2656/4374 4377/5306/4377 +f 4367/1414/4367 4375/5307/4375 4374/2656/4374 4368/5302/4368 +f 4378/346/4378 4379/5308/4379 4380/2657/4380 4381/5310/4381 +f 4382/1416/4382 4383/5309/4383 4380/2657/4380 4379/5308/4379 +f 4369/711/4369 4377/5306/4377 4380/2657/4380 4383/5309/4383 +f 4376/1415/4376 4381/5310/4381 4380/2657/4380 4377/5306/4377 +f 4384/348/4384 4385/5311/4385 4386/2658/4386 4387/5312/4387 +f 4371/1417/4371 4370/5303/4370 4386/2658/4386 4385/5311/4385 +f 4369/711/4369 4383/5309/4383 4386/2658/4386 4370/5303/4370 +f 4382/1416/4382 4387/5312/4387 4386/2658/4386 4383/5309/4383 +f 4372/264/4372 4388/5313/4388 4389/2659/4389 4373/5305/4373 +f 4390/1418/4390 4391/5314/4391 4389/2659/4389 4388/5313/4388 +f 4392/712/4392 4393/5315/4393 4389/2659/4389 4391/5314/4391 +f 4376/1415/4376 4373/5305/4373 4389/2659/4389 4393/5315/4393 +f 4394/349/4394 4395/5316/4395 4396/2660/4396 4397/5318/4397 +f 4398/1419/4398 4399/5317/4399 4396/2660/4396 4395/5316/4395 +f 4392/712/4392 4391/5314/4391 4396/2660/4396 4399/5317/4399 +f 4390/1418/4390 4397/5318/4397 4396/2660/4396 4391/5314/4391 +f 4400/350/4400 4401/5319/4401 4402/2661/4402 4403/5321/4403 +f 4404/1420/4404 4405/5320/4405 4402/2661/4402 4401/5319/4401 +f 4392/712/4392 4399/5317/4399 4402/2661/4402 4405/5320/4405 +f 4398/1419/4398 4403/5321/4403 4402/2661/4402 4399/5317/4399 +f 4378/346/4378 4381/5310/4381 4406/2662/4406 4407/5322/4407 +f 4376/1415/4376 4393/5315/4393 4406/2662/4406 4381/5310/4381 +f 4392/712/4392 4405/5320/4405 4406/2662/4406 4393/5315/4393 +f 4404/1420/4404 4407/5322/4407 4406/2662/4406 4405/5320/4405 +f 4408/351/4408 4409/5323/4409 4410/2663/4410 4411/5327/4411 +f 4412/1421/4412 4413/5325/4413 4410/2663/4410 4409/5323/4409 +f 4414/713/4414 4415/5326/4415 4410/2663/4410 4413/5325/4413 +f 4416/1424/4416 4411/5327/4411 4410/2663/4410 4415/5326/4415 +f 4417/353/4417 4418/5328/4418 4419/2664/4419 4420/5330/4420 +f 4421/1423/4421 4422/5329/4422 4419/2664/4419 4418/5328/4418 +f 4414/713/4414 4413/5325/4413 4419/2664/4419 4422/5329/4422 +f 4412/1421/4412 4420/5330/4420 4419/2664/4419 4413/5325/4413 +f 4378/346/4378 4407/5322/4407 4423/2665/4423 4424/5333/4424 +f 4404/1420/4404 4425/5332/4425 4423/2665/4423 4407/5322/4407 +f 4414/713/4414 4422/5329/4422 4423/2665/4423 4425/5332/4425 +f 4421/1423/4421 4424/5333/4424 4423/2665/4423 4422/5329/4422 +f 4400/350/4400 4426/5334/4426 4427/2666/4427 4401/5319/4401 +f 4416/1424/4416 4415/5326/4415 4427/2666/4427 4426/5334/4426 +f 4414/713/4414 4425/5332/4425 4427/2666/4427 4415/5326/4415 +f 4404/1420/4404 4401/5319/4401 4427/2666/4427 4425/5332/4425 +f 4417/353/4417 4428/5335/4428 4429/2667/4429 4418/5328/4418 +f 4430/1425/4430 4431/5337/4431 4429/2667/4429 4428/5335/4428 +f 4432/714/4432 4433/5338/4433 4429/2667/4429 4431/5337/4431 +f 4421/1423/4421 4418/5328/4418 4429/2667/4429 4433/5338/4433 +f 4434/354/4434 4435/5339/4435 4436/2668/4436 4437/5342/4437 +f 4438/1427/4438 4439/5341/4439 4436/2668/4436 4435/5339/4435 +f 4432/714/4432 4431/5337/4431 4436/2668/4436 4439/5341/4439 +f 4430/1425/4430 4437/5342/4437 4436/2668/4436 4431/5337/4431 +f 4384/348/4384 4387/5312/4387 4440/2669/4440 4441/5345/4441 +f 4382/1416/4382 4442/5344/4442 4440/2669/4440 4387/5312/4387 +f 4432/714/4432 4439/5341/4439 4440/2669/4440 4442/5344/4442 +f 4438/1427/4438 4441/5345/4441 4440/2669/4440 4439/5341/4439 +f 4378/346/4378 4424/5333/4424 4443/2670/4443 4379/5308/4379 +f 4421/1423/4421 4433/5338/4433 4443/2670/4443 4424/5333/4424 +f 4432/714/4432 4442/5344/4442 4443/2670/4443 4433/5338/4433 +f 4382/1416/4382 4379/5308/4379 4443/2670/4443 4442/5344/4442 +f 4353/257/4353 4444/5347/4444 4445/2671/4445 4354/5296/4354 +f 4446/1429/4446 4447/5348/4447 4445/2671/4445 4444/5347/4444 +f 4448/715/4448 4449/5349/4449 4445/2671/4445 4447/5348/4447 +f 4357/1413/4357 4354/5296/4354 4445/2671/4445 4449/5349/4449 +f 4450/355/4450 4451/5350/4451 4452/2672/4452 4453/5352/4453 +f 4454/1430/4454 4455/5351/4455 4452/2672/4452 4451/5350/4451 +f 4448/715/4448 4447/5348/4447 4452/2672/4452 4455/5351/4455 +f 4446/1429/4446 4453/5352/4453 4452/2672/4452 4447/5348/4447 +f 4456/356/4456 4457/5353/4457 4458/2673/4458 4459/5355/4459 +f 4460/1431/4460 4461/5354/4461 4458/2673/4458 4457/5353/4457 +f 4448/715/4448 4455/5351/4455 4458/2673/4458 4461/5354/4461 +f 4454/1430/4454 4459/5355/4459 4458/2673/4458 4455/5351/4455 +f 4303/251/4303 4360/5300/4360 4462/2674/4462 4463/5356/4463 +f 4357/1413/4357 4449/5349/4449 4462/2674/4462 4360/5300/4360 +f 4448/715/4448 4461/5354/4461 4462/2674/4462 4449/5349/4449 +f 4460/1431/4460 4463/5356/4463 4462/2674/4462 4461/5354/4461 +f 4450/355/4450 4464/5357/4464 4465/2675/4465 4451/5350/4451 +f 4466/1432/4466 4467/5358/4467 4465/2675/4465 4464/5357/4464 +f 4468/716/4468 4469/5359/4469 4465/2675/4465 4467/5358/4467 +f 4454/1430/4454 4451/5350/4451 4465/2675/4465 4469/5359/4469 +f 4470/357/4470 4471/5360/4471 4472/2676/4472 4473/5362/4473 +f 4474/1433/4474 4475/5361/4475 4472/2676/4472 4471/5360/4471 +f 4468/716/4468 4467/5358/4467 4472/2676/4472 4475/5361/4475 +f 4466/1432/4466 4473/5362/4473 4472/2676/4472 4467/5358/4467 +f 4476/358/4476 4477/5363/4477 4478/2677/4478 4479/5365/4479 +f 4480/1434/4480 4481/5364/4481 4478/2677/4478 4477/5363/4477 +f 4468/716/4468 4475/5361/4475 4478/2677/4478 4481/5364/4481 +f 4474/1433/4474 4479/5365/4479 4478/2677/4478 4475/5361/4475 +f 4456/356/4456 4459/5355/4459 4482/2678/4482 4483/5366/4483 +f 4454/1430/4454 4469/5359/4469 4482/2678/4482 4459/5355/4459 +f 4468/716/4468 4481/5364/4481 4482/2678/4482 4469/5359/4469 +f 4480/1434/4480 4483/5366/4483 4482/2678/4482 4481/5364/4481 +f 4484/359/4484 4485/5367/4485 4486/2679/4486 4487/5370/4487 +f 4488/1435/4488 4489/5368/4489 4486/2679/4486 4485/5367/4485 +f 4490/717/4490 4491/5369/4491 4486/2679/4486 4489/5368/4489 +f 4492/1437/4492 4487/5370/4487 4486/2679/4486 4491/5369/4491 +f 4493/360/4493 4494/5371/4494 4495/2680/4495 4496/5373/4496 +f 4497/1436/4497 4498/5372/4498 4495/2680/4495 4494/5371/4494 +f 4490/717/4490 4489/5368/4489 4495/2680/4495 4498/5372/4498 +f 4488/1435/4488 4496/5373/4496 4495/2680/4495 4489/5368/4489 +f 4456/356/4456 4483/5366/4483 4499/2681/4499 4500/5375/4500 +f 4480/1434/4480 4501/5374/4501 4499/2681/4499 4483/5366/4483 +f 4490/717/4490 4498/5372/4498 4499/2681/4499 4501/5374/4501 +f 4497/1436/4497 4500/5375/4500 4499/2681/4499 4498/5372/4498 +f 4476/358/4476 4502/5376/4502 4503/2682/4503 4477/5363/4477 +f 4492/1437/4492 4491/5369/4491 4503/2682/4503 4502/5376/4502 +f 4490/717/4490 4501/5374/4501 4503/2682/4503 4491/5369/4491 +f 4480/1434/4480 4477/5363/4477 4503/2682/4503 4501/5374/4501 +f 4493/360/4493 4504/5377/4504 4505/2683/4505 4494/5371/4494 +f 4506/1438/4506 4507/5378/4507 4505/2683/4505 4504/5377/4504 +f 4508/718/4508 4509/5379/4509 4505/2683/4505 4507/5378/4507 +f 4497/1436/4497 4494/5371/4494 4505/2683/4505 4509/5379/4509 +f 4282/247/4282 4285/5260/4285 4510/2684/4510 4511/5381/4511 +f 4290/1403/4290 4512/5380/4512 4510/2684/4510 4285/5260/4285 +f 4508/718/4508 4507/5378/4507 4510/2684/4510 4512/5380/4512 +f 4506/1438/4506 4511/5381/4511 4510/2684/4510 4507/5378/4507 +f 4303/251/4303 4463/5356/4463 4513/2685/4513 4304/5267/4304 +f 4460/1431/4460 4514/5382/4514 4513/2685/4513 4463/5356/4463 +f 4508/718/4508 4512/5380/4512 4513/2685/4513 4514/5382/4514 +f 4290/1403/4290 4304/5267/4304 4513/2685/4513 4512/5380/4512 +f 4456/356/4456 4500/5375/4500 4515/2686/4515 4457/5353/4457 +f 4497/1436/4497 4509/5379/4509 4515/2686/4515 4500/5375/4500 +f 4508/718/4508 4514/5382/4514 4515/2686/4515 4509/5379/4509 +f 4460/1431/4460 4457/5353/4457 4515/2686/4515 4514/5382/4514 +f 4516/361/4516 4517/5383/4517 4518/2687/4518 4519/5386/4519 +f 4520/1439/4520 4521/5384/4521 4518/2687/4518 4517/5383/4517 +f 4522/719/4522 4523/5385/4523 4518/2687/4518 4521/5384/4521 +f 4524/1442/4524 4519/5386/4519 4518/2687/4518 4523/5385/4523 +f 4525/363/4525 4526/5387/4526 4527/2688/4527 4528/5389/4528 +f 4529/1440/4529 4530/5388/4530 4527/2688/4527 4526/5387/4526 +f 4522/719/4522 4521/5384/4521 4527/2688/4527 4530/5388/4530 +f 4520/1439/4520 4528/5389/4528 4527/2688/4527 4521/5384/4521 +f 4531/364/4531 4532/5390/4532 4533/2689/4533 4534/5392/4534 +f 4535/1441/4535 4536/5391/4536 4533/2689/4533 4532/5390/4532 +f 4522/719/4522 4530/5388/4530 4533/2689/4533 4536/5391/4536 +f 4529/1440/4529 4534/5392/4534 4533/2689/4533 4530/5388/4530 +f 4537/366/4537 4538/5393/4538 4539/2690/4539 4540/5394/4540 +f 4524/1442/4524 4523/5385/4523 4539/2690/4539 4538/5393/4538 +f 4522/719/4522 4536/5391/4536 4539/2690/4539 4523/5385/4523 +f 4535/1441/4535 4540/5394/4540 4539/2690/4539 4536/5391/4536 +f 4525/363/4525 4541/5395/4541 4542/2691/4542 4526/5387/4526 +f 4543/1443/4543 4544/5396/4544 4542/2691/4542 4541/5395/4541 +f 4545/720/4545 4546/5397/4546 4542/2691/4542 4544/5396/4544 +f 4529/1440/4529 4526/5387/4526 4542/2691/4542 4546/5397/4546 +f 4547/368/4547 4548/5398/4548 4549/2692/4549 4550/5400/4550 +f 4551/1444/4551 4552/5399/4552 4549/2692/4549 4548/5398/4548 +f 4545/720/4545 4544/5396/4544 4549/2692/4549 4552/5399/4552 +f 4543/1443/4543 4550/5400/4550 4549/2692/4549 4544/5396/4544 +f 4553/371/4553 4554/5401/4554 4555/2693/4555 4556/5403/4556 +f 4557/1445/4557 4558/5402/4558 4555/2693/4555 4554/5401/4554 +f 4545/720/4545 4552/5399/4552 4555/2693/4555 4558/5402/4558 +f 4551/1444/4551 4556/5403/4556 4555/2693/4555 4552/5399/4552 +f 4531/364/4531 4534/5392/4534 4559/2694/4559 4560/5404/4560 +f 4529/1440/4529 4546/5397/4546 4559/2694/4559 4534/5392/4534 +f 4545/720/4545 4558/5402/4558 4559/2694/4559 4546/5397/4546 +f 4557/1445/4557 4560/5404/4560 4559/2694/4559 4558/5402/4558 +f 4394/349/4394 4561/5405/4561 4562/2695/4562 4563/5408/4563 +f 4564/1446/4564 4565/5406/4565 4562/2695/4562 4561/5405/4561 +f 4566/721/4566 4567/5407/4567 4562/2695/4562 4565/5406/4565 +f 4568/1448/4568 4563/5408/4563 4562/2695/4562 4567/5407/4567 +f 4569/372/4569 4570/5409/4570 4571/2696/4571 4572/5411/4572 +f 4573/1447/4573 4574/5410/4574 4571/2696/4571 4570/5409/4570 +f 4566/721/4566 4565/5406/4565 4571/2696/4571 4574/5410/4574 +f 4564/1446/4564 4572/5411/4572 4571/2696/4571 4565/5406/4565 +f 4531/364/4531 4560/5404/4560 4575/2697/4575 4576/5413/4576 +f 4557/1445/4557 4577/5412/4577 4575/2697/4575 4560/5404/4560 +f 4566/721/4566 4574/5410/4574 4575/2697/4575 4577/5412/4577 +f 4573/1447/4573 4576/5413/4576 4575/2697/4575 4574/5410/4574 +f 4553/371/4553 4578/5414/4578 4579/2698/4579 4554/5401/4554 +f 4568/1448/4568 4567/5407/4567 4579/2698/4579 4578/5414/4578 +f 4566/721/4566 4577/5412/4577 4579/2698/4579 4567/5407/4567 +f 4557/1445/4557 4554/5401/4554 4579/2698/4579 4577/5412/4577 +f 4569/372/4569 4580/5415/4580 4581/2699/4581 4570/5409/4570 +f 4582/1449/4582 4583/5416/4583 4581/2699/4581 4580/5415/4580 +f 4584/722/4584 4585/5417/4585 4581/2699/4581 4583/5416/4583 +f 4573/1447/4573 4570/5409/4570 4581/2699/4581 4585/5417/4585 +f 4586/374/4586 4587/5418/4587 4588/2700/4588 4589/5420/4589 +f 4590/1450/4590 4591/5419/4591 4588/2700/4588 4587/5418/4587 +f 4584/722/4584 4583/5416/4583 4588/2700/4588 4591/5419/4591 +f 4582/1449/4582 4589/5420/4589 4588/2700/4588 4583/5416/4583 +f 4537/366/4537 4540/5394/4540 4592/2701/4592 4593/5422/4593 +f 4535/1441/4535 4594/5421/4594 4592/2701/4592 4540/5394/4540 +f 4584/722/4584 4591/5419/4591 4592/2701/4592 4594/5421/4594 +f 4590/1450/4590 4593/5422/4593 4592/2701/4592 4591/5419/4591 +f 4531/364/4531 4576/5413/4576 4595/2702/4595 4532/5390/4532 +f 4573/1447/4573 4585/5417/4585 4595/2702/4595 4576/5413/4576 +f 4584/722/4584 4594/5421/4594 4595/2702/4595 4585/5417/4585 +f 4535/1441/4535 4532/5390/4532 4595/2702/4595 4594/5421/4594 +f 4596/375/4596 4597/5423/4597 4598/2703/4598 4599/5426/4599 +f 4600/1451/4600 4601/5424/4601 4598/2703/4598 4597/5423/4597 +f 4602/723/4602 4603/5425/4603 4598/2703/4598 4601/5424/4601 +f 4604/1455/4604 4599/5426/4599 4598/2703/4598 4603/5425/4603 +f 4605/376/4605 4606/5427/4606 4607/2704/4607 4608/5429/4608 +f 4609/1452/4609 4610/5428/4610 4607/2704/4607 4606/5427/4606 +f 4602/723/4602 4601/5424/4601 4607/2704/4607 4610/5428/4610 +f 4600/1451/4600 4608/5429/4608 4607/2704/4607 4601/5424/4601 +f 4611/377/4611 4612/5430/4612 4613/2705/4613 4614/5433/4614 +f 4615/1453/4615 4616/5432/4616 4613/2705/4613 4612/5430/4612 +f 4602/723/4602 4610/5428/4610 4613/2705/4613 4616/5432/4616 +f 4609/1452/4609 4614/5433/4614 4613/2705/4613 4610/5428/4610 +f 4617/378/4617 4618/5434/4618 4619/2706/4619 4620/5435/4620 +f 4604/1455/4604 4603/5425/4603 4619/2706/4619 4618/5434/4618 +f 4602/723/4602 4616/5432/4616 4619/2706/4619 4603/5425/4603 +f 4615/1453/4615 4620/5435/4620 4619/2706/4619 4616/5432/4616 +f 4605/376/4605 4621/5437/4621 4622/2707/4622 4606/5427/4606 +f 4623/1456/4623 4624/5438/4624 4622/2707/4622 4621/5437/4621 +f 4625/724/4625 4626/5439/4626 4622/2707/4622 4624/5438/4624 +f 4609/1452/4609 4606/5427/4606 4622/2707/4622 4626/5439/4626 +f 4363/262/4363 4366/5304/4366 4627/2708/4627 4628/5441/4628 +f 4371/1417/4371 4629/5440/4629 4627/2708/4627 4366/5304/4366 +f 4625/724/4625 4624/5438/4624 4627/2708/4627 4629/5440/4629 +f 4623/1456/4623 4628/5441/4628 4627/2708/4627 4624/5438/4624 +f 4384/348/4384 4630/5442/4630 4631/2709/4631 4385/5311/4385 +f 4632/1457/4632 4633/5444/4633 4631/2709/4631 4630/5442/4630 +f 4625/724/4625 4629/5440/4629 4631/2709/4631 4633/5444/4633 +f 4371/1417/4371 4385/5311/4385 4631/2709/4631 4629/5440/4629 +f 4611/377/4611 4614/5433/4614 4634/2710/4634 4635/5445/4635 +f 4609/1452/4609 4626/5439/4626 4634/2710/4634 4614/5433/4614 +f 4625/724/4625 4633/5444/4633 4634/2710/4634 4626/5439/4626 +f 4632/1457/4632 4635/5445/4635 4634/2710/4634 4633/5444/4633 +f 4434/411/4434 4636/5447/4636 4637/2711/4637 4435/5340/4435 +f 4638/1459/4638 4639/5448/4639 4637/2711/4637 4636/5447/4636 +f 4640/725/4640 4641/5449/4641 4637/2711/4637 4639/5448/4639 +f 4438/1428/4438 4435/5340/4435 4637/2711/4637 4641/5449/4641 +f 4642/412/4642 4643/5450/4643 4644/2712/4644 4645/5452/4645 +f 4646/1460/4646 4647/5451/4647 4644/2712/4644 4643/5450/4643 +f 4640/725/4640 4639/5448/4639 4644/2712/4644 4647/5451/4647 +f 4638/1459/4638 4645/5452/4645 4644/2712/4644 4639/5448/4639 +f 4611/415/4611 4635/5446/4635 4648/2713/4648 4649/5454/4649 +f 4632/1458/4632 4650/5453/4650 4648/2713/4648 4635/5446/4635 +f 4640/725/4640 4647/5451/4647 4648/2713/4648 4650/5453/4650 +f 4646/1460/4646 4649/5454/4649 4648/2713/4648 4647/5451/4647 +f 4384/416/4384 4441/5346/4441 4651/2714/4651 4630/5443/4630 +f 4438/1428/4438 4641/5449/4641 4651/2714/4651 4441/5346/4441 +f 4640/725/4640 4650/5453/4650 4651/2714/4651 4641/5449/4641 +f 4632/1458/4632 4630/5443/4630 4651/2714/4651 4650/5453/4650 +f 4642/412/4642 4652/5455/4652 4653/2715/4653 4643/5450/4643 +f 4654/1461/4654 4655/5456/4655 4653/2715/4653 4652/5455/4652 +f 4656/726/4656 4657/5457/4657 4653/2715/4653 4655/5456/4655 +f 4646/1460/4646 4643/5450/4643 4653/2715/4653 4657/5457/4657 +f 4658/421/4658 4659/5458/4659 4660/2716/4660 4661/5460/4661 +f 4662/1462/4662 4663/5459/4663 4660/2716/4660 4659/5458/4659 +f 4656/726/4656 4655/5456/4655 4660/2716/4660 4663/5459/4663 +f 4654/1461/4654 4661/5460/4661 4660/2716/4660 4655/5456/4655 +f 4617/422/4617 4620/5436/4620 4664/2717/4664 4665/5462/4665 +f 4615/1454/4615 4666/5461/4666 4664/2717/4664 4620/5436/4620 +f 4656/726/4656 4663/5459/4663 4664/2717/4664 4666/5461/4666 +f 4662/1462/4662 4665/5462/4665 4664/2717/4664 4663/5459/4663 +f 4611/415/4611 4649/5454/4649 4667/2718/4667 4612/5431/4612 +f 4646/1460/4646 4657/5457/4657 4667/2718/4667 4649/5454/4649 +f 4656/726/4656 4666/5461/4666 4667/2718/4667 4657/5457/4657 +f 4615/1454/4615 4612/5431/4612 4667/2718/4667 4666/5461/4666 +f 4394/349/4394 4563/5408/4563 4668/2719/4668 4395/5316/4395 +f 4568/1448/4568 4669/5463/4669 4668/2719/4668 4563/5408/4563 +f 4670/727/4670 4671/5464/4671 4668/2719/4668 4669/5463/4669 +f 4398/1419/4398 4395/5316/4395 4668/2719/4668 4671/5464/4671 +f 4553/371/4553 4672/5465/4672 4673/2720/4673 4578/5414/4578 +f 4674/1463/4674 4675/5466/4675 4673/2720/4673 4672/5465/4672 +f 4670/727/4670 4669/5463/4669 4673/2720/4673 4675/5466/4675 +f 4568/1448/4568 4578/5414/4578 4673/2720/4673 4669/5463/4669 +f 4676/382/4676 4677/5467/4677 4678/2721/4678 4679/5469/4679 +f 4680/1464/4680 4681/5468/4681 4678/2721/4678 4677/5467/4677 +f 4670/727/4670 4675/5466/4675 4678/2721/4678 4681/5468/4681 +f 4674/1463/4674 4679/5469/4679 4678/2721/4678 4675/5466/4675 +f 4400/350/4400 4403/5321/4403 4682/2722/4682 4683/5470/4683 +f 4398/1419/4398 4671/5464/4671 4682/2722/4682 4403/5321/4403 +f 4670/727/4670 4681/5468/4681 4682/2722/4682 4671/5464/4671 +f 4680/1464/4680 4683/5470/4683 4682/2722/4682 4681/5468/4681 +f 4553/371/4553 4556/5403/4556 4684/2723/4684 4672/5465/4672 +f 4551/1444/4551 4685/5471/4685 4684/2723/4684 4556/5403/4556 +f 4686/728/4686 4687/5472/4687 4684/2723/4684 4685/5471/4685 +f 4674/1463/4674 4672/5465/4672 4684/2723/4684 4687/5472/4687 +f 4547/368/4547 4688/5473/4688 4689/2724/4689 4548/5398/4548 +f 4690/1465/4690 4691/5474/4691 4689/2724/4689 4688/5473/4688 +f 4686/728/4686 4685/5471/4685 4689/2724/4689 4691/5474/4691 +f 4551/1444/4551 4548/5398/4548 4689/2724/4689 4685/5471/4685 +f 4692/383/4692 4693/5475/4693 4694/2725/4694 4695/5477/4695 +f 4696/1466/4696 4697/5476/4697 4694/2725/4694 4693/5475/4693 +f 4686/728/4686 4691/5474/4691 4694/2725/4694 4697/5476/4697 +f 4690/1465/4690 4695/5477/4695 4694/2725/4694 4691/5474/4691 +f 4676/382/4676 4679/5469/4679 4698/2726/4698 4699/5478/4699 +f 4674/1463/4674 4687/5472/4687 4698/2726/4698 4679/5469/4679 +f 4686/728/4686 4697/5476/4697 4698/2726/4698 4687/5472/4687 +f 4696/1466/4696 4699/5478/4699 4698/2726/4698 4697/5476/4697 +f 4700/384/4700 4701/5479/4701 4702/2727/4702 4703/5483/4703 +f 4704/1467/4704 4705/5481/4705 4702/2727/4702 4701/5479/4701 +f 4706/729/4706 4707/5482/4707 4702/2727/4702 4705/5481/4705 +f 4708/1470/4708 4703/5483/4703 4702/2727/4702 4707/5482/4707 +f 4709/385/4709 4710/5484/4710 4711/2728/4711 4712/5486/4712 +f 4713/1469/4713 4714/5485/4714 4711/2728/4711 4710/5484/4710 +f 4706/729/4706 4705/5481/4705 4711/2728/4711 4714/5485/4714 +f 4704/1467/4704 4712/5486/4712 4711/2728/4711 4705/5481/4705 +f 4676/382/4676 4699/5478/4699 4715/2729/4715 4716/5489/4716 +f 4696/1466/4696 4717/5488/4717 4715/2729/4715 4699/5478/4699 +f 4706/729/4706 4714/5485/4714 4715/2729/4715 4717/5488/4717 +f 4713/1469/4713 4716/5489/4716 4715/2729/4715 4714/5485/4714 +f 4692/383/4692 4718/5490/4718 4719/2730/4719 4693/5475/4693 +f 4708/1470/4708 4707/5482/4707 4719/2730/4719 4718/5490/4718 +f 4706/729/4706 4717/5488/4717 4719/2730/4719 4707/5482/4707 +f 4696/1466/4696 4693/5475/4693 4719/2730/4719 4717/5488/4717 +f 4709/385/4709 4720/5491/4720 4721/2731/4721 4710/5484/4710 +f 4722/1471/4722 4723/5493/4723 4721/2731/4721 4720/5491/4720 +f 4724/730/4724 4725/5494/4725 4721/2731/4721 4723/5493/4723 +f 4713/1469/4713 4710/5484/4710 4721/2731/4721 4725/5494/4725 +f 4408/351/4408 4411/5327/4411 4726/2732/4726 4727/5496/4727 +f 4416/1424/4416 4728/5495/4728 4726/2732/4726 4411/5327/4411 +f 4724/730/4724 4723/5493/4723 4726/2732/4726 4728/5495/4728 +f 4722/1471/4722 4727/5496/4727 4726/2732/4726 4723/5493/4723 +f 4400/350/4400 4683/5470/4683 4729/2733/4729 4426/5334/4426 +f 4680/1464/4680 4730/5498/4730 4729/2733/4729 4683/5470/4683 +f 4724/730/4724 4728/5495/4728 4729/2733/4729 4730/5498/4730 +f 4416/1424/4416 4426/5334/4426 4729/2733/4729 4728/5495/4728 +f 4676/382/4676 4716/5489/4716 4731/2734/4731 4677/5467/4677 +f 4713/1469/4713 4725/5494/4725 4731/2734/4731 4716/5489/4716 +f 4724/730/4724 4730/5498/4730 4731/2734/4731 4725/5494/4725 +f 4680/1464/4680 4677/5467/4677 4731/2734/4731 4730/5498/4730 +f 4394/349/4394 4397/5318/4397 4732/2735/4732 4561/5405/4561 +f 4390/1418/4390 4733/5499/4733 4732/2735/4732 4397/5318/4397 +f 4734/731/4734 4735/5500/4735 4732/2735/4732 4733/5499/4733 +f 4564/1446/4564 4561/5405/4561 4732/2735/4732 4735/5500/4735 +f 4372/264/4372 4736/5501/4736 4737/2736/4737 4388/5313/4388 +f 4738/1473/4738 4739/5502/4739 4737/2736/4737 4736/5501/4736 +f 4734/731/4734 4733/5499/4733 4737/2736/4737 4739/5502/4739 +f 4390/1418/4390 4388/5313/4388 4737/2736/4737 4733/5499/4733 +f 4740/388/4740 4741/5503/4741 4742/2737/4742 4743/5505/4743 +f 4744/1474/4744 4745/5504/4745 4742/2737/4742 4741/5503/4741 +f 4734/731/4734 4739/5502/4739 4742/2737/4742 4745/5504/4745 +f 4738/1473/4738 4743/5505/4743 4742/2737/4742 4739/5502/4739 +f 4569/372/4569 4572/5411/4572 4746/2738/4746 4747/5506/4747 +f 4564/1446/4564 4735/5500/4735 4746/2738/4746 4572/5411/4572 +f 4734/731/4734 4745/5504/4745 4746/2738/4746 4735/5500/4735 +f 4744/1474/4744 4747/5506/4747 4746/2738/4746 4745/5504/4745 +f 4372/264/4372 4375/5307/4375 4748/2739/4748 4736/5501/4736 +f 4367/1414/4367 4749/5507/4749 4748/2739/4748 4375/5307/4375 +f 4750/732/4750 4751/5508/4751 4748/2739/4748 4749/5507/4749 +f 4738/1473/4738 4736/5501/4736 4748/2739/4748 4751/5508/4751 +f 4363/262/4363 4628/5441/4628 4752/2740/4752 4364/5301/4364 +f 4623/1456/4623 4753/5509/4753 4752/2740/4752 4628/5441/4628 +f 4750/732/4750 4749/5507/4749 4752/2740/4752 4753/5509/4753 +f 4367/1414/4367 4364/5301/4364 4752/2740/4752 4749/5507/4749 +f 4605/376/4605 4754/5510/4754 4755/2741/4755 4621/5437/4621 +f 4756/1475/4756 4757/5511/4757 4755/2741/4755 4754/5510/4754 +f 4750/732/4750 4753/5509/4753 4755/2741/4755 4757/5511/4757 +f 4623/1456/4623 4621/5437/4621 4755/2741/4755 4753/5509/4753 +f 4740/388/4740 4743/5505/4743 4758/2742/4758 4759/5512/4759 +f 4738/1473/4738 4751/5508/4751 4758/2742/4758 4743/5505/4743 +f 4750/732/4750 4757/5511/4757 4758/2742/4758 4751/5508/4751 +f 4756/1475/4756 4759/5512/4759 4758/2742/4758 4757/5511/4757 +f 4596/375/4596 4760/5513/4760 4761/2743/4761 4597/5423/4597 +f 4762/1476/4762 4763/5514/4763 4761/2743/4761 4760/5513/4760 +f 4764/733/4764 4765/5515/4765 4761/2743/4761 4763/5514/4763 +f 4600/1451/4600 4597/5423/4597 4761/2743/4761 4765/5515/4765 +f 4766/389/4766 4767/5516/4767 4768/2744/4768 4769/5518/4769 +f 4770/1477/4770 4771/5517/4771 4768/2744/4768 4767/5516/4767 +f 4764/733/4764 4763/5514/4763 4768/2744/4768 4771/5517/4771 +f 4762/1476/4762 4769/5518/4769 4768/2744/4768 4763/5514/4763 +f 4740/388/4740 4759/5512/4759 4772/2745/4772 4773/5520/4773 +f 4756/1475/4756 4774/5519/4774 4772/2745/4772 4759/5512/4759 +f 4764/733/4764 4771/5517/4771 4772/2745/4772 4774/5519/4774 +f 4770/1477/4770 4773/5520/4773 4772/2745/4772 4771/5517/4771 +f 4605/376/4605 4608/5429/4608 4775/2746/4775 4754/5510/4754 +f 4600/1451/4600 4765/5515/4765 4775/2746/4775 4608/5429/4608 +f 4764/733/4764 4774/5519/4774 4775/2746/4775 4765/5515/4765 +f 4756/1475/4756 4754/5510/4754 4775/2746/4775 4774/5519/4774 +f 4766/389/4766 4776/5521/4776 4777/2747/4777 4767/5516/4767 +f 4778/1478/4778 4779/5522/4779 4777/2747/4777 4776/5521/4776 +f 4780/734/4780 4781/5523/4781 4777/2747/4777 4779/5522/4779 +f 4770/1477/4770 4767/5516/4767 4777/2747/4777 4781/5523/4781 +f 4586/374/4586 4589/5420/4589 4782/2748/4782 4783/5525/4783 +f 4582/1449/4582 4784/5524/4784 4782/2748/4782 4589/5420/4589 +f 4780/734/4780 4779/5522/4779 4782/2748/4782 4784/5524/4784 +f 4778/1478/4778 4783/5525/4783 4782/2748/4782 4779/5522/4779 +f 4569/372/4569 4747/5506/4747 4785/2749/4785 4580/5415/4580 +f 4744/1474/4744 4786/5526/4786 4785/2749/4785 4747/5506/4747 +f 4780/734/4780 4784/5524/4784 4785/2749/4785 4786/5526/4786 +f 4582/1449/4582 4580/5415/4580 4785/2749/4785 4784/5524/4784 +f 4740/388/4740 4773/5520/4773 4787/2750/4787 4741/5503/4741 +f 4770/1477/4770 4781/5523/4781 4787/2750/4787 4773/5520/4773 +f 4780/734/4780 4786/5526/4786 4787/2750/4787 4781/5523/4781 +f 4744/1474/4744 4741/5503/4741 4787/2750/4787 4786/5526/4786 +f 1972/84/1972 4788/5527/4788 4789/2751/4789 1973/4035/1973 +f 4790/1479/4790 4791/5528/4791 4789/2751/4789 4788/5527/4788 +f 4792/735/4792 4793/5529/4793 4789/2751/4789 4791/5528/4791 +f 1976/1085/1976 1973/4035/1973 4789/2751/4789 4793/5529/4793 +f 4794/423/4794 4795/5530/4795 4796/2752/4796 4797/5532/4797 +f 4798/1480/4798 4799/5531/4799 4796/2752/4796 4795/5530/4795 +f 4792/735/4792 4791/5528/4791 4796/2752/4796 4799/5531/4799 +f 4790/1479/4790 4797/5532/4797 4796/2752/4796 4791/5528/4791 +f 4800/424/4800 4801/5533/4801 4802/2753/4802 4803/5535/4803 +f 4804/1481/4804 4805/5534/4805 4802/2753/4802 4801/5533/4801 +f 4792/735/4792 4799/5531/4799 4802/2753/4802 4805/5534/4805 +f 4798/1480/4798 4803/5535/4803 4802/2753/4802 4799/5531/4799 +f 1981/150/1981 1984/4041/1984 4806/2754/4806 4807/5536/4807 +f 1976/1085/1976 4793/5529/4793 4806/2754/4806 1984/4041/1984 +f 4792/735/4792 4805/5534/4805 4806/2754/4806 4793/5529/4793 +f 4804/1481/4804 4807/5536/4807 4806/2754/4806 4805/5534/4805 +f 4794/423/4794 4808/5537/4808 4809/2755/4809 4795/5530/4795 +f 4810/1482/4810 4811/5539/4811 4809/2755/4809 4808/5537/4808 +f 4812/736/4812 4813/5540/4813 4809/2755/4809 4811/5539/4811 +f 4798/1480/4798 4795/5530/4795 4809/2755/4809 4813/5540/4813 +f 4313/425/4313 4814/5541/4814 4815/2756/4815 4816/5544/4816 +f 4817/1484/4817 4818/5543/4818 4815/2756/4815 4814/5541/4814 +f 4812/736/4812 4811/5539/4811 4815/2756/4815 4818/5543/4818 +f 4810/1482/4810 4816/5544/4816 4815/2756/4815 4811/5539/4811 +f 4819/426/4819 4820/5546/4820 4821/2757/4821 4822/5548/4822 +f 4823/1486/4823 4824/5547/4824 4821/2757/4821 4820/5546/4820 +f 4812/736/4812 4818/5543/4818 4821/2757/4821 4824/5547/4824 +f 4817/1484/4817 4822/5548/4822 4821/2757/4821 4818/5543/4818 +f 4800/424/4800 4803/5535/4803 4825/2758/4825 4826/5550/4826 +f 4798/1480/4798 4813/5540/4813 4825/2758/4825 4803/5535/4803 +f 4812/736/4812 4824/5547/4824 4825/2758/4825 4813/5540/4813 +f 4823/1486/4823 4826/5550/4826 4825/2758/4825 4824/5547/4824 +f 4658/421/4658 4827/5551/4827 4828/2759/4828 4829/5554/4829 +f 4830/1487/4830 4831/5552/4831 4828/2759/4828 4827/5551/4827 +f 4832/737/4832 4833/5553/4833 4828/2759/4828 4831/5552/4831 +f 4834/1489/4834 4829/5554/4829 4828/2759/4828 4833/5553/4833 +f 4835/427/4835 4836/5555/4836 4837/2760/4837 4838/5557/4838 +f 4839/1488/4839 4840/5556/4840 4837/2760/4837 4836/5555/4836 +f 4832/737/4832 4831/5552/4831 4837/2760/4837 4840/5556/4840 +f 4830/1487/4830 4838/5557/4838 4837/2760/4837 4831/5552/4831 +f 4800/424/4800 4826/5550/4826 4841/2761/4841 4842/5559/4842 +f 4823/1486/4823 4843/5558/4843 4841/2761/4841 4826/5550/4826 +f 4832/737/4832 4840/5556/4840 4841/2761/4841 4843/5558/4843 +f 4839/1488/4839 4842/5559/4842 4841/2761/4841 4840/5556/4840 +f 4819/426/4819 4844/5560/4844 4845/2762/4845 4820/5546/4820 +f 4834/1489/4834 4833/5553/4833 4845/2762/4845 4844/5560/4844 +f 4832/737/4832 4843/5558/4843 4845/2762/4845 4833/5553/4833 +f 4823/1486/4823 4820/5546/4820 4845/2762/4845 4843/5558/4843 +f 4835/427/4835 4846/5561/4846 4847/2763/4847 4836/5555/4836 +f 4848/1490/4848 4849/5562/4849 4847/2763/4847 4846/5561/4846 +f 4850/738/4850 4851/5563/4851 4847/2763/4847 4849/5562/4849 +f 4839/1488/4839 4836/5555/4836 4847/2763/4847 4851/5563/4851 +f 2003/158/2003 2006/4052/2006 4852/2764/4852 4853/5565/4853 +f 1999/1089/1999 4854/5564/4854 4852/2764/4852 2006/4052/2006 +f 4850/738/4850 4849/5562/4849 4852/2764/4852 4854/5564/4854 +f 4848/1490/4848 4853/5565/4853 4852/2764/4852 4849/5562/4849 +f 1981/150/1981 4807/5536/4807 4855/2765/4855 1997/4047/1997 +f 4804/1481/4804 4856/5566/4856 4855/2765/4855 4807/5536/4807 +f 4850/738/4850 4854/5564/4854 4855/2765/4855 4856/5566/4856 +f 1999/1089/1999 1997/4047/1997 4855/2765/4855 4854/5564/4854 +f 4800/424/4800 4842/5559/4842 4857/2766/4857 4801/5533/4801 +f 4839/1488/4839 4851/5563/4851 4857/2766/4857 4842/5559/4842 +f 4850/738/4850 4856/5566/4856 4857/2766/4857 4851/5563/4851 +f 4804/1481/4804 4801/5533/4801 4857/2766/4857 4856/5566/4856 +f 4547/368/4547 4858/5567/4858 4859/2767/4859 4688/5473/4688 +f 4860/1491/4860 4861/5568/4861 4859/2767/4859 4858/5567/4858 +f 4862/739/4862 4863/5569/4863 4859/2767/4859 4861/5568/4861 +f 4690/1465/4690 4688/5473/4688 4859/2767/4859 4863/5569/4863 +f 4864/390/4864 4865/5570/4865 4866/2768/4866 4867/5572/4867 +f 4868/1492/4868 4869/5571/4869 4866/2768/4866 4865/5570/4865 +f 4862/739/4862 4861/5568/4861 4866/2768/4866 4869/5571/4869 +f 4860/1491/4860 4867/5572/4867 4866/2768/4866 4861/5568/4861 +f 4870/391/4870 4871/5573/4871 4872/2769/4872 4873/5575/4873 +f 4874/1493/4874 4875/5574/4875 4872/2769/4872 4871/5573/4871 +f 4862/739/4862 4869/5571/4869 4872/2769/4872 4875/5574/4875 +f 4868/1492/4868 4873/5575/4873 4872/2769/4872 4869/5571/4869 +f 4692/383/4692 4695/5477/4695 4876/2770/4876 4877/5576/4877 +f 4690/1465/4690 4863/5569/4863 4876/2770/4876 4695/5477/4695 +f 4862/739/4862 4875/5574/4875 4876/2770/4876 4863/5569/4863 +f 4874/1493/4874 4877/5576/4877 4876/2770/4876 4875/5574/4875 +f 4864/390/4864 4878/5577/4878 4879/2771/4879 4865/5570/4865 +f 4880/1494/4880 4881/5578/4881 4879/2771/4879 4878/5577/4878 +f 4882/740/4882 4883/5579/4883 4879/2771/4879 4881/5578/4881 +f 4868/1492/4868 4865/5570/4865 4879/2771/4879 4883/5579/4883 +f 3512/163/3512 3515/4858/3515 4884/2772/4884 4885/5581/4885 +f 3508/1304/3508 4886/5580/4886 4884/2772/4884 3515/4858/3515 +f 4882/740/4882 4881/5578/4881 4884/2772/4884 4886/5580/4886 +f 4880/1494/4880 4885/5581/4885 4884/2772/4884 4881/5578/4881 +f 3495/162/3495 4887/5582/4887 4888/2773/4888 3506/4853/3506 +f 4889/1495/4889 4890/5583/4890 4888/2773/4888 4887/5582/4887 +f 4882/740/4882 4886/5580/4886 4888/2773/4888 4890/5583/4890 +f 3508/1304/3508 3506/4853/3506 4888/2773/4888 4886/5580/4886 +f 4870/391/4870 4873/5575/4873 4891/2774/4891 4892/5584/4892 +f 4868/1492/4868 4883/5579/4883 4891/2774/4891 4873/5575/4873 +f 4882/740/4882 4890/5583/4890 4891/2774/4891 4883/5579/4883 +f 4889/1495/4889 4892/5584/4892 4891/2774/4891 4890/5583/4890 +f 3486/161/3486 4893/5585/4893 4894/2775/4894 3487/4841/3487 +f 4895/1496/4895 4896/5587/4896 4894/2775/4894 4893/5585/4893 +f 4897/741/4897 4898/5588/4898 4894/2775/4894 4896/5587/4896 +f 3490/1300/3490 3487/4841/3487 4894/2775/4894 4898/5588/4898 +f 4899/392/4899 4900/5589/4900 4901/2776/4901 4902/5591/4902 +f 4903/1498/4903 4904/5590/4904 4901/2776/4901 4900/5589/4900 +f 4897/741/4897 4896/5587/4896 4901/2776/4901 4904/5590/4904 +f 4895/1496/4895 4902/5591/4902 4901/2776/4901 4896/5587/4896 +f 4870/391/4870 4892/5584/4892 4905/2777/4905 4906/5594/4906 +f 4889/1495/4889 4907/5593/4907 4905/2777/4905 4892/5584/4892 +f 4897/741/4897 4904/5590/4904 4905/2777/4905 4907/5593/4907 +f 4903/1498/4903 4906/5594/4906 4905/2777/4905 4904/5590/4904 +f 3495/162/3495 3498/4848/3498 4908/2778/4908 4887/5582/4887 +f 3490/1300/3490 4898/5588/4898 4908/2778/4908 3498/4848/3498 +f 4897/741/4897 4907/5593/4907 4908/2778/4908 4898/5588/4898 +f 4889/1495/4889 4887/5582/4887 4908/2778/4908 4907/5593/4907 +f 4899/392/4899 4909/5595/4909 4910/2779/4910 4900/5589/4900 +f 4911/1499/4911 4912/5597/4912 4910/2779/4910 4909/5595/4909 +f 4913/742/4913 4914/5598/4914 4910/2779/4910 4912/5597/4912 +f 4903/1498/4903 4900/5589/4900 4910/2779/4910 4914/5598/4914 +f 4700/384/4700 4703/5483/4703 4915/2780/4915 4916/5600/4916 +f 4708/1470/4708 4917/5599/4917 4915/2780/4915 4703/5483/4703 +f 4913/742/4913 4912/5597/4912 4915/2780/4915 4917/5599/4917 +f 4911/1499/4911 4916/5600/4916 4915/2780/4915 4912/5597/4912 +f 4692/383/4692 4877/5576/4877 4918/2781/4918 4718/5490/4718 +f 4874/1493/4874 4919/5602/4919 4918/2781/4918 4877/5576/4877 +f 4913/742/4913 4917/5599/4917 4918/2781/4918 4919/5602/4919 +f 4708/1470/4708 4718/5490/4718 4918/2781/4918 4917/5599/4917 +f 4870/391/4870 4906/5594/4906 4920/2782/4920 4871/5573/4871 +f 4903/1498/4903 4914/5598/4914 4920/2782/4920 4906/5594/4906 +f 4913/742/4913 4919/5602/4919 4920/2782/4920 4914/5598/4914 +f 4874/1493/4874 4871/5573/4871 4920/2782/4920 4919/5602/4919 +f 4353/257/4353 4921/5603/4921 4922/2783/4922 4444/5347/4444 +f 4923/1501/4923 4924/5604/4924 4922/2783/4922 4921/5603/4921 +f 4925/743/4925 4926/5605/4926 4922/2783/4922 4924/5604/4924 +f 4446/1429/4446 4444/5347/4444 4922/2783/4922 4926/5605/4926 +f 4927/393/4927 4928/5606/4928 4929/2784/4929 4930/5608/4930 +f 4931/1502/4931 4932/5607/4932 4929/2784/4929 4928/5606/4928 +f 4925/743/4925 4924/5604/4924 4929/2784/4929 4932/5607/4932 +f 4923/1501/4923 4930/5608/4930 4929/2784/4929 4924/5604/4924 +f 4933/394/4933 4934/5609/4934 4935/2785/4935 4936/5611/4936 +f 4937/1503/4937 4938/5610/4938 4935/2785/4935 4934/5609/4934 +f 4925/743/4925 4932/5607/4932 4935/2785/4935 4938/5610/4938 +f 4931/1502/4931 4936/5611/4936 4935/2785/4935 4932/5607/4932 +f 4450/355/4450 4453/5352/4453 4939/2786/4939 4940/5612/4940 +f 4446/1429/4446 4926/5605/4926 4939/2786/4939 4453/5352/4453 +f 4925/743/4925 4938/5610/4938 4939/2786/4939 4926/5605/4926 +f 4937/1503/4937 4940/5612/4940 4939/2786/4939 4938/5610/4938 +f 4927/393/4927 4941/5613/4941 4942/2787/4942 4928/5606/4928 +f 4943/1504/4943 4944/5614/4944 4942/2787/4942 4941/5613/4941 +f 4945/744/4945 4946/5615/4946 4942/2787/4942 4944/5614/4944 +f 4931/1502/4931 4928/5606/4928 4942/2787/4942 4946/5615/4946 +f 3584/222/3584 3587/4894/3587 4947/2788/4947 4948/5617/4948 +f 3580/1314/3580 4949/5616/4949 4947/2788/4947 3587/4894/3587 +f 4945/744/4945 4944/5614/4944 4947/2788/4947 4949/5616/4949 +f 4943/1504/4943 4948/5617/4948 4947/2788/4947 4944/5614/4944 +f 3567/221/3567 4950/5618/4950 4951/2789/4951 3578/4889/3578 +f 4952/1505/4952 4953/5619/4953 4951/2789/4951 4950/5618/4950 +f 4945/744/4945 4949/5616/4949 4951/2789/4951 4953/5619/4953 +f 3580/1314/3580 3578/4889/3578 4951/2789/4951 4949/5616/4949 +f 4933/394/4933 4936/5611/4936 4954/2790/4954 4955/5620/4955 +f 4931/1502/4931 4946/5615/4946 4954/2790/4954 4936/5611/4936 +f 4945/744/4945 4953/5619/4953 4954/2790/4954 4946/5615/4946 +f 4952/1505/4952 4955/5620/4955 4954/2790/4954 4953/5619/4953 +f 3558/176/3558 4956/5621/4956 4957/2791/4957 3559/4879/3559 +f 4958/1506/4958 4959/5622/4959 4957/2791/4957 4956/5621/4956 +f 4960/745/4960 4961/5623/4961 4957/2791/4957 4959/5622/4959 +f 3562/1311/3562 3559/4879/3559 4957/2791/4957 4961/5623/4961 +f 4962/395/4962 4963/5624/4963 4964/2792/4964 4965/5626/4965 +f 4966/1507/4966 4967/5625/4967 4964/2792/4964 4963/5624/4963 +f 4960/745/4960 4959/5622/4959 4964/2792/4964 4967/5625/4967 +f 4958/1506/4958 4965/5626/4965 4964/2792/4964 4959/5622/4959 +f 4933/394/4933 4955/5620/4955 4968/2793/4968 4969/5628/4969 +f 4952/1505/4952 4970/5627/4970 4968/2793/4968 4955/5620/4955 +f 4960/745/4960 4967/5625/4967 4968/2793/4968 4970/5627/4970 +f 4966/1507/4966 4969/5628/4969 4968/2793/4968 4967/5625/4967 +f 3567/221/3567 3570/4885/3570 4971/2794/4971 4950/5618/4950 +f 3562/1311/3562 4961/5623/4961 4971/2794/4971 3570/4885/3570 +f 4960/745/4960 4970/5627/4970 4971/2794/4971 4961/5623/4961 +f 4952/1505/4952 4950/5618/4950 4971/2794/4971 4970/5627/4970 +f 4962/395/4962 4972/5629/4972 4973/2795/4973 4963/5624/4963 +f 4974/1508/4974 4975/5630/4975 4973/2795/4973 4972/5629/4972 +f 4976/746/4976 4977/5631/4977 4973/2795/4973 4975/5630/4975 +f 4966/1507/4966 4963/5624/4963 4973/2795/4973 4977/5631/4977 +f 4470/357/4470 4473/5362/4473 4978/2796/4978 4979/5633/4979 +f 4466/1432/4466 4980/5632/4980 4978/2796/4978 4473/5362/4473 +f 4976/746/4976 4975/5630/4975 4978/2796/4978 4980/5632/4980 +f 4974/1508/4974 4979/5633/4979 4978/2796/4978 4975/5630/4975 +f 4450/355/4450 4940/5612/4940 4981/2797/4981 4464/5357/4464 +f 4937/1503/4937 4982/5634/4982 4981/2797/4981 4940/5612/4940 +f 4976/746/4976 4980/5632/4980 4981/2797/4981 4982/5634/4982 +f 4466/1432/4466 4464/5357/4464 4981/2797/4981 4980/5632/4980 +f 4933/394/4933 4969/5628/4969 4983/2798/4983 4934/5609/4934 +f 4966/1507/4966 4977/5631/4977 4983/2798/4983 4969/5628/4969 +f 4976/746/4976 4982/5634/4982 4983/2798/4983 4977/5631/4977 +f 4937/1503/4937 4934/5609/4934 4983/2798/4983 4982/5634/4982 +f 4516/361/4516 4984/5635/4984 4985/2799/4985 4517/5383/4517 +f 4986/1509/4986 4987/5636/4987 4985/2799/4985 4984/5635/4984 +f 4988/747/4988 4989/5637/4989 4985/2799/4985 4987/5636/4987 +f 4520/1439/4520 4517/5383/4517 4985/2799/4985 4989/5637/4989 +f 4990/396/4990 4991/5638/4991 4992/2800/4992 4993/5640/4993 +f 4994/1510/4994 4995/5639/4995 4992/2800/4992 4991/5638/4991 +f 4988/747/4988 4987/5636/4987 4992/2800/4992 4995/5639/4995 +f 4986/1509/4986 4993/5640/4993 4992/2800/4992 4987/5636/4987 +f 4996/397/4996 4997/5641/4997 4998/2801/4998 4999/5643/4999 +f 5000/1511/5000 5001/5642/5001 4998/2801/4998 4997/5641/4997 +f 4988/747/4988 4995/5639/4995 4998/2801/4998 5001/5642/5001 +f 4994/1510/4994 4999/5643/4999 4998/2801/4998 4995/5639/4995 +f 4525/363/4525 4528/5389/4528 5002/2802/5002 5003/5644/5003 +f 4520/1439/4520 4989/5637/4989 5002/2802/5002 4528/5389/4528 +f 4988/747/4988 5001/5642/5001 5002/2802/5002 4989/5637/4989 +f 5000/1511/5000 5003/5644/5003 5002/2802/5002 5001/5642/5001 +f 4990/396/4990 5004/5645/5004 5005/2803/5005 4991/5638/4991 +f 5006/1512/5006 5007/5646/5007 5005/2803/5005 5004/5645/5004 +f 5008/748/5008 5009/5647/5009 5005/2803/5005 5007/5646/5007 +f 4994/1510/4994 4991/5638/4991 5005/2803/5005 5009/5647/5009 +f 3648/226/3648 3651/4926/3651 5010/2804/5010 5011/5649/5011 +f 3644/1322/3644 5012/5648/5012 5010/2804/5010 3651/4926/3651 +f 5008/748/5008 5007/5646/5007 5010/2804/5010 5012/5648/5012 +f 5006/1512/5006 5011/5649/5011 5010/2804/5010 5007/5646/5007 +f 3632/225/3632 5013/5650/5013 5014/2805/5014 3642/4921/3642 +f 5015/1513/5015 5016/5651/5016 5014/2805/5014 5013/5650/5013 +f 5008/748/5008 5012/5648/5012 5014/2805/5014 5016/5651/5016 +f 3644/1322/3644 3642/4921/3642 5014/2805/5014 5012/5648/5012 +f 4996/397/4996 4999/5643/4999 5017/2806/5017 5018/5652/5018 +f 4994/1510/4994 5009/5647/5009 5017/2806/5017 4999/5643/4999 +f 5008/748/5008 5016/5651/5016 5017/2806/5017 5009/5647/5009 +f 5015/1513/5015 5018/5652/5018 5017/2806/5017 5016/5651/5016 +f 3512/163/3512 4885/5581/4885 5019/2807/5019 3626/4913/3626 +f 4880/1494/4880 5020/5653/5020 5019/2807/5019 4885/5581/4885 +f 5021/749/5021 5022/5654/5022 5019/2807/5019 5020/5653/5020 +f 3628/1320/3628 3626/4913/3626 5019/2807/5019 5022/5654/5022 +f 4864/390/4864 5023/5655/5023 5024/2808/5024 4878/5577/4878 +f 5025/1514/5025 5026/5656/5026 5024/2808/5024 5023/5655/5023 +f 5021/749/5021 5020/5653/5020 5024/2808/5024 5026/5656/5026 +f 4880/1494/4880 4878/5577/4878 5024/2808/5024 5020/5653/5020 +f 4996/397/4996 5018/5652/5018 5027/2809/5027 5028/5658/5028 +f 5015/1513/5015 5029/5657/5029 5027/2809/5027 5018/5652/5018 +f 5021/749/5021 5026/5656/5026 5027/2809/5027 5029/5657/5029 +f 5025/1514/5025 5028/5658/5028 5027/2809/5027 5026/5656/5026 +f 3632/225/3632 3635/4918/3635 5030/2810/5030 5013/5650/5013 +f 3628/1320/3628 5022/5654/5022 5030/2810/5030 3635/4918/3635 +f 5021/749/5021 5029/5657/5029 5030/2810/5030 5022/5654/5022 +f 5015/1513/5015 5013/5650/5013 5030/2810/5030 5029/5657/5029 +f 4864/390/4864 4867/5572/4867 5031/2811/5031 5023/5655/5023 +f 4860/1491/4860 5032/5659/5032 5031/2811/5031 4867/5572/4867 +f 5033/750/5033 5034/5660/5034 5031/2811/5031 5032/5659/5032 +f 5025/1514/5025 5023/5655/5023 5031/2811/5031 5034/5660/5034 +f 4547/368/4547 4550/5400/4550 5035/2812/5035 4858/5567/4858 +f 4543/1443/4543 5036/5661/5036 5035/2812/5035 4550/5400/4550 +f 5033/750/5033 5032/5659/5032 5035/2812/5035 5036/5661/5036 +f 4860/1491/4860 4858/5567/4858 5035/2812/5035 5032/5659/5032 +f 4525/363/4525 5003/5644/5003 5037/2813/5037 4541/5395/4541 +f 5000/1511/5000 5038/5662/5038 5037/2813/5037 5003/5644/5003 +f 5033/750/5033 5036/5661/5036 5037/2813/5037 5038/5662/5038 +f 4543/1443/4543 4541/5395/4541 5037/2813/5037 5036/5661/5036 +f 4996/397/4996 5028/5658/5028 5039/2814/5039 4997/5641/4997 +f 5025/1514/5025 5034/5660/5034 5039/2814/5039 5028/5658/5028 +f 5033/750/5033 5038/5662/5038 5039/2814/5039 5034/5660/5034 +f 5000/1511/5000 4997/5641/4997 5039/2814/5039 5038/5662/5038 +f 2233/124/2233 2236/4178/2236 5040/2815/5040 5041/5665/5041 +f 2241/1126/2241 5042/5663/5042 5040/2815/5040 2236/4178/2236 +f 5043/751/5043 5044/5664/5044 5040/2815/5040 5042/5663/5042 +f 5045/1517/5045 5041/5665/5041 5040/2815/5040 5044/5664/5044 +f 2254/166/2254 5046/5666/5046 5047/2816/5047 2255/4185/2255 +f 5048/1515/5048 5049/5667/5049 5047/2816/5047 5046/5666/5046 +f 5043/751/5043 5042/5663/5042 5047/2816/5047 5049/5667/5049 +f 2241/1126/2241 2255/4185/2255 5047/2816/5047 5042/5663/5042 +f 5050/335/5050 5051/5668/5051 5052/2817/5052 5053/5670/5053 +f 5054/1516/5054 5055/5669/5055 5052/2817/5052 5051/5668/5051 +f 5043/751/5043 5049/5667/5049 5052/2817/5052 5055/5669/5055 +f 5048/1515/5048 5053/5670/5053 5052/2817/5052 5049/5667/5049 +f 5056/336/5056 5057/5671/5057 5058/2818/5058 5059/5672/5059 +f 5045/1517/5045 5044/5664/5044 5058/2818/5058 5057/5671/5057 +f 5043/751/5043 5055/5669/5055 5058/2818/5058 5044/5664/5044 +f 5054/1516/5054 5059/5672/5059 5058/2818/5058 5055/5669/5055 +f 2254/166/2254 2301/4214/2301 5060/2819/5060 5046/5666/5046 +f 2298/1134/2298 5061/5673/5061 5060/2819/5060 2301/4214/2301 +f 5062/752/5062 5063/5674/5063 5060/2819/5060 5061/5673/5061 +f 5048/1515/5048 5046/5666/5046 5060/2819/5060 5063/5674/5063 +f 825/44/825 3724/4967/3724 5064/2820/5064 2296/4211/2296 +f 3719/1335/3719 5065/5675/5065 5064/2820/5064 3724/4967/3724 +f 5062/752/5062 5061/5673/5061 5064/2820/5064 5065/5675/5065 +f 2298/1134/2298 2296/4211/2296 5064/2820/5064 5061/5673/5061 +f 3706/291/3706 5066/5676/5066 5067/2821/5067 3717/4963/3717 +f 5068/1518/5068 5069/5677/5069 5067/2821/5067 5066/5676/5066 +f 5062/752/5062 5065/5675/5065 5067/2821/5067 5069/5677/5069 +f 3719/1335/3719 3717/4963/3717 5067/2821/5067 5065/5675/5065 +f 5050/335/5050 5053/5670/5053 5070/2822/5070 5071/5678/5071 +f 5048/1515/5048 5063/5674/5063 5070/2822/5070 5053/5670/5053 +f 5062/752/5062 5069/5677/5069 5070/2822/5070 5063/5674/5063 +f 5068/1518/5068 5071/5678/5071 5070/2822/5070 5069/5677/5069 +f 3697/285/3697 5072/5679/5072 5073/2823/5073 3698/4951/3698 +f 5074/1519/5074 5075/5681/5075 5073/2823/5073 5072/5679/5072 +f 5076/753/5076 5077/5682/5077 5073/2823/5073 5075/5681/5075 +f 3701/1331/3701 3698/4951/3698 5073/2823/5073 5077/5682/5077 +f 5078/347/5078 5079/5683/5079 5080/2824/5080 5081/5685/5081 +f 5082/1521/5082 5083/5684/5083 5080/2824/5080 5079/5683/5079 +f 5076/753/5076 5075/5681/5075 5080/2824/5080 5083/5684/5083 +f 5074/1519/5074 5081/5685/5081 5080/2824/5080 5075/5681/5075 +f 5050/335/5050 5071/5678/5071 5084/2825/5084 5085/5688/5085 +f 5068/1518/5068 5086/5687/5086 5084/2825/5084 5071/5678/5071 +f 5076/753/5076 5083/5684/5083 5084/2825/5084 5086/5687/5086 +f 5082/1521/5082 5085/5688/5085 5084/2825/5084 5083/5684/5083 +f 3706/291/3706 3709/4958/3709 5087/2826/5087 5066/5676/5066 +f 3701/1331/3701 5077/5682/5077 5087/2826/5087 3709/4958/3709 +f 5076/753/5076 5086/5687/5086 5087/2826/5087 5077/5682/5077 +f 5068/1518/5068 5066/5676/5066 5087/2826/5087 5086/5687/5086 +f 5078/347/5078 5088/5689/5088 5089/2827/5089 5079/5683/5079 +f 5090/1522/5090 5091/5691/5091 5089/2827/5089 5088/5689/5088 +f 5092/754/5092 5093/5692/5093 5089/2827/5089 5091/5691/5091 +f 5082/1521/5082 5079/5683/5079 5089/2827/5089 5093/5692/5093 +f 4327/367/4327 5094/5693/5094 5095/2828/5095 5096/5695/5096 +f 5097/1524/5097 5098/5694/5098 5095/2828/5095 5094/5693/5094 +f 5092/754/5092 5091/5691/5091 5095/2828/5095 5098/5694/5098 +f 5090/1522/5090 5096/5695/5096 5095/2828/5095 5091/5691/5091 +f 5056/336/5056 5059/5672/5059 5099/2829/5099 5100/5698/5100 +f 5054/1516/5054 5101/5697/5101 5099/2829/5099 5059/5672/5059 +f 5092/754/5092 5098/5694/5098 5099/2829/5099 5101/5697/5101 +f 5097/1524/5097 5100/5698/5100 5099/2829/5099 5098/5694/5098 +f 5050/335/5050 5085/5688/5085 5102/2830/5102 5051/5668/5051 +f 5082/1521/5082 5093/5692/5093 5102/2830/5102 5085/5688/5085 +f 5092/754/5092 5101/5697/5101 5102/2830/5102 5093/5692/5093 +f 5054/1516/5054 5051/5668/5051 5102/2830/5102 5101/5697/5101 +f 3558/176/3558 3730/4971/3730 5103/2831/5103 4956/5621/4956 +f 3734/1338/3734 5104/5699/5104 5103/2831/5103 3730/4971/3730 +f 5105/755/5105 5106/5700/5106 5103/2831/5103 5104/5699/5104 +f 4958/1506/4958 4956/5621/4956 5103/2831/5103 5106/5700/5106 +f 3745/229/3745 5107/5701/5107 5108/2832/5108 3746/4977/3746 +f 5109/1525/5109 5110/5702/5110 5108/2832/5108 5107/5701/5107 +f 5105/755/5105 5104/5699/5104 5108/2832/5108 5110/5702/5110 +f 3734/1338/3734 3746/4977/3746 5108/2832/5108 5104/5699/5104 +f 5111/398/5111 5112/5703/5112 5113/2833/5113 5114/5705/5114 +f 5115/1526/5115 5116/5704/5116 5113/2833/5113 5112/5703/5112 +f 5105/755/5105 5110/5702/5110 5113/2833/5113 5116/5704/5116 +f 5109/1525/5109 5114/5705/5114 5113/2833/5113 5110/5702/5110 +f 4962/395/4962 4965/5626/4965 5117/2834/5117 5118/5706/5118 +f 4958/1506/4958 5106/5700/5106 5117/2834/5117 4965/5626/4965 +f 5105/755/5105 5116/5704/5116 5117/2834/5117 5106/5700/5106 +f 5115/1526/5115 5118/5706/5118 5117/2834/5117 5116/5704/5116 +f 3745/229/3745 3789/5000/3789 5119/2835/5119 5107/5701/5107 +f 3786/1343/3786 5120/5707/5120 5119/2835/5119 3789/5000/3789 +f 5121/756/5121 5122/5708/5122 5119/2835/5119 5120/5707/5120 +f 5109/1525/5109 5107/5701/5107 5119/2835/5119 5122/5708/5122 +f 3648/226/3648 5011/5649/5011 5123/2836/5123 3784/4997/3784 +f 5006/1512/5006 5124/5709/5124 5123/2836/5123 5011/5649/5011 +f 5121/756/5121 5120/5707/5120 5123/2836/5123 5124/5709/5124 +f 3786/1343/3786 3784/4997/3784 5123/2836/5123 5120/5707/5120 +f 4990/396/4990 5125/5710/5125 5126/2837/5126 5004/5645/5004 +f 5127/1527/5127 5128/5711/5128 5126/2837/5126 5125/5710/5125 +f 5121/756/5121 5124/5709/5124 5126/2837/5126 5128/5711/5128 +f 5006/1512/5006 5004/5645/5004 5126/2837/5126 5124/5709/5124 +f 5111/398/5111 5114/5705/5114 5129/2838/5129 5130/5712/5130 +f 5109/1525/5109 5122/5708/5122 5129/2838/5129 5114/5705/5114 +f 5121/756/5121 5128/5711/5128 5129/2838/5129 5122/5708/5122 +f 5127/1527/5127 5130/5712/5130 5129/2838/5129 5128/5711/5128 +f 4516/361/4516 5131/5713/5131 5132/2839/5132 4984/5635/4984 +f 5133/1528/5133 5134/5714/5134 5132/2839/5132 5131/5713/5131 +f 5135/757/5135 5136/5715/5136 5132/2839/5132 5134/5714/5134 +f 4986/1509/4986 4984/5635/4984 5132/2839/5132 5136/5715/5136 +f 5137/399/5137 5138/5716/5138 5139/2840/5139 5140/5718/5140 +f 5141/1529/5141 5142/5717/5142 5139/2840/5139 5138/5716/5138 +f 5135/757/5135 5134/5714/5134 5139/2840/5139 5142/5717/5142 +f 5133/1528/5133 5140/5718/5140 5139/2840/5139 5134/5714/5134 +f 5111/398/5111 5130/5712/5130 5143/2841/5143 5144/5720/5144 +f 5127/1527/5127 5145/5719/5145 5143/2841/5143 5130/5712/5130 +f 5135/757/5135 5142/5717/5142 5143/2841/5143 5145/5719/5145 +f 5141/1529/5141 5144/5720/5144 5143/2841/5143 5142/5717/5142 +f 4990/396/4990 4993/5640/4993 5146/2842/5146 5125/5710/5125 +f 4986/1509/4986 5136/5715/5136 5146/2842/5146 4993/5640/4993 +f 5135/757/5135 5145/5719/5145 5146/2842/5146 5136/5715/5136 +f 5127/1527/5127 5125/5710/5125 5146/2842/5146 5145/5719/5145 +f 5137/399/5137 5147/5721/5147 5148/2843/5148 5138/5716/5138 +f 5149/1530/5149 5150/5722/5150 5148/2843/5148 5147/5721/5147 +f 5151/758/5151 5152/5723/5152 5148/2843/5148 5150/5722/5150 +f 5141/1529/5141 5138/5716/5138 5148/2843/5148 5152/5723/5152 +f 4470/357/4470 4979/5633/4979 5153/2844/5153 5154/5725/5154 +f 4974/1508/4974 5155/5724/5155 5153/2844/5153 4979/5633/4979 +f 5151/758/5151 5150/5722/5150 5153/2844/5153 5155/5724/5155 +f 5149/1530/5149 5154/5725/5154 5153/2844/5153 5150/5722/5150 +f 4962/395/4962 5118/5706/5118 5156/2845/5156 4972/5629/4972 +f 5115/1526/5115 5157/5726/5157 5156/2845/5156 5118/5706/5118 +f 5151/758/5151 5155/5724/5155 5156/2845/5156 5157/5726/5157 +f 4974/1508/4974 4972/5629/4972 5156/2845/5156 5155/5724/5155 +f 5111/398/5111 5144/5720/5144 5158/2846/5158 5112/5703/5112 +f 5141/1529/5141 5152/5723/5152 5158/2846/5158 5144/5720/5144 +f 5151/758/5151 5157/5726/5157 5158/2846/5158 5152/5723/5152 +f 5115/1526/5115 5112/5703/5112 5158/2846/5158 5157/5726/5157 +f 4470/357/4470 5154/5725/5154 5159/2847/5159 4471/5360/4471 +f 5149/1530/5149 5160/5727/5160 5159/2847/5159 5154/5725/5154 +f 5161/759/5161 5162/5728/5162 5159/2847/5159 5160/5727/5160 +f 4474/1433/4474 4471/5360/4471 5159/2847/5159 5162/5728/5162 +f 5137/399/5137 5163/5729/5163 5164/2848/5164 5147/5721/5147 +f 5165/1531/5165 5166/5730/5166 5164/2848/5164 5163/5729/5163 +f 5161/759/5161 5160/5727/5160 5164/2848/5164 5166/5730/5166 +f 5149/1530/5149 5147/5721/5147 5164/2848/5164 5160/5727/5160 +f 5167/400/5167 5168/5731/5168 5169/2849/5169 5170/5733/5170 +f 5171/1532/5171 5172/5732/5172 5169/2849/5169 5168/5731/5168 +f 5161/759/5161 5166/5730/5166 5169/2849/5169 5172/5732/5172 +f 5165/1531/5165 5170/5733/5170 5169/2849/5169 5166/5730/5166 +f 4476/358/4476 4479/5365/4479 5173/2850/5173 5174/5734/5174 +f 4474/1433/4474 5162/5728/5162 5173/2850/5173 4479/5365/4479 +f 5161/759/5161 5172/5732/5172 5173/2850/5173 5162/5728/5162 +f 5171/1532/5171 5174/5734/5174 5173/2850/5173 5172/5732/5172 +f 5137/399/5137 5140/5718/5140 5175/2851/5175 5163/5729/5163 +f 5133/1528/5133 5176/5735/5176 5175/2851/5175 5140/5718/5140 +f 5177/760/5177 5178/5736/5178 5175/2851/5175 5176/5735/5176 +f 5165/1531/5165 5163/5729/5163 5175/2851/5175 5178/5736/5178 +f 4516/361/4516 4519/5386/4519 5179/2852/5179 5131/5713/5131 +f 4524/1442/4524 5180/5737/5180 5179/2852/5179 4519/5386/4519 +f 5177/760/5177 5176/5735/5176 5179/2852/5179 5180/5737/5180 +f 5133/1528/5133 5131/5713/5131 5179/2852/5179 5176/5735/5176 +f 4537/366/4537 5181/5738/5181 5182/2853/5182 4538/5393/4538 +f 5183/1533/5183 5184/5739/5184 5182/2853/5182 5181/5738/5181 +f 5177/760/5177 5180/5737/5180 5182/2853/5182 5184/5739/5184 +f 4524/1442/4524 4538/5393/4538 5182/2853/5182 5180/5737/5180 +f 5167/400/5167 5170/5733/5170 5185/2854/5185 5186/5740/5186 +f 5165/1531/5165 5178/5736/5178 5185/2854/5185 5170/5733/5170 +f 5177/760/5177 5184/5739/5184 5185/2854/5185 5178/5736/5178 +f 5183/1533/5183 5186/5740/5186 5185/2854/5185 5184/5739/5184 +f 4586/374/4586 5187/5741/5187 5188/2855/5188 4587/5418/4587 +f 5189/1534/5189 5190/5742/5190 5188/2855/5188 5187/5741/5187 +f 5191/761/5191 5192/5743/5192 5188/2855/5188 5190/5742/5190 +f 4590/1450/4590 4587/5418/4587 5188/2855/5188 5192/5743/5192 +f 5193/401/5193 5194/5744/5194 5195/2856/5195 5196/5746/5196 +f 5197/1535/5197 5198/5745/5198 5195/2856/5195 5194/5744/5194 +f 5191/761/5191 5190/5742/5190 5195/2856/5195 5198/5745/5198 +f 5189/1534/5189 5196/5746/5196 5195/2856/5195 5190/5742/5190 +f 5167/400/5167 5186/5740/5186 5199/2857/5199 5200/5748/5200 +f 5183/1533/5183 5201/5747/5201 5199/2857/5199 5186/5740/5186 +f 5191/761/5191 5198/5745/5198 5199/2857/5199 5201/5747/5201 +f 5197/1535/5197 5200/5748/5200 5199/2857/5199 5198/5745/5198 +f 4537/366/4537 4593/5422/4593 5202/2858/5202 5181/5738/5181 +f 4590/1450/4590 5192/5743/5192 5202/2858/5202 4593/5422/4593 +f 5191/761/5191 5201/5747/5201 5202/2858/5202 5192/5743/5192 +f 5183/1533/5183 5181/5738/5181 5202/2858/5202 5201/5747/5201 +f 5193/401/5193 5203/5749/5203 5204/2859/5204 5194/5744/5194 +f 5205/1536/5205 5206/5750/5206 5204/2859/5204 5203/5749/5203 +f 5207/762/5207 5208/5751/5208 5204/2859/5204 5206/5750/5206 +f 5197/1535/5197 5194/5744/5194 5204/2859/5204 5208/5751/5208 +f 4484/359/4484 4487/5370/4487 5209/2860/5209 5210/5753/5210 +f 4492/1437/4492 5211/5752/5211 5209/2860/5209 4487/5370/4487 +f 5207/762/5207 5206/5750/5206 5209/2860/5209 5211/5752/5211 +f 5205/1536/5205 5210/5753/5210 5209/2860/5209 5206/5750/5206 +f 4476/358/4476 5174/5734/5174 5212/2861/5212 4502/5376/4502 +f 5171/1532/5171 5213/5754/5213 5212/2861/5212 5174/5734/5174 +f 5207/762/5207 5211/5752/5211 5212/2861/5212 5213/5754/5213 +f 4492/1437/4492 4502/5376/4502 5212/2861/5212 5211/5752/5211 +f 5167/400/5167 5200/5748/5200 5214/2862/5214 5168/5731/5168 +f 5197/1535/5197 5208/5751/5208 5214/2862/5214 5200/5748/5200 +f 5207/762/5207 5213/5754/5213 5214/2862/5214 5208/5751/5208 +f 5171/1532/5171 5168/5731/5168 5214/2862/5214 5213/5754/5213 +f 4484/359/4484 5210/5753/5210 5215/2863/5215 4485/5367/4485 +f 5205/1536/5205 5216/5755/5216 5215/2863/5215 5210/5753/5210 +f 5217/763/5217 5218/5756/5218 5215/2863/5215 5216/5755/5216 +f 4488/1435/4488 4485/5367/4485 5215/2863/5215 5218/5756/5218 +f 5193/401/5193 5219/5757/5219 5220/2864/5220 5203/5749/5203 +f 5221/1537/5221 5222/5758/5222 5220/2864/5220 5219/5757/5219 +f 5217/763/5217 5216/5755/5216 5220/2864/5220 5222/5758/5222 +f 5205/1536/5205 5203/5749/5203 5220/2864/5220 5216/5755/5216 +f 5223/402/5223 5224/5759/5224 5225/2865/5225 5226/5761/5226 +f 5227/1538/5227 5228/5760/5228 5225/2865/5225 5224/5759/5224 +f 5217/763/5217 5222/5758/5222 5225/2865/5225 5228/5760/5228 +f 5221/1537/5221 5226/5761/5226 5225/2865/5225 5222/5758/5222 +f 4493/360/4493 4496/5373/4496 5229/2866/5229 5230/5762/5230 +f 4488/1435/4488 5218/5756/5218 5229/2866/5229 4496/5373/4496 +f 5217/763/5217 5228/5760/5228 5229/2866/5229 5218/5756/5218 +f 5227/1538/5227 5230/5762/5230 5229/2866/5229 5228/5760/5228 +f 5193/401/5193 5196/5746/5196 5231/2867/5231 5219/5757/5219 +f 5189/1534/5189 5232/5763/5232 5231/2867/5231 5196/5746/5196 +f 5233/764/5233 5234/5764/5234 5231/2867/5231 5232/5763/5232 +f 5221/1537/5221 5219/5757/5219 5231/2867/5231 5234/5764/5234 +f 4586/374/4586 4783/5525/4783 5235/2868/5235 5187/5741/5187 +f 4778/1478/4778 5236/5765/5236 5235/2868/5235 4783/5525/4783 +f 5233/764/5233 5232/5763/5232 5235/2868/5235 5236/5765/5236 +f 5189/1534/5189 5187/5741/5187 5235/2868/5235 5232/5763/5232 +f 4766/389/4766 5237/5766/5237 5238/2869/5238 4776/5521/4776 +f 5239/1539/5239 5240/5767/5240 5238/2869/5238 5237/5766/5237 +f 5233/764/5233 5236/5765/5236 5238/2869/5238 5240/5767/5240 +f 4778/1478/4778 4776/5521/4776 5238/2869/5238 5236/5765/5236 +f 5223/402/5223 5226/5761/5226 5241/2870/5241 5242/5768/5242 +f 5221/1537/5221 5234/5764/5234 5241/2870/5241 5226/5761/5226 +f 5233/764/5233 5240/5767/5240 5241/2870/5241 5234/5764/5234 +f 5239/1539/5239 5242/5768/5242 5241/2870/5241 5240/5767/5240 +f 4596/375/4596 5243/5769/5243 5244/2871/5244 4760/5513/4760 +f 5245/1540/5245 5246/5770/5246 5244/2871/5244 5243/5769/5243 +f 5247/765/5247 5248/5771/5248 5244/2871/5244 5246/5770/5246 +f 4762/1476/4762 4760/5513/4760 5244/2871/5244 5248/5771/5248 +f 5249/404/5249 5250/5772/5250 5251/2872/5251 5252/5774/5252 +f 5253/1541/5253 5254/5773/5254 5251/2872/5251 5250/5772/5250 +f 5247/765/5247 5246/5770/5246 5251/2872/5251 5254/5773/5254 +f 5245/1540/5245 5252/5774/5252 5251/2872/5251 5246/5770/5246 +f 5223/402/5223 5242/5768/5242 5255/2873/5255 5256/5776/5256 +f 5239/1539/5239 5257/5775/5257 5255/2873/5255 5242/5768/5242 +f 5247/765/5247 5254/5773/5254 5255/2873/5255 5257/5775/5257 +f 5253/1541/5253 5256/5776/5256 5255/2873/5255 5254/5773/5254 +f 4766/389/4766 4769/5518/4769 5258/2874/5258 5237/5766/5237 +f 4762/1476/4762 5248/5771/5248 5258/2874/5258 4769/5518/4769 +f 5247/765/5247 5257/5775/5257 5258/2874/5258 5248/5771/5248 +f 5239/1539/5239 5237/5766/5237 5258/2874/5258 5257/5775/5257 +f 5249/404/5249 5259/5777/5259 5260/2875/5260 5250/5772/5250 +f 5261/1542/5261 5262/5778/5262 5260/2875/5260 5259/5777/5259 +f 5263/766/5263 5264/5779/5264 5260/2875/5260 5262/5778/5262 +f 5253/1541/5253 5250/5772/5250 5260/2875/5260 5264/5779/5264 +f 4282/247/4282 4511/5381/4511 5265/2876/5265 5266/5781/5266 +f 4506/1438/4506 5267/5780/5267 5265/2876/5265 4511/5381/4511 +f 5263/766/5263 5262/5778/5262 5265/2876/5265 5267/5780/5267 +f 5261/1542/5261 5266/5781/5266 5265/2876/5265 5262/5778/5262 +f 4493/360/4493 5230/5762/5230 5268/2877/5268 4504/5377/4504 +f 5227/1538/5227 5269/5782/5269 5268/2877/5268 5230/5762/5230 +f 5263/766/5263 5267/5780/5267 5268/2877/5268 5269/5782/5269 +f 4506/1438/4506 4504/5377/4504 5268/2877/5268 5267/5780/5267 +f 5223/402/5223 5256/5776/5256 5270/2878/5270 5224/5759/5224 +f 5253/1541/5253 5264/5779/5264 5270/2878/5270 5256/5776/5256 +f 5263/766/5263 5269/5782/5269 5270/2878/5270 5264/5779/5264 +f 5227/1538/5227 5224/5759/5224 5270/2878/5270 5269/5782/5269 +f 4313/373/4313 4816/5545/4816 5271/2879/5271 4314/5273/4314 +f 4810/1483/4810 5272/5783/5272 5271/2879/5271 4816/5545/4816 +f 5273/767/5273 5274/5784/5274 5271/2879/5271 5272/5783/5272 +f 4317/1406/4317 4314/5273/4314 5271/2879/5271 5274/5784/5274 +f 4794/379/4794 5275/5785/5275 5276/2880/5276 4808/5538/4808 +f 5277/1543/5277 5278/5787/5278 5276/2880/5276 5275/5785/5275 +f 5273/767/5273 5272/5783/5272 5276/2880/5276 5278/5787/5278 +f 4810/1483/4810 4808/5538/4808 5276/2880/5276 5272/5783/5272 +f 5279/380/5279 5280/5788/5280 5281/2881/5281 5282/5790/5282 +f 5283/1545/5283 5284/5789/5284 5281/2881/5281 5280/5788/5280 +f 5273/767/5273 5278/5787/5278 5281/2881/5281 5284/5789/5284 +f 5277/1543/5277 5282/5790/5282 5281/2881/5281 5278/5787/5278 +f 4319/381/4319 4322/5279/4322 5285/2882/5285 5286/5792/5286 +f 4317/1406/4317 5274/5784/5274 5285/2882/5285 4322/5279/4322 +f 5273/767/5273 5284/5789/5284 5285/2882/5285 5274/5784/5274 +f 5283/1545/5283 5286/5792/5286 5285/2882/5285 5284/5789/5284 +f 4794/423/4794 4797/5532/4797 5287/2883/5287 5275/5786/5275 +f 4790/1479/4790 5288/5793/5288 5287/2883/5287 4797/5532/4797 +f 5289/768/5289 5290/5794/5290 5287/2883/5287 5288/5793/5288 +f 5277/1544/5277 5275/5786/5275 5287/2883/5287 5290/5794/5290 +f 1972/84/1972 2523/4329/2523 5291/2884/5291 4788/5527/4788 +f 2518/1160/2518 5292/5795/5292 5291/2884/5291 2523/4329/2523 +f 5289/768/5289 5288/5793/5288 5291/2884/5291 5292/5795/5292 +f 4790/1479/4790 4788/5527/4788 5291/2884/5291 5288/5793/5288 +f 2506/206/2506 5293/5796/5293 5294/2885/5294 2516/4325/2516 +f 5295/1546/5295 5296/5798/5296 5294/2885/5294 5293/5796/5293 +f 5289/768/5289 5292/5795/5292 5294/2885/5294 5296/5798/5296 +f 2518/1160/2518 2516/4325/2516 5294/2885/5294 5292/5795/5292 +f 5279/428/5279 5282/5791/5282 5297/2886/5297 5298/5799/5298 +f 5277/1544/5277 5290/5794/5290 5297/2886/5297 5282/5791/5282 +f 5289/768/5289 5296/5798/5296 5297/2886/5297 5290/5794/5290 +f 5295/1546/5295 5298/5799/5298 5297/2886/5297 5296/5798/5296 +f 2233/124/2233 5041/5665/5041 5299/2887/5299 2500/4315/2500 +f 5045/1517/5045 5300/5801/5300 5299/2887/5299 5041/5665/5041 +f 5301/769/5301 5302/5802/5302 5299/2887/5299 5300/5801/5300 +f 2502/1157/2502 2500/4315/2500 5299/2887/5299 5302/5802/5302 +f 5056/336/5056 5303/5803/5303 5304/2888/5304 5057/5671/5057 +f 5305/1548/5305 5306/5804/5306 5304/2888/5304 5303/5803/5303 +f 5301/769/5301 5300/5801/5300 5304/2888/5304 5306/5804/5306 +f 5045/1517/5045 5057/5671/5057 5304/2888/5304 5300/5801/5300 +f 5279/380/5279 5298/5800/5298 5307/2889/5307 5308/5806/5308 +f 5295/1547/5295 5309/5805/5309 5307/2889/5307 5298/5800/5298 +f 5301/769/5301 5306/5804/5306 5307/2889/5307 5309/5805/5309 +f 5305/1548/5305 5308/5806/5308 5307/2889/5307 5306/5804/5306 +f 2506/232/2506 2509/4321/2509 5310/2890/5310 5293/5797/5293 +f 2502/1157/2502 5302/5802/5302 5310/2890/5310 2509/4321/2509 +f 5301/769/5301 5309/5805/5309 5310/2890/5310 5302/5802/5302 +f 5295/1547/5295 5293/5797/5293 5310/2890/5310 5309/5805/5309 +f 5056/336/5056 5100/5698/5100 5311/2891/5311 5303/5803/5303 +f 5097/1524/5097 5312/5807/5312 5311/2891/5311 5100/5698/5100 +f 5313/770/5313 5314/5808/5314 5311/2891/5311 5312/5807/5312 +f 5305/1548/5305 5303/5803/5303 5311/2891/5311 5314/5808/5314 +f 4327/367/4327 4330/5285/4330 5315/2892/5315 5094/5693/5094 +f 4335/1411/4335 5316/5809/5316 5315/2892/5315 4330/5285/4330 +f 5313/770/5313 5312/5807/5312 5315/2892/5315 5316/5809/5316 +f 5097/1524/5097 5094/5693/5094 5315/2892/5315 5312/5807/5312 +f 4319/381/4319 5286/5792/5286 5317/2893/5317 4345/5292/4345 +f 5283/1545/5283 5318/5810/5318 5317/2893/5317 5286/5792/5286 +f 5313/770/5313 5316/5809/5316 5317/2893/5317 5318/5810/5318 +f 4335/1411/4335 4345/5292/4345 5317/2893/5317 5316/5809/5316 +f 5279/380/5279 5308/5806/5308 5319/2894/5319 5280/5788/5280 +f 5305/1548/5305 5314/5808/5314 5319/2894/5319 5308/5806/5308 +f 5313/770/5313 5318/5810/5318 5319/2894/5319 5314/5808/5314 +f 5283/1545/5283 5280/5788/5280 5319/2894/5319 5318/5810/5318 +f 4408/337/4408 5320/5811/5320 5321/2895/5321 4409/5324/4409 +f 5322/1549/5322 5323/5812/5323 5321/2895/5321 5320/5811/5320 +f 5324/771/5324 5325/5813/5325 5321/2895/5321 5323/5812/5323 +f 4412/1422/4412 4409/5324/4409 5321/2895/5321 5325/5813/5325 +f 5326/338/5326 5327/5814/5327 5328/2896/5328 5329/5816/5329 +f 5330/1550/5330 5331/5815/5331 5328/2896/5328 5327/5814/5327 +f 5324/771/5324 5323/5812/5323 5328/2896/5328 5331/5815/5331 +f 5322/1549/5322 5329/5816/5329 5328/2896/5328 5323/5812/5323 +f 5332/339/5332 5333/5817/5333 5334/2897/5334 5335/5820/5335 +f 5336/1551/5336 5337/5819/5337 5334/2897/5334 5333/5817/5333 +f 5324/771/5324 5331/5815/5331 5334/2897/5334 5337/5819/5337 +f 5330/1550/5330 5335/5820/5335 5334/2897/5334 5331/5815/5331 +f 4417/340/4417 4420/5331/4420 5338/2898/5338 5339/5821/5339 +f 4412/1422/4412 5325/5813/5325 5338/2898/5338 4420/5331/4420 +f 5324/771/5324 5337/5819/5337 5338/2898/5338 5325/5813/5325 +f 5336/1551/5336 5339/5821/5339 5338/2898/5338 5337/5819/5337 +f 5326/338/5326 5340/5823/5340 5341/2899/5341 5327/5814/5327 +f 5342/1553/5342 5343/5824/5343 5341/2899/5341 5340/5823/5340 +f 5344/772/5344 5345/5825/5345 5341/2899/5341 5343/5824/5343 +f 5330/1550/5330 5327/5814/5327 5341/2899/5341 5345/5825/5345 +f 2590/175/2590 2593/4368/2593 5346/2900/5346 5347/5827/5347 +f 2586/1171/2586 5348/5826/5348 5346/2900/5346 2593/4368/2593 +f 5344/772/5344 5343/5824/5343 5346/2900/5346 5348/5826/5348 +f 5342/1553/5342 5347/5827/5347 5346/2900/5346 5343/5824/5343 +f 2573/173/2573 5349/5828/5349 5350/2901/5350 2584/4363/2584 +f 5351/1554/5351 5352/5830/5352 5350/2901/5350 5349/5828/5349 +f 5344/772/5344 5348/5826/5348 5350/2901/5350 5352/5830/5352 +f 2586/1171/2586 2584/4363/2584 5350/2901/5350 5348/5826/5348 +f 5332/339/5332 5335/5820/5335 5353/2902/5353 5354/5831/5354 +f 5330/1550/5330 5345/5825/5345 5353/2902/5353 5335/5820/5335 +f 5344/772/5344 5352/5830/5352 5353/2902/5353 5345/5825/5345 +f 5351/1554/5351 5354/5831/5354 5353/2902/5353 5352/5830/5352 +f 2564/327/2564 5355/5833/5355 5356/2903/5356 2565/4351/2565 +f 5357/1556/5357 5358/5834/5358 5356/2903/5356 5355/5833/5355 +f 5359/773/5359 5360/5835/5360 5356/2903/5356 5358/5834/5358 +f 2568/1167/2568 2565/4351/2565 5356/2903/5356 5360/5835/5360 +f 5361/429/5361 5362/5836/5362 5363/2904/5363 5364/5838/5364 +f 5365/1557/5365 5366/5837/5366 5363/2904/5363 5362/5836/5362 +f 5359/773/5359 5358/5834/5358 5363/2904/5363 5366/5837/5366 +f 5357/1556/5357 5364/5838/5364 5363/2904/5363 5358/5834/5358 +f 5332/430/5332 5354/5832/5354 5367/2905/5367 5368/5840/5368 +f 5351/1555/5351 5369/5839/5369 5367/2905/5367 5354/5832/5354 +f 5359/773/5359 5366/5837/5366 5367/2905/5367 5369/5839/5369 +f 5365/1557/5365 5368/5840/5368 5367/2905/5367 5366/5837/5366 +f 2573/342/2573 2576/4358/2576 5370/2906/5370 5349/5829/5349 +f 2568/1167/2568 5360/5835/5360 5370/2906/5370 2576/4358/2576 +f 5359/773/5359 5369/5839/5369 5370/2906/5370 5360/5835/5360 +f 5351/1555/5351 5349/5829/5349 5370/2906/5370 5369/5839/5369 +f 5361/429/5361 5371/5841/5371 5372/2907/5372 5362/5836/5362 +f 5373/1558/5373 5374/5842/5374 5372/2907/5372 5371/5841/5371 +f 5375/774/5375 5376/5843/5376 5372/2907/5372 5374/5842/5374 +f 5365/1557/5365 5362/5836/5362 5372/2907/5372 5376/5843/5376 +f 4434/411/4434 4437/5343/4437 5377/2908/5377 5378/5845/5378 +f 4430/1426/4430 5379/5844/5379 5377/2908/5377 4437/5343/4437 +f 5375/774/5375 5374/5842/5374 5377/2908/5377 5379/5844/5379 +f 5373/1558/5373 5378/5845/5378 5377/2908/5377 5374/5842/5374 +f 4417/431/4417 5339/5822/5339 5380/2909/5380 4428/5336/4428 +f 5336/1552/5336 5381/5846/5381 5380/2909/5380 5339/5822/5339 +f 5375/774/5375 5379/5844/5379 5380/2909/5380 5381/5846/5381 +f 4430/1426/4430 4428/5336/4428 5380/2909/5380 5379/5844/5379 +f 5332/430/5332 5368/5840/5368 5382/2910/5382 5333/5818/5333 +f 5365/1557/5365 5376/5843/5376 5382/2910/5382 5368/5840/5368 +f 5375/774/5375 5381/5846/5381 5382/2910/5382 5376/5843/5376 +f 5336/1552/5336 5333/5818/5333 5382/2910/5382 5381/5846/5381 +f 4434/411/4434 5378/5845/5378 5383/2911/5383 4636/5447/4636 +f 5373/1558/5373 5384/5847/5384 5383/2911/5383 5378/5845/5378 +f 5385/775/5385 5386/5848/5386 5383/2911/5383 5384/5847/5384 +f 4638/1459/4638 4636/5447/4636 5383/2911/5383 5386/5848/5386 +f 5361/429/5361 5387/5849/5387 5388/2912/5388 5371/5841/5371 +f 5389/1559/5389 5390/5850/5390 5388/2912/5388 5387/5849/5387 +f 5385/775/5385 5384/5847/5384 5388/2912/5388 5390/5850/5390 +f 5373/1558/5373 5371/5841/5371 5388/2912/5388 5384/5847/5384 +f 5391/432/5391 5392/5851/5392 5393/2913/5393 5394/5853/5394 +f 5395/1560/5395 5396/5852/5396 5393/2913/5393 5392/5851/5392 +f 5385/775/5385 5390/5850/5390 5393/2913/5393 5396/5852/5396 +f 5389/1559/5389 5394/5853/5394 5393/2913/5393 5390/5850/5390 +f 4642/412/4642 4645/5452/4645 5397/2914/5397 5398/5854/5398 +f 4638/1459/4638 5386/5848/5386 5397/2914/5397 4645/5452/4645 +f 5385/775/5385 5396/5852/5396 5397/2914/5397 5386/5848/5386 +f 5395/1560/5395 5398/5854/5398 5397/2914/5397 5396/5852/5396 +f 5361/429/5361 5364/5838/5364 5399/2915/5399 5387/5849/5387 +f 5357/1556/5357 5400/5855/5400 5399/2915/5399 5364/5838/5364 +f 5401/776/5401 5402/5856/5402 5399/2915/5399 5400/5855/5400 +f 5389/1559/5389 5387/5849/5387 5399/2915/5399 5402/5856/5402 +f 2564/327/2564 2651/4397/2651 5403/2916/5403 5355/5833/5355 +f 2646/1178/2646 5404/5857/5404 5403/2916/5403 2651/4397/2651 +f 5401/776/5401 5400/5855/5400 5403/2916/5403 5404/5857/5404 +f 5357/1556/5357 5355/5833/5355 5403/2916/5403 5400/5855/5400 +f 2634/407/2634 5405/5858/5405 5406/2917/5406 2644/4393/2644 +f 5407/1561/5407 5408/5859/5408 5406/2917/5406 5405/5858/5405 +f 5401/776/5401 5404/5857/5404 5406/2917/5406 5408/5859/5408 +f 2646/1178/2646 2644/4393/2644 5406/2917/5406 5404/5857/5404 +f 5391/432/5391 5394/5853/5394 5409/2918/5409 5410/5860/5410 +f 5389/1559/5389 5402/5856/5402 5409/2918/5409 5394/5853/5394 +f 5401/776/5401 5408/5859/5408 5409/2918/5409 5402/5856/5402 +f 5407/1561/5407 5410/5860/5410 5409/2918/5409 5408/5859/5408 +f 2003/158/2003 4853/5565/4853 5411/2919/5411 2628/4385/2628 +f 4848/1490/4848 5412/5861/5412 5411/2919/5411 4853/5565/4853 +f 5413/777/5413 5414/5862/5414 5411/2919/5411 5412/5861/5412 +f 2630/1176/2630 2628/4385/2628 5411/2919/5411 5414/5862/5414 +f 4835/427/4835 5415/5863/5415 5416/2920/5416 4846/5561/4846 +f 5417/1562/5417 5418/5864/5418 5416/2920/5416 5415/5863/5415 +f 5413/777/5413 5412/5861/5412 5416/2920/5416 5418/5864/5418 +f 4848/1490/4848 4846/5561/4846 5416/2920/5416 5412/5861/5412 +f 5391/432/5391 5410/5860/5410 5419/2921/5419 5420/5866/5420 +f 5407/1561/5407 5421/5865/5421 5419/2921/5419 5410/5860/5410 +f 5413/777/5413 5418/5864/5418 5419/2921/5419 5421/5865/5421 +f 5417/1562/5417 5420/5866/5420 5419/2921/5419 5418/5864/5418 +f 2634/407/2634 2637/4390/2637 5422/2922/5422 5405/5858/5405 +f 2630/1176/2630 5414/5862/5414 5422/2922/5422 2637/4390/2637 +f 5413/777/5413 5421/5865/5421 5422/2922/5422 5414/5862/5414 +f 5407/1561/5407 5405/5858/5405 5422/2922/5422 5421/5865/5421 +f 4835/427/4835 4838/5557/4838 5423/2923/5423 5415/5863/5415 +f 4830/1487/4830 5424/5867/5424 5423/2923/5423 4838/5557/4838 +f 5425/778/5425 5426/5868/5426 5423/2923/5423 5424/5867/5424 +f 5417/1562/5417 5415/5863/5415 5423/2923/5423 5426/5868/5426 +f 4658/421/4658 4661/5460/4661 5427/2924/5427 4827/5551/4827 +f 4654/1461/4654 5428/5869/5428 5427/2924/5427 4661/5460/4661 +f 5425/778/5425 5424/5867/5424 5427/2924/5427 5428/5869/5428 +f 4830/1487/4830 4827/5551/4827 5427/2924/5427 5424/5867/5424 +f 4642/412/4642 5398/5854/5398 5429/2925/5429 4652/5455/4652 +f 5395/1560/5395 5430/5870/5430 5429/2925/5429 5398/5854/5398 +f 5425/778/5425 5428/5869/5428 5429/2925/5429 5430/5870/5430 +f 4654/1461/4654 4652/5455/4652 5429/2925/5429 5428/5869/5428 +f 5391/432/5391 5420/5866/5420 5431/2926/5431 5392/5851/5392 +f 5417/1562/5417 5426/5868/5426 5431/2926/5431 5420/5866/5420 +f 5425/778/5425 5430/5870/5430 5431/2926/5431 5426/5868/5426 +f 5395/1560/5395 5392/5851/5392 5431/2926/5431 5430/5870/5430 +f 4700/341/4700 5432/5871/5432 5433/2927/5433 4701/5480/4701 +f 5434/1563/5434 5435/5872/5435 5433/2927/5433 5432/5871/5432 +f 5436/779/5436 5437/5873/5437 5433/2927/5433 5435/5872/5435 +f 4704/1468/4704 4701/5480/4701 5433/2927/5433 5437/5873/5437 +f 5438/343/5438 5439/5874/5439 5440/2928/5440 5441/5876/5441 +f 5442/1564/5442 5443/5875/5443 5440/2928/5440 5439/5874/5439 +f 5436/779/5436 5435/5872/5435 5440/2928/5440 5443/5875/5443 +f 5434/1563/5434 5441/5876/5441 5440/2928/5440 5435/5872/5435 +f 5444/344/5444 5445/5877/5445 5446/2929/5446 5447/5879/5447 +f 5448/1565/5448 5449/5878/5449 5446/2929/5446 5445/5877/5445 +f 5436/779/5436 5443/5875/5443 5446/2929/5446 5449/5878/5449 +f 5442/1564/5442 5447/5879/5447 5446/2929/5446 5443/5875/5443 +f 4709/345/4709 4712/5487/4712 5450/2930/5450 5451/5880/5451 +f 4704/1468/4704 5437/5873/5437 5450/2930/5450 4712/5487/4712 +f 5436/779/5436 5449/5878/5449 5450/2930/5450 5437/5873/5437 +f 5448/1565/5448 5451/5880/5451 5450/2930/5450 5449/5878/5449 +f 5438/343/5438 5452/5881/5452 5453/2931/5453 5439/5874/5439 +f 5454/1566/5454 5455/5882/5455 5453/2931/5453 5452/5881/5452 +f 5456/780/5456 5457/5883/5457 5453/2931/5453 5455/5882/5455 +f 5442/1564/5442 5439/5874/5439 5453/2931/5453 5457/5883/5457 +f 2710/219/2710 2713/4428/2713 5458/2932/5458 5459/5885/5459 +f 2706/1185/2706 5460/5884/5460 5458/2932/5458 2713/4428/2713 +f 5456/780/5456 5455/5882/5455 5458/2932/5458 5460/5884/5460 +f 5454/1566/5454 5459/5885/5459 5458/2932/5458 5455/5882/5455 +f 2694/217/2694 5461/5886/5461 5462/2933/5462 2704/4423/2704 +f 5463/1567/5463 5464/5887/5464 5462/2933/5462 5461/5886/5461 +f 5456/780/5456 5460/5884/5460 5462/2933/5462 5464/5887/5464 +f 2706/1185/2706 2704/4423/2704 5462/2933/5462 5460/5884/5460 +f 5444/344/5444 5447/5879/5447 5465/2934/5465 5466/5888/5466 +f 5442/1564/5442 5457/5883/5457 5465/2934/5465 5447/5879/5447 +f 5456/780/5456 5464/5887/5464 5465/2934/5465 5457/5883/5457 +f 5463/1567/5463 5466/5888/5466 5465/2934/5465 5464/5887/5464 +f 2590/175/2590 5347/5827/5347 5467/2935/5467 2688/4415/2688 +f 5342/1553/5342 5468/5889/5468 5467/2935/5467 5347/5827/5347 +f 5469/781/5469 5470/5890/5470 5467/2935/5467 5468/5889/5468 +f 2690/1183/2690 2688/4415/2688 5467/2935/5467 5470/5890/5470 +f 5326/338/5326 5471/5891/5471 5472/2936/5472 5340/5823/5340 +f 5473/1568/5473 5474/5892/5474 5472/2936/5472 5471/5891/5471 +f 5469/781/5469 5468/5889/5468 5472/2936/5472 5474/5892/5474 +f 5342/1553/5342 5340/5823/5340 5472/2936/5472 5468/5889/5468 +f 5444/344/5444 5466/5888/5466 5475/2937/5475 5476/5894/5476 +f 5463/1567/5463 5477/5893/5477 5475/2937/5475 5466/5888/5466 +f 5469/781/5469 5474/5892/5474 5475/2937/5475 5477/5893/5477 +f 5473/1568/5473 5476/5894/5476 5475/2937/5475 5474/5892/5474 +f 2694/217/2694 2697/4420/2697 5478/2938/5478 5461/5886/5461 +f 2690/1183/2690 5470/5890/5470 5478/2938/5478 2697/4420/2697 +f 5469/781/5469 5477/5893/5477 5478/2938/5478 5470/5890/5470 +f 5463/1567/5463 5461/5886/5461 5478/2938/5478 5477/5893/5477 +f 5326/338/5326 5329/5816/5329 5479/2939/5479 5471/5891/5471 +f 5322/1549/5322 5480/5895/5480 5479/2939/5479 5329/5816/5329 +f 5481/782/5481 5482/5896/5482 5479/2939/5479 5480/5895/5480 +f 5473/1568/5473 5471/5891/5471 5479/2939/5479 5482/5896/5482 +f 4408/337/4408 4727/5497/4727 5483/2940/5483 5320/5811/5320 +f 4722/1472/4722 5484/5897/5484 5483/2940/5483 4727/5497/4727 +f 5481/782/5481 5480/5895/5480 5483/2940/5483 5484/5897/5484 +f 5322/1549/5322 5320/5811/5320 5483/2940/5483 5480/5895/5480 +f 4709/345/4709 5451/5880/5451 5485/2941/5485 4720/5492/4720 +f 5448/1565/5448 5486/5898/5486 5485/2941/5485 5451/5880/5451 +f 5481/782/5481 5484/5897/5484 5485/2941/5485 5486/5898/5486 +f 4722/1472/4722 4720/5492/4720 5485/2941/5485 5484/5897/5484 +f 5444/344/5444 5476/5894/5476 5487/2942/5487 5445/5877/5445 +f 5473/1568/5473 5482/5896/5482 5487/2942/5487 5476/5894/5476 +f 5481/782/5481 5486/5898/5486 5487/2942/5487 5482/5896/5482 +f 5448/1565/5448 5445/5877/5445 5487/2942/5487 5486/5898/5486 +f 4313/252/4313 4316/5275/4316 5488/2943/5488 4814/5542/4814 +f 4309/1404/4309 5489/5899/5489 5488/2943/5488 4316/5275/4316 +f 5490/783/5490 5491/5900/5491 5488/2943/5488 5489/5899/5489 +f 4817/1485/4817 4814/5542/4814 5488/2943/5488 5491/5900/5491 +f 4291/248/4291 5492/5901/5492 5493/2944/5493 4307/5269/4307 +f 5494/1569/5494 5495/5902/5495 5493/2944/5493 5492/5901/5492 +f 5490/783/5490 5489/5899/5489 5493/2944/5493 5495/5902/5495 +f 4309/1404/4309 4307/5269/4307 5493/2944/5493 5489/5899/5489 +f 5496/405/5496 5497/5903/5497 5498/2945/5498 5499/5906/5499 +f 5500/1570/5500 5501/5905/5501 5498/2945/5498 5497/5903/5497 +f 5490/783/5490 5495/5902/5495 5498/2945/5498 5501/5905/5501 +f 5494/1569/5494 5499/5906/5499 5498/2945/5498 5495/5902/5495 +f 4819/406/4819 4822/5549/4822 5502/2946/5502 5503/5907/5503 +f 4817/1485/4817 5491/5900/5491 5502/2946/5502 4822/5549/4822 +f 5490/783/5490 5501/5905/5501 5502/2946/5502 5491/5900/5491 +f 5500/1570/5500 5503/5907/5503 5502/2946/5502 5501/5905/5501 +f 4291/248/4291 4294/5263/4294 5504/2947/5504 5492/5901/5492 +f 4286/1400/4286 5505/5909/5505 5504/2947/5504 4294/5263/4294 +f 5506/784/5506 5507/5910/5507 5504/2947/5504 5505/5909/5505 +f 5494/1569/5494 5492/5901/5492 5504/2947/5504 5507/5910/5507 +f 4282/247/4282 5266/5781/5266 5508/2948/5508 4283/5257/4283 +f 5261/1542/5261 5509/5911/5509 5508/2948/5508 5266/5781/5266 +f 5506/784/5506 5505/5909/5505 5508/2948/5508 5509/5911/5509 +f 4286/1400/4286 4283/5257/4283 5508/2948/5508 5505/5909/5505 +f 5249/404/5249 5510/5912/5510 5511/2949/5511 5259/5777/5259 +f 5512/1572/5512 5513/5913/5513 5511/2949/5511 5510/5912/5510 +f 5506/784/5506 5509/5911/5509 5511/2949/5511 5513/5913/5513 +f 5261/1542/5261 5259/5777/5259 5511/2949/5511 5509/5911/5509 +f 5496/405/5496 5499/5906/5499 5514/2950/5514 5515/5914/5515 +f 5494/1569/5494 5507/5910/5507 5514/2950/5514 5499/5906/5499 +f 5506/784/5506 5513/5913/5513 5514/2950/5514 5507/5910/5507 +f 5512/1572/5512 5515/5914/5515 5514/2950/5514 5513/5913/5513 +f 4596/375/4596 4599/5426/4599 5516/2951/5516 5243/5769/5243 +f 4604/1455/4604 5517/5915/5517 5516/2951/5516 4599/5426/4599 +f 5518/785/5518 5519/5916/5519 5516/2951/5516 5517/5915/5517 +f 5245/1540/5245 5243/5769/5243 5516/2951/5516 5519/5916/5519 +f 4617/378/4617 5520/5917/5520 5521/2952/5521 4618/5434/4618 +f 5522/1573/5522 5523/5919/5523 5521/2952/5521 5520/5917/5520 +f 5518/785/5518 5517/5915/5517 5521/2952/5521 5523/5919/5523 +f 4604/1455/4604 4618/5434/4618 5521/2952/5521 5517/5915/5517 +f 5496/405/5496 5515/5914/5515 5524/2953/5524 5525/5921/5525 +f 5512/1572/5512 5526/5920/5526 5524/2953/5524 5515/5914/5515 +f 5518/785/5518 5523/5919/5523 5524/2953/5524 5526/5920/5526 +f 5522/1573/5522 5525/5921/5525 5524/2953/5524 5523/5919/5523 +f 5249/404/5249 5252/5774/5252 5527/2954/5527 5510/5912/5510 +f 5245/1540/5245 5519/5916/5519 5527/2954/5527 5252/5774/5252 +f 5518/785/5518 5526/5920/5526 5527/2954/5527 5519/5916/5519 +f 5512/1572/5512 5510/5912/5510 5527/2954/5527 5526/5920/5526 +f 4617/422/4617 4665/5462/4665 5528/2955/5528 5520/5918/5520 +f 4662/1462/4662 5529/5923/5529 5528/2955/5528 4665/5462/4665 +f 5530/786/5530 5531/5924/5531 5528/2955/5528 5529/5923/5529 +f 5522/1574/5522 5520/5918/5520 5528/2955/5528 5531/5924/5531 +f 4658/421/4658 4829/5554/4829 5532/2956/5532 4659/5458/4659 +f 4834/1489/4834 5533/5925/5533 5532/2956/5532 4829/5554/4829 +f 5530/786/5530 5529/5923/5529 5532/2956/5532 5533/5925/5533 +f 4662/1462/4662 4659/5458/4659 5532/2956/5532 5529/5923/5529 +f 4819/426/4819 5503/5908/5503 5534/2957/5534 4844/5560/4844 +f 5500/1571/5500 5535/5926/5535 5534/2957/5534 5503/5908/5503 +f 5530/786/5530 5533/5925/5533 5534/2957/5534 5535/5926/5535 +f 4834/1489/4834 4844/5560/4844 5534/2957/5534 5533/5925/5533 +f 5496/433/5496 5525/5922/5525 5536/2958/5536 5497/5904/5497 +f 5522/1574/5522 5531/5924/5531 5536/2958/5536 5525/5922/5525 +f 5530/786/5530 5535/5926/5535 5536/2958/5536 5531/5924/5531 +f 5500/1571/5500 5497/5904/5497 5536/2958/5536 5535/5926/5535 +f 3486/310/3486 4171/5203/4171 5537/2959/5537 4893/5586/4893 +f 4175/1390/4175 5538/5927/5538 5537/2959/5537 4171/5203/4171 +f 5539/787/5539 5540/5928/5540 5537/2959/5537 5538/5927/5538 +f 4895/1497/4895 4893/5586/4893 5537/2959/5537 5540/5928/5540 +f 4186/334/4186 5541/5929/5541 5542/2960/5542 4187/5209/4187 +f 5543/1575/5543 5544/5930/5544 5542/2960/5542 5541/5929/5541 +f 5539/787/5539 5538/5927/5538 5542/2960/5542 5544/5930/5544 +f 4175/1390/4175 4187/5209/4187 5542/2960/5542 5538/5927/5538 +f 5545/352/5545 5546/5931/5546 5547/2961/5547 5548/5933/5548 +f 5549/1576/5549 5550/5932/5550 5547/2961/5547 5546/5931/5546 +f 5539/787/5539 5544/5930/5544 5547/2961/5547 5550/5932/5550 +f 5543/1575/5543 5548/5933/5548 5547/2961/5547 5544/5930/5544 +f 4899/365/4899 4902/5592/4902 5551/2962/5551 5552/5934/5552 +f 4895/1497/4895 5540/5928/5540 5551/2962/5551 4902/5592/4902 +f 5539/787/5539 5550/5932/5550 5551/2962/5551 5540/5928/5540 +f 5549/1576/5549 5552/5934/5552 5551/2962/5551 5550/5932/5550 +f 4186/334/4186 4223/5228/4223 5553/2963/5553 5541/5929/5541 +f 4220/1393/4220 5554/5935/5554 5553/2963/5553 4223/5228/4223 +f 5555/788/5555 5556/5936/5556 5553/2963/5553 5554/5935/5554 +f 5543/1575/5543 5541/5929/5541 5553/2963/5553 5556/5936/5556 +f 1372/129/1372 2820/4485/2820 5557/2964/5557 4218/5225/4218 +f 2815/1198/2815 5558/5937/5558 5557/2964/5557 2820/4485/2820 +f 5555/788/5555 5554/5935/5554 5557/2964/5557 5558/5937/5558 +f 4220/1393/4220 4218/5225/4218 5557/2964/5557 5554/5935/5554 +f 2803/241/2803 5559/5938/5559 5560/2965/5560 2813/4481/2813 +f 5561/1577/5561 5562/5939/5562 5560/2965/5560 5559/5938/5559 +f 5555/788/5555 5558/5937/5558 5560/2965/5560 5562/5939/5562 +f 2815/1198/2815 2813/4481/2813 5560/2965/5560 5558/5937/5558 +f 5545/352/5545 5548/5933/5548 5563/2966/5563 5564/5940/5564 +f 5543/1575/5543 5556/5936/5556 5563/2966/5563 5548/5933/5548 +f 5555/788/5555 5562/5939/5562 5563/2966/5563 5556/5936/5556 +f 5561/1577/5561 5564/5940/5564 5563/2966/5563 5562/5939/5562 +f 2710/219/2710 5459/5885/5459 5565/2967/5565 2797/4473/2797 +f 5454/1566/5454 5566/5941/5566 5565/2967/5565 5459/5885/5459 +f 5567/789/5567 5568/5942/5568 5565/2967/5565 5566/5941/5566 +f 2799/1196/2799 2797/4473/2797 5565/2967/5565 5568/5942/5568 +f 5438/343/5438 5569/5943/5569 5570/2968/5570 5452/5881/5452 +f 5571/1578/5571 5572/5944/5572 5570/2968/5570 5569/5943/5569 +f 5567/789/5567 5566/5941/5566 5570/2968/5570 5572/5944/5572 +f 5454/1566/5454 5452/5881/5452 5570/2968/5570 5566/5941/5566 +f 5545/352/5545 5564/5940/5564 5573/2969/5573 5574/5946/5574 +f 5561/1577/5561 5575/5945/5575 5573/2969/5573 5564/5940/5564 +f 5567/789/5567 5572/5944/5572 5573/2969/5573 5575/5945/5575 +f 5571/1578/5571 5574/5946/5574 5573/2969/5573 5572/5944/5572 +f 2803/241/2803 2806/4478/2806 5576/2970/5576 5559/5938/5559 +f 2799/1196/2799 5568/5942/5568 5576/2970/5576 2806/4478/2806 +f 5567/789/5567 5575/5945/5575 5576/2970/5576 5568/5942/5568 +f 5561/1577/5561 5559/5938/5559 5576/2970/5576 5575/5945/5575 +f 5438/343/5438 5441/5876/5441 5577/2971/5577 5569/5943/5569 +f 5434/1563/5434 5578/5947/5578 5577/2971/5577 5441/5876/5441 +f 5579/790/5579 5580/5948/5580 5577/2971/5577 5578/5947/5578 +f 5571/1578/5571 5569/5943/5569 5577/2971/5577 5580/5948/5580 +f 4700/341/4700 4916/5601/4916 5581/2972/5581 5432/5871/5432 +f 4911/1500/4911 5582/5949/5582 5581/2972/5581 4916/5601/4916 +f 5579/790/5579 5578/5947/5578 5581/2972/5581 5582/5949/5582 +f 5434/1563/5434 5432/5871/5432 5581/2972/5581 5578/5947/5578 +f 4899/365/4899 5552/5934/5552 5583/2973/5583 4909/5596/4909 +f 5549/1576/5549 5584/5950/5584 5583/2973/5583 5552/5934/5552 +f 5579/790/5579 5582/5949/5582 5583/2973/5583 5584/5950/5584 +f 4911/1500/4911 4909/5596/4909 5583/2973/5583 5582/5949/5582 +f 5545/352/5545 5574/5946/5574 5585/2974/5585 5546/5931/5546 +f 5571/1578/5571 5580/5948/5580 5585/2974/5585 5574/5946/5574 +f 5579/790/5579 5584/5950/5584 5585/2974/5585 5580/5948/5580 +f 5549/1576/5549 5546/5931/5546 5585/2974/5585 5584/5950/5584 +f 3697/243/3697 4227/5231/4227 5586/2975/5586 5072/5680/5072 +f 4231/1396/4231 5587/5951/5587 5586/2975/5586 4227/5231/4227 +f 5588/791/5588 5589/5952/5589 5586/2975/5586 5587/5951/5587 +f 5074/1520/5074 5072/5680/5072 5586/2975/5586 5589/5952/5589 +f 4242/246/4242 5590/5953/5590 5591/2976/5591 4243/5237/4243 +f 5592/1579/5592 5593/5954/5593 5591/2976/5591 5590/5953/5590 +f 5588/791/5588 5587/5951/5587 5591/2976/5591 5593/5954/5593 +f 4231/1396/4231 4243/5237/4243 5591/2976/5591 5587/5951/5587 +f 5594/409/5594 5595/5955/5595 5596/2977/5596 5597/5957/5597 +f 5598/1580/5598 5599/5956/5599 5596/2977/5596 5595/5955/5595 +f 5588/791/5588 5593/5954/5593 5596/2977/5596 5599/5956/5599 +f 5592/1579/5592 5597/5957/5597 5596/2977/5596 5593/5954/5593 +f 5078/410/5078 5081/5686/5081 5600/2978/5600 5601/5958/5601 +f 5074/1520/5074 5589/5952/5589 5600/2978/5600 5081/5686/5081 +f 5588/791/5588 5599/5956/5599 5600/2978/5600 5589/5952/5589 +f 5598/1580/5598 5601/5958/5601 5600/2978/5600 5599/5956/5599 +f 4242/246/4242 4279/5256/4279 5602/2979/5602 5590/5953/5590 +f 4276/1399/4276 5603/5959/5603 5602/2979/5602 4279/5256/4279 +f 5604/792/5604 5605/5960/5605 5602/2979/5602 5603/5959/5603 +f 5592/1579/5592 5590/5953/5590 5602/2979/5602 5605/5960/5605 +f 3584/222/3584 4948/5617/4948 5606/2980/5606 4274/5253/4274 +f 4943/1504/4943 5607/5961/5607 5606/2980/5606 4948/5617/4948 +f 5604/792/5604 5603/5959/5603 5606/2980/5606 5607/5961/5607 +f 4276/1399/4276 4274/5253/4274 5606/2980/5606 5603/5959/5603 +f 4927/393/4927 5608/5962/5608 5609/2981/5609 4941/5613/4941 +f 5610/1581/5610 5611/5963/5611 5609/2981/5609 5608/5962/5608 +f 5604/792/5604 5607/5961/5607 5609/2981/5609 5611/5963/5611 +f 4943/1504/4943 4941/5613/4941 5609/2981/5609 5607/5961/5607 +f 5594/409/5594 5597/5957/5597 5612/2982/5612 5613/5964/5613 +f 5592/1579/5592 5605/5960/5605 5612/2982/5612 5597/5957/5597 +f 5604/792/5604 5611/5963/5611 5612/2982/5612 5605/5960/5605 +f 5610/1581/5610 5613/5964/5613 5612/2982/5612 5611/5963/5611 +f 4353/257/4353 4356/5298/4356 5614/2983/5614 4921/5603/4921 +f 4349/1412/4349 5615/5965/5615 5614/2983/5614 4356/5298/4356 +f 5616/793/5616 5617/5966/5617 5614/2983/5614 5615/5965/5615 +f 4923/1501/4923 4921/5603/4921 5614/2983/5614 5617/5966/5617 +f 4336/256/4336 5618/5967/5618 5619/2984/5619 4347/5293/4347 +f 5620/1582/5620 5621/5968/5621 5619/2984/5619 5618/5967/5618 +f 5616/793/5616 5615/5965/5615 5619/2984/5619 5621/5968/5621 +f 4349/1412/4349 4347/5293/4347 5619/2984/5619 5615/5965/5615 +f 5594/409/5594 5613/5964/5613 5622/2985/5622 5623/5970/5623 +f 5610/1581/5610 5624/5969/5624 5622/2985/5622 5613/5964/5613 +f 5616/793/5616 5621/5968/5621 5622/2985/5622 5624/5969/5624 +f 5620/1582/5620 5623/5970/5623 5622/2985/5622 5621/5968/5621 +f 4927/393/4927 4930/5608/4930 5625/2986/5625 5608/5962/5608 +f 4923/1501/4923 5617/5966/5617 5625/2986/5625 4930/5608/4930 +f 5616/793/5616 5624/5969/5624 5625/2986/5625 5617/5966/5617 +f 5610/1581/5610 5608/5962/5608 5625/2986/5625 5624/5969/5624 +f 4336/256/4336 4339/5288/4339 5626/2987/5626 5618/5967/5618 +f 4331/1408/4331 5627/5971/5627 5626/2987/5626 4339/5288/4339 +f 5628/794/5628 5629/5972/5629 5626/2987/5626 5627/5971/5627 +f 5620/1582/5620 5618/5967/5618 5626/2987/5626 5629/5972/5629 +f 4327/255/4327 5096/5696/5096 5630/2988/5630 4328/5281/4328 +f 5090/1523/5090 5631/5973/5631 5630/2988/5630 5096/5696/5096 +f 5628/794/5628 5627/5971/5627 5630/2988/5630 5631/5973/5631 +f 4331/1408/4331 4328/5281/4328 5630/2988/5630 5627/5971/5627 +f 5078/410/5078 5601/5958/5601 5632/2989/5632 5088/5690/5088 +f 5598/1580/5598 5633/5974/5633 5632/2989/5632 5601/5958/5601 +f 5628/794/5628 5631/5973/5631 5632/2989/5632 5633/5974/5633 +f 5090/1523/5090 5088/5690/5088 5632/2989/5632 5631/5973/5631 +f 5594/409/5594 5623/5970/5623 5634/2990/5634 5595/5955/5595 +f 5620/1582/5620 5629/5972/5629 5634/2990/5634 5623/5970/5623 +f 5628/794/5628 5633/5974/5633 5634/2990/5634 5629/5972/5629 +f 5598/1580/5598 5595/5955/5595 5634/2990/5634 5633/5974/5633 +# 5632 polygons + diff --git a/python_backend/app/api/routers.py b/python_backend/app/api/routers.py new file mode 100644 index 0000000..0b38cc6 --- /dev/null +++ b/python_backend/app/api/routers.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +from fastapi import APIRouter +from app.api.v1.interpreter import router as interpreter_router +from app.api.v1.ollama import router as ollama_router +from app.core.conf import settings + +v1 = APIRouter(prefix=settings.API_V1_STR) +v1.include_router(interpreter_router, prefix='/interpreter', tags=['Interpreter']) +v1.include_router(ollama_router, prefix='/ollama', tags=['ollama']) diff --git a/python_backend/app/api/v1/interpreter.py b/python_backend/app/api/v1/interpreter.py new file mode 100644 index 0000000..c37850d --- /dev/null +++ b/python_backend/app/api/v1/interpreter.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- + +from fastapi import APIRouter +from fastapi.responses import StreamingResponse +from app.common.open_interpreter import open_interpreter +from app.common.response import ResponseModel +from app.schemas.interpreter import InterpreterMessage + +router = APIRouter() + + +@router.post('/chat', summary='ChatGPT') +def interpreter_chat(message: InterpreterMessage) -> ResponseModel: + result = open_interpreter.chat(message) + return ResponseModel(data=result) + + +@router.post('/chat-stream', summary='ChatGPT 流式响应') +def interpreter_chat_stream(message: InterpreterMessage) -> StreamingResponse: + def event_stream(): + for result in open_interpreter.chat(message, stream=True): + yield f'{result}\n\n' + + return StreamingResponse(event_stream(), media_type='text/event-stream') + + +@router.get('/history', summary='历史消息') +def interpreter_history() -> ResponseModel: + return ResponseModel(data=open_interpreter.messages) + + +@router.post('/reset', summary='重置上下文') +def interpreter_reset() -> ResponseModel: + open_interpreter.reset() + return ResponseModel() diff --git a/python_backend/app/api/v1/ollama.py b/python_backend/app/api/v1/ollama.py new file mode 100644 index 0000000..0c88ec4 --- /dev/null +++ b/python_backend/app/api/v1/ollama.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +from typing import Annotated +import msgspec.json +from fastapi import APIRouter, Query +from ollama import AsyncClient +from starlette.responses import StreamingResponse +from app.common.response import ResponseModel +from app.core.conf import settings +from app.schemas.ollama import OllamaMessages + +router = APIRouter() + + +@router.post('/chat', summary='ChatGPT') +async def ollama_chat(messages: OllamaMessages) -> ResponseModel: + result = await AsyncClient().chat( + model=settings.OLLAMA_MODEL, messages=[{'role': messages.role, 'content': messages.content}] + ) + return ResponseModel(data=result) + + +@router.post('/chat-stream', summary='ChatGPT 流式响应') +async def ollama_chat_stream(messages: OllamaMessages): + async def event_stream(): + async for result in await AsyncClient().chat( + model=settings.OLLAMA_MODEL, + messages=[{'role': messages.role, 'content': messages.content}], + stream=True, + ): + text_line = msgspec.json.encode(result) + yield f'{text_line}\n\n' + + return StreamingResponse(event_stream(), media_type='text/event-stream') + + +@router.get('/list', summary='本地离线模型列表') +async def ollama_list() -> ResponseModel: + data = await AsyncClient().list() + return ResponseModel(data=data) + + +@router.post('/pull', summary='拉取离线模型') +async def ollama_pull(model: Annotated[str, Query()]) -> ResponseModel: + data = await AsyncClient().pull(model) + return ResponseModel(data=data) + + +@router.delete('/delete', summary='删除本地离线模型') +async def ollama_delete(model: Annotated[str, Query()]) -> ResponseModel: + data = await AsyncClient().delete(model) + return ResponseModel(data=data) diff --git a/python_backend/app/common/log.py b/python_backend/app/common/log.py new file mode 100644 index 0000000..91f2dc1 --- /dev/null +++ b/python_backend/app/common/log.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations +import os +import loguru +from loguru import logger +from app.core import path_conf + + +class Logger: + @staticmethod + def log() -> loguru.Logger: + if not os.path.exists(path_conf.LogPath): + os.mkdir(path_conf.LogPath) + + # 日志文件 + log_file = os.path.join(path_conf.LogPath, 'fastapi_chatgpt.log') + + # loguru日志 + logger.add( + log_file, + encoding='utf-8', + level='DEBUG', + rotation='10 MB', + retention='7 days', + enqueue=True, + backtrace=True, + diagnose=True, + ) + + return logger + + +log = Logger().log() diff --git a/python_backend/app/common/open_interpreter.py b/python_backend/app/common/open_interpreter.py new file mode 100644 index 0000000..40d9951 --- /dev/null +++ b/python_backend/app/common/open_interpreter.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from interpreter.core.core import OpenInterpreter as _OpenInterpreter +from app.core.conf import settings + +class OpenInterpreter(_OpenInterpreter): + def __init__(self): + super().__init__() + self.offline = True + self.auto_run = settings.INTERPRETER_AUTO_RUN + self.max_output = settings.INTERPRETER_MAX_OUTPUT + # LLM + self.llm.model = f'ollama_chat/{settings.OLLAMA_MODEL}' + self.llm.api_base = settings.INTERPRETER_API_BASE + self.llm.temperature = settings.INTERPRETER_TEMPERATURE + self.llm.max_tokens = settings.INTERPRETER_MAX_TOKENS + self.llm.max_budget = settings.INTERPRETER_MAX_BUDGET + self.llm.context_window = settings.INTERPRETER_CONTEXT_WINDOW + + +open_interpreter = OpenInterpreter() diff --git a/python_backend/app/common/response.py b/python_backend/app/common/response.py new file mode 100644 index 0000000..1247641 --- /dev/null +++ b/python_backend/app/common/response.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +from typing import Any +from pydantic import BaseModel + +class ResponseModel(BaseModel): + code: int = 200 + msg: str = 'OK' + data: Any = None + \ No newline at end of file diff --git a/python_backend/app/core/conf.py b/python_backend/app/core/conf.py new file mode 100644 index 0000000..952d21d --- /dev/null +++ b/python_backend/app/core/conf.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +from functools import lru_cache + +from pydantic_settings import BaseSettings, SettingsConfigDict + + +class Settings(BaseSettings): + model_config = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8') + + # FastAPI设置 + API_V1_STR: str = '/api/v1' + TITLE: str = 'FastAPI' + VERSION: str = '0.0.1' + DESCRIPTION: str = 'FastAPI ChatGPT API' + DOCS_URL: str | None = f'{API_V1_STR}/docs' + REDOCS_URL: str | None = f'{API_V1_STR}/redocs' + OPENAPI_URL: str | None = f'{API_V1_STR}/openapi' + + # Uvicorn设置 + UVICORN_HOST: str = '127.0.0.1' + UVICORN_PORT: int = 8000 + UVICORN_RELOAD: bool = True + + # ollama设置 + OLLAMA_MODEL: str = 'gemma:2b' + + # Interpreter设置 + INTERPRETER_AUTO_RUN: bool = False + INTERPRETER_MAX_OUTPUT: int = 2200 + INTERPRETER_API_BASE: str = 'http://localhost:11434' # ollama serve地址 + INTERPRETER_TEMPERATURE: int | float = 0 + INTERPRETER_MAX_TOKENS: int | None = 100 + INTERPRETER_MAX_BUDGET: int | float | None = None + INTERPRETER_CONTEXT_WINDOW: int = 3000 + + +@lru_cache +def get_settings(): + return Settings() + + +settings = get_settings() diff --git a/python_backend/app/core/path_conf.py b/python_backend/app/core/path_conf.py new file mode 100644 index 0000000..59f5042 --- /dev/null +++ b/python_backend/app/core/path_conf.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +import os + +from pathlib import Path + +BasePath = Path(__file__).resolve().parent.parent.parent + +# 日志文件路径 +LogPath = os.path.join(BasePath, 'app', 'log') diff --git a/python_backend/app/main.py b/python_backend/app/main.py new file mode 100644 index 0000000..7e2c619 --- /dev/null +++ b/python_backend/app/main.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +import uvicorn +from fastapi import FastAPI, Request +from starlette.responses import JSONResponse +from app.api.routers import v1 +from app.common.log import log +from app.common.response import ResponseModel +from app.core.conf import settings + +app = FastAPI( + title=settings.TITLE, + version=settings.VERSION, + description=settings.DESCRIPTION, + docs_url=settings.DOCS_URL, + redoc_url=settings.REDOCS_URL, + openapi_url=settings.OPENAPI_URL, +) + + +app.include_router(v1) + + +@app.exception_handler(Exception) +async def openai_auth_exception_handler(request: Request, exc: Exception): + import traceback + + log.error(f'❌: {traceback.format_exc()}') + return JSONResponse( + status_code=500, + content=ResponseModel(code=500, msg=str(exc)).model_dump(), + ) + + +if __name__ == '__main__': + try: + log.info( + """\n + /$$$$$$$$ /$$ /$$$$$$ /$$$$$$$ /$$$$$$ +| $$_____/ | $$ /$$__ $$| $$__ $$|_ $$_/ +| $$ /$$$$$$ /$$$$$$$ /$$$$$$ | $$ | $$| $$ | $$ | $$ +| $$$$$|____ $$ /$$_____/|_ $$_/ | $$$$$$$$| $$$$$$$/ | $$ +| $$__/ /$$$$$$$| $$$$$$ | $$ | $$__ $$| $$____/ | $$ +| $$ /$$__ $$ |____ $$ | $$ /$$| $$ | $$| $$ | $$ +| $$ | $$$$$$$ /$$$$$$$/ | $$$$/| $$ | $$| $$ /$$$$$$ +|__/ |_______/|_______/ |___/ |__/ |__/|__/ |______/ + + """ + ) + uvicorn.run( + app='main:app', + host=settings.UVICORN_HOST, + port=settings.UVICORN_PORT, + reload=settings.UVICORN_RELOAD, + ) + except Exception as e: + log.error(f'❌ FastAPI start filed: {e}') + \ No newline at end of file diff --git a/python_backend/app/requirements.txt b/python_backend/app/requirements.txt new file mode 100644 index 0000000..67572ed --- /dev/null +++ b/python_backend/app/requirements.txt @@ -0,0 +1,67 @@ +# 核心依赖 +fastapi==0.110.0 +uvicorn==0.27.1 +pydantic==2.4.2 +pydantic-settings==2.2.1 +python-dotenv==1.0.0 +python-multipart==0.0.9 + +# Ollama 和 AI 相关 +ollama==0.1.6 +open-interpreter==0.2.0 +litellm==1.27.4 +openai==1.12.0 +tiktoken==0.4.0 +tokenizers==0.14.1 +tokentrim==0.1.13 +huggingface-hub==0.17.3 + +# HTTP 和网络 +httpx==0.25.2 +httpcore==1.0.4 +aiohttp==3.8.6 +aiosignal==1.3.1 +frozenlist==1.4.0 +multidict==6.0.4 +yarl==1.9.2 +requests==2.31.0 +urllib3==1.26.18 +certifi==2023.7.22 +idna==3.4 +charset-normalizer==3.3.2 + +# 异步和并发 +anyio==3.7.1 +async-timeout==4.0.3 +sniffio==1.3.0 + +# 日志和调试 +loguru==0.7.2 +rich==13.6.0 +pygments==2.16.1 +markdown-it-py==3.0.0 +mdurl==0.1.2 + +# 数据处理 +numpy==1.26.4 +regex==2023.10.3 +tqdm==4.66.1 +packaging==23.2 +six==1.16.0 + +# 系统工具 +psutil==5.9.6 +platformdirs==3.11.0 +appdirs==1.4.4 +distro==1.9.0 +filelock==3.13.1 +fsspec==2023.10.0 + +# 配置和工具 +click==8.1.7 +jinja2==3.1.2 +markupsafe==2.1.3 +pyyaml==6.0.1 +toml==0.10.2 +python-editor==1.0.4 +wcwidth==0.2.9 diff --git a/python_backend/app/schemas/interpreter.py b/python_backend/app/schemas/interpreter.py new file mode 100644 index 0000000..0c3dc65 --- /dev/null +++ b/python_backend/app/schemas/interpreter.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +from pydantic import BaseModel + + +class InterpreterMessage(BaseModel): + message: str + \ No newline at end of file diff --git a/python_backend/app/schemas/ollama.py b/python_backend/app/schemas/ollama.py new file mode 100644 index 0000000..54d5844 --- /dev/null +++ b/python_backend/app/schemas/ollama.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +from typing import Literal + +from pydantic import BaseModel + + +class OllamaMessages(BaseModel): + role: Literal['system', 'user', 'assistant'] + content: str + images: list[str] | None = None diff --git a/python_backend/config/config.py b/python_backend/config/config.py new file mode 100644 index 0000000..3bb781e --- /dev/null +++ b/python_backend/config/config.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +#文心模型类型 +API_TYPE = "aistudio" +#文心模型token 地址地址https://aistudio.baidu.com/index/accessToken +ACCESS_TOKEN = "文心一言token" +# 网页的端口, -1代表随机端口 +WEB_PORT = 8099 +# 文心一言模型选择是 +LLM_MODEL = "ernie-3.5" diff --git a/python_backend/config/config_private.py b/python_backend/config/config_private.py new file mode 100644 index 0000000..a93de71 --- /dev/null +++ b/python_backend/config/config_private.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +#文心模型类型 +API_TYPE = "aistudio" +#文心模型token 申请地址https://aistudio.baidu.com/index/accessToken +ACCESS_TOKEN = "文心一言token" +# 网页的端口, -1代表随机端口 +WEB_PORT = 8099 +# 文心一言模型选择是 +LLM_MODEL = "ernie-3.5" diff --git a/python_backend/content.txt b/python_backend/content.txt new file mode 100644 index 0000000..ea5705a --- /dev/null +++ b/python_backend/content.txt @@ -0,0 +1 @@ +文生图测试内容 - ChattyPlay \ No newline at end of file diff --git a/python_backend/main.py b/python_backend/main.py new file mode 100644 index 0000000..08eb369 --- /dev/null +++ b/python_backend/main.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +import erniebot +from tools.config_tool import get_conf +from tools.read_file import read +from tools.stable_api import txt2img +from tools.generate_video import image_to_video_mp4 + + +def str_to_jsonstr(data: str): + """ + 过滤字符串 + :param data: + :return: + """ + start_index = data.find("```json") + end_index = data.rfind("```") + del_json = data[start_index+8:end_index] + return del_json + + +def main(): + print('------------------文章生成图片提示词-------------------') + API_TYPE, ACCESS_TOKEN, WEB_PORT, LLM_MODEL = get_conf('API_TYPE', 'ACCESS_TOKEN', 'WEB_PORT', 'LLM_MODEL') + erniebot.api_type = API_TYPE + erniebot.access_token = ACCESS_TOKEN + prefix_prompt = "你是一个提示词专家,你的任务是辅助我生成优质的文生图提示词,要求:1.文章按照句号分隔;2.每句话生成一个文生图提示词;3.输出json格式数据,内容标签content,提示词标签prompt。内容如下:" + content = read('python_backend/content.txt') + stream = False + response = erniebot.ChatCompletion.create( + model='ernie-4.0', + messages=[{'role': 'user', 'content': prefix_prompt + content}], + stream=stream) + + result = "" + if stream: + for resp in response: + result += resp.get_result() + else: + result = response.get_result() + print(result) + dict_data = eval(str_to_jsonstr(result)) + print('------------------文生图片-------------------') + i = 1 + for prompt_item in dict_data: + txt2img(prompt=prompt_item['prompt'], image_name=str(i)+'.png') + i = i+1 + print('第'+str(i)+'张图') + print('------------------生成视频开始-------------------') + image_to_video_mp4(output='result.mp4',height=768,width=1024) + print('------------------生成视频成功-------------------') + + +if __name__ == "__main__": + main() diff --git a/python_backend/requirements.txt b/python_backend/requirements.txt new file mode 100644 index 0000000..3aeb88f --- /dev/null +++ b/python_backend/requirements.txt @@ -0,0 +1,6 @@ +docx2txt==0.8 +erniebot==0.5.0 +flask == 2.3.2 +gradio==3.28.0 +sentence_transformers==2.2.2 +Pillow==9.5.0 diff --git a/python_backend/tools/config_tool.py b/python_backend/tools/config_tool.py new file mode 100644 index 0000000..8b845ad --- /dev/null +++ b/python_backend/tools/config_tool.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +import importlib +from functools import lru_cache +import sys +import os +import socket +from contextlib import closing +@lru_cache(maxsize=128) +def read_single_conf_lru_cache(arg): + """ + 获取读取 + """ + # 根目录 + project_dir = os.path.dirname(sys.argv[0]) + sys.path.append(project_dir+'/config') + try: r = getattr(importlib.import_module('config_private'), arg) + except: r = getattr(importlib.import_module('config'), arg) + return r + + +def get_conf(*args): + """ + 获取配置 + """ + # 建议您复制一个config_private.py放自己的秘密, 如token, 避免不小心传github被别人看到 + res = [] + for arg in args: + r = read_single_conf_lru_cache(arg) + res.append(r) + return res +def get_free_port(): + """ + 返回当前系统中可用的未使用端口。 + """ + with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s: + s.bind(('', 0)) + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + return s.getsockname()[1] + \ No newline at end of file diff --git a/python_backend/tools/generate_video.py b/python_backend/tools/generate_video.py new file mode 100644 index 0000000..744c5c1 --- /dev/null +++ b/python_backend/tools/generate_video.py @@ -0,0 +1,217 @@ +# -*- coding: utf-8 -*- +import cv2 as cv +from PIL import Image +import numpy as np +import os +import math +project_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +path_img = project_dir+'/output/image/' +path_video = project_dir+'/output/video/' +path_video_avi = project_dir+'/output/video/test.avi' +video_name = 'test.mp4' + + +def image_to_video_mp4(file_path=path_img, output=video_name, height=512, width=512, fps=60,effects=True): + print('file_path:'+file_path) + # 生成图片目录下以图片名字为内容的列表 + img_list = os.listdir(file_path) + # 用于mp4格式的生成 + fourcc = cv.VideoWriter_fourcc(*'mp4v') + # 创建一个写入视频对象 + videowriter = cv.VideoWriter(path_video+output, fourcc, fps, (width, height)) + for img in img_list: + path = file_path + img + if len(img) < 4: + continue + if effects: + for i in range(fps + 1): + frame = pillow_to_cv(image_crop(path, height, width, i)) + # 特效 + if i > 52: + if i % 2 == 0:#光照 + frame = illumination_image(frame) + else:#流年 + frame = flow_image(frame) + videowriter.write(frame) + else: + frame = cv.imread(path) + for i in range(fps+1): + videowriter.write(frame) + + videowriter.release() + + +def image_resize(image_path, height, width): + image = Image.open(image_path) + new_size = (width, height) + return image.resize(new_size) + + +def image_crop(image_path, height, width, step): + image = Image.open(image_path) + height_n = image.height + width_n = image.width + s_height = height_n/800 + s_width = width_n/800 + new_size = (s_width*step, s_height*step, width_n-s_width*step, height_n-s_height*step) + crop_image = image.crop(new_size) + return crop_image.resize((width, height)) + + +def pillow_to_cv(image_pil): + return cv.cvtColor(np.asarray(image_pil),cv.COLOR_RGB2BGR) + + +def cv_to_pillow(image_cv): + return Image.fromarray(cv.cvtColor(image_cv,cv.COLOR_BGR2RGB)) + + +def image_to_video_avi(file_path=path_img, output=path_video_avi, height=512, width=512, fps=60): + # 生成图片目录下以图片名字为内容的列表 + img_list = os.listdir(file_path) + # avi格式的生成 + fourcc = cv.VideoWriter_fourcc('M', 'J', 'P', 'G') + # 创建一个写入视频对象 + videowriter = cv.VideoWriter(output, fourcc, fps, (width, height)) + for img in img_list: + path = file_path + img + if len(img) < 4: + continue + for i in range(501): + frame = pillow_to_cv(image_crop(path,height,width,i)) + videowriter.write(frame) + videowriter.release() + +def illumination_image(img): + """ + 光照特效 img = cv.imread + :return: + """ + # 获取图像行和列 + rows, cols = img.shape[:2] + # 设置中心点和光照半径 + centerX = rows / 2 - 20 + centerY = cols / 2 + 20 + radius = min(centerX, centerY) + # 设置光照强度 + strength = 100 + # 新建目标图像 + dst = np.zeros((rows, cols, 3), dtype="uint8") + # 图像光照特效 + for i in range(rows): + for j in range(cols): + # 计算当前点到光照中心距离(平面坐标系中两点之间的距离) + distance = math.pow((centerY - j), 2) + math.pow((centerX - i), 2) + # 获取原始图像 + B = img[i, j][0] + G = img[i, j][1] + R = img[i, j][2] + if (distance < radius * radius): + # 按照距离大小计算增强的光照值 + result = (int)(strength * (1.0 - math.sqrt(distance) / radius)) + B = img[i, j][0] + result + G = img[i, j][1] + result + R = img[i, j][2] + result + # 判断边界 防止越界 + B = min(255, max(0, B)) + G = min(255, max(0, G)) + R = min(255, max(0, R)) + dst[i, j] = np.uint8((B, G, R)) + else: + dst[i, j] = np.uint8((B, G, R)) + + return dst + + +def flow_image(img): + """ + 流年特效 + :param img: img = cv.imread + :return: + """ + # 获取图像行和列 + rows, cols = img.shape[:2] + # 新建目标图像 + dst = np.zeros((rows, cols, 3), dtype="uint8") + # 图像流年特效 + for i in range(rows): + for j in range(cols): + # B通道的数值开平方乘以参数12 + B = math.sqrt(img[i, j][0]) * 12 + G = img[i, j][1] + R = img[i, j][2] + if B > 255: + B = 255 + dst[i, j] = np.uint8((B, G, R)) + return dst + + +def filter_image(img): + """ + 图像滤镜 + :param img: img = cv.imread + :return: + """ + # 获取滤镜颜色 + def getBGR(image_bgr, table, i, j): + # 获取图像颜色 + b, g, r = image_bgr[i][j] + # 计算标准颜色表中颜色的位置坐标 + x = int(g / 4 + int(b / 32) * 63) + y = int(r / 4 + int((b % 32) / 4) * 63) + # 返回滤镜颜色表中对应的颜色 + return lj_map[x][y] + # 滤镜图像 + lj_map = img + # 获取图像行和列 + rows, cols = img.shape[:2] + # 新建目标图像 + dst = np.zeros((rows, cols, 3), dtype="uint8") + # 循环设置滤镜颜色 + for i in range(rows): + for j in range(cols): + dst[i][j] = getBGR(img, lj_map, i, j) + return dst + + +def nostalgia_image(img): + """ + :param img: + :return: + """ + # 获取图像行和列 + rows, cols = img.shape[:2] + # 新建目标图像 + dst = np.zeros((rows, cols, 3), dtype="uint8") + # 图像怀旧特效 + for i in range(rows): + for j in range(cols): + B = 0.272 * img[i, j][2] + 0.534 * img[i, j][1] + 0.131 * img[i, j][0] + G = 0.349 * img[i, j][2] + 0.686 * img[i, j][1] + 0.168 * img[i, j][0] + R = 0.393 * img[i, j][2] + 0.769 * img[i, j][1] + 0.189 * img[i, j][0] + if B > 255: + B = 255 + if G > 255: + G = 255 + if R > 255: + R = 255 + dst[i, j] = np.uint8((B, G, R)) + + return dst + + +def sketch_image(img): + """ + 素描特效 + :param img: + :return: + """ + # 图像灰度处理 + gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) + # 高斯滤波降噪 + gaussian = cv.GaussianBlur(gray, (5, 5), 0) + # Canny算子 + canny = cv.Canny(gaussian, 50, 150) + # 阈值化处理 + ret, result = cv.threshold(canny, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU) + return result diff --git a/python_backend/tools/image_effect.py b/python_backend/tools/image_effect.py new file mode 100644 index 0000000..bd59d06 --- /dev/null +++ b/python_backend/tools/image_effect.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +from PIL import Image, ImageSequence, ImageEnhance + + +def add_fade_effect(image_path, duration=1): + """ + 给图片添加淡入淡出动画效果。 + :param image_path: 图片文件路径。 + :param duration: 每帧持续时间(秒)。 + """ + image = Image.open(image_path) + width, height = image.size + + # 生成淡入淡出的渐变掩码 + def fade_mask(t): + return int(255 * (1 - min(1, t / (duration / 2)))) + + frames = [] + for i in range(int(duration * 60) // 2): # 每秒60帧 + # 生成淡入渐变 + fade_in = Image.new('RGBA', (width, height), (0, 0, 0, fade_mask(i))) + frames.append(Image.composite(Image.blend, image, fade_in)) + + # 生成淡出渐变 + fade_out = Image.new('RGBA', (width, height), (0, 0, 0, 255 - fade_mask(i + duration * 60 // 2))) + frames.append(Image.composite(Image.blend, image, fade_out)) + + # 保存为GIF动画 + frames[0].save('fade_effect.gif', save_all=True, append_images=frames[1:], duration=duration, loop=0) + + +# 使用例子 +add_fade_effect('1.png', duration=1) # 图片路径,持续时间为1秒的淡入淡出动画 diff --git a/python_backend/tools/read_file.py b/python_backend/tools/read_file.py new file mode 100644 index 0000000..d0c92d4 --- /dev/null +++ b/python_backend/tools/read_file.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +def read(file_path): + """ + 读文件 + """ + f = open(file_path, "r", encoding='utf-8') + lines = f.readlines() # 读取全部内容 + return ''.join(lines) + diff --git a/python_backend/tools/stable_api.py b/python_backend/tools/stable_api.py new file mode 100644 index 0000000..c3ef9be --- /dev/null +++ b/python_backend/tools/stable_api.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +# api文档 http://127.0.0.1:7860/docs +# 第三方api调用库 https://github.com/mix1009/sdwebuiapi +import requests +import base64 +import os +# 文生图片api +url = "http://127.0.0.1:7860" +project_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +path_img = project_dir+'/output/image/' +path_image = project_dir+'/output/locimg/' + + +def txt2img(prompt='puppy dog',image_name='test.png'): + payload = { + "prompt": prompt, + "steps": 20, + "width": 1024, + "height": 768, + "sampler_index": "Euler a", + "override_settings": { + "sd_model_checkpoint": "novelV1"} + } + # 发送请求 + response = requests.post(url=f'{url}/sdapi/v1/txt2img', json=payload) + print('--------') + print(response) + r = response.json() + # 保存图片 + check_and_create_path(path_img) + with open(path_img+image_name, 'wb') as f: + f.write(base64.b64decode(r['images'][0])) + + +def txt2img_imgname(prompt='puppy dog', negative_prompt='', sampler='DPM++ 3M SDE Karras', image_name='test.png', img_path='1/'): + payload = { + "prompt": prompt, + "negative_prompt": negative_prompt, + "steps": 35, + "width": 1024, + "height": 768, + "sampler_index": sampler, + "override_settings": { + "sd_model_checkpoint": "tianyuan"} + } + # 发送请求 + response = requests.post(url=f'{url}/sdapi/v1/txt2img', json=payload) + print('--------') + print(response) + r = response.json() + # 保存图片 + check_and_create_path(path_image+img_path) + with open(path_image+img_path+image_name, 'wb') as f: + f.write(base64.b64decode(r['images'][0])) + + +def check_and_create_path(path): + # 检查路径是否存在 + if not os.path.exists(path): + # 如果路径不存在,则创建 + try: + os.makedirs(path) + except OSError as e: + # 如果创建过程中出现错误(例如目录已存在),则打印错误信息并跳过 + print(f"Error: {e}") + else: + print(f"Path '{path}' exists.") diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..08b317e --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,258 @@ +import React, { useState, useEffect } from 'react' +import { BrowserRouter as Router, Routes, Route, useLocation, useNavigate } from 'react-router-dom' +import { GoogleOAuthProvider } from '@react-oauth/google' +import { isAuthenticated } from './utils/token' +import { ConfigProvider, Spin } from 'antd' +import zhCN from 'antd/locale/zh_CN' +import NProgress from 'nprogress' +import Home from './pages/Home' +import Login from './pages/Login' +import GPT from './pages/GPT' +import Video from './pages/Video' +import Music from './pages/Music' +import Cartoon from './pages/Cartoon' +import CartoonDetail from './pages/CartoonDetail' +import CartoonChapter from './pages/CartoonChapter' +import Gold from './pages/Gold' +import Trans from './pages/Trans' +import TextToPhoto from './pages/TextToPhoto' +import Help from './pages/Help' +import About from './pages/About' +import PaperListPage from './pages/PaperListPage' +import NotFound from './pages/NotFound' +import Navbar from './components/Navbar' +import Footer from './components/Footer' +import ClickEffect from './components/ClickEffect' +import Live2DDashboard from './components/Live2DDashboard' +import VersionUpdateModal from './components/VersionUpdateModal' +import WechatSupport from './components/WechatSupport' +import { GoofishLayout } from './components/goofish' +import Dashboard from './pages/goofish/Dashboard' +import Accounts from './pages/goofish/Accounts' +import { Conversations } from './pages/goofish/Conversations' +import Orders from './pages/goofish/Orders' +import AutoReply from './pages/goofish/AutoReply' +import AutoSell from './pages/goofish/AutoSell' +import Workflow from './pages/goofish/Workflow' +import Logs from './pages/goofish/Logs' +import Goods from './pages/goofish/Goods' +import { scrollToTop } from './utils/backTop' +import { isMobileDevice } from './utils/isMobile' +import WorkerAgent from './pages/WorkerAgent' +import Markmap from './pages/Markmap' +import Latex from './pages/Latex' +import Markdown from './pages/Markdown' + +// 公开路由 +const publicRoutes = ['/'] + +// 移动端限制监工路由 +const workerAgentRoutes = ['/worker'] + +// 配置 NProgress +NProgress.configure({ + minimum: 0.1, + easing: 'ease', + speed: 300, + showSpinner: true, + trickleSpeed: 200, + parent: 'body' +}) + +const AppContent: React.FC = () => { + const location = useLocation() + const navigate = useNavigate() + const [loading, setLoading] = useState(true) + + // 判断是否是首页 + const isHomePage = location.pathname === '/home' + + // 路由守卫:检查是否登录 + useEffect(() => { + // 如果是移动端、生产环境下访问监工路由且已登录,重定向到首页 + if (process.env.NODE_ENV === 'production' && workerAgentRoutes.includes(location.pathname) && isMobileDevice() && isAuthenticated()) { + navigate('/home', { replace: true }) + return + } + // 如果是移动端、生产环境下访问监工路由且未登录,重定向到登录页 + if (process.env.NODE_ENV === 'production' && workerAgentRoutes.includes(location.pathname) && isMobileDevice() && !isAuthenticated()) { + navigate('/', { replace: true }) + return + } + // 如果已登录且在登录页,跳转到首页 + if (publicRoutes.includes(location.pathname) && isAuthenticated()) { + navigate('/home', { replace: true }) + return + } + // 如果不是公开路由且未登录,则跳转到登录页 + if (!publicRoutes.includes(location.pathname) && !isAuthenticated()) { + navigate('/', { replace: true }) + } + }, [location.pathname, navigate]) + + // 初始化加载 + useEffect(() => { + const timer = setTimeout(() => { + setLoading(false) + }, 800) + + return () => clearTimeout(timer) + }, []) + + // 路由变化时显示进度条 + useEffect(() => { + NProgress.start() + + // 使用 requestAnimationFrame 确保进度条能正确显示 + const frame = requestAnimationFrame(() => { + NProgress.set(0.4) + }) + + const timer = setTimeout(() => { + NProgress.done() + scrollToTop() + }, 500) + + return () => { + cancelAnimationFrame(frame) + clearTimeout(timer) + NProgress.done() + } + }, [location.pathname]) + + // 检查是否是登录页面 + const isLoginPage = location.pathname === '/' + + if (loading) { + return ( +
+ {/* 背景动画效果 */} +
+ +
+ +
+ 加载中... +
+
+ +
+ ) + } + + // 登录页面不显示 Header 和 Footer + if (isLoginPage) { + return ( +
+ + } /> + +
+ ) + } + + return ( +
+ + +
+ + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + {/* Goofish 闲鱼管理模块 */} + }> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + } /> + +
+ {!isLoginPage && !location.pathname.includes('/goofish') &&
} + {/* 只在 /home 路由下渲染看板娘 */} + {isHomePage && } + {isAuthenticated() && !isMobileDevice() && !isHomePage && location.pathname !== '/about' && } +
+ ) +} + +const App: React.FC = () => { + const googleClientId = import.meta.env.VITE_GOOGLE_CLIENT_ID || '' + + return ( + + + + + + + + + ) +} + +export default App diff --git a/src/App.vue b/src/App.vue deleted file mode 100644 index 4bdc749..0000000 --- a/src/App.vue +++ /dev/null @@ -1,105 +0,0 @@ - - - - - diff --git a/src/api/request.js b/src/api/request.js deleted file mode 100644 index 02846a7..0000000 --- a/src/api/request.js +++ /dev/null @@ -1,146 +0,0 @@ -// 封装视频解析接口 -export const getData = () => { - layui.use(['element', 'form', 'layer'], function() { - var element = layui.element, - $ = layui.jquery, - form = layui.form, - upload = layui.upload, - layer = layui.layer; - - var data = [ - { - name: "万能接口(推荐)", - url: "http://www.sfsft.com/admin.php?url=" - }, - { - name: "优酷接口", - url: "http://api.baiyug.cn/vip/index.php?url=" - }, - { - name: "百域阁", - url: "http://api.baiyug.cn/vip/index.php?url=" - }, - { - name: "爱奇艺", - url: "http://aikan-tv.com/?url=" - }, - { - name: "万能接口1", - url: "http://jqaaa.com/jx.php?url=" - }, - { - name: "万能接口2", - url: "http://y.mt2t.com/lines?url=" - }, - { - name: "万能接口3", - url: "http://jiexi.071811.cc/jx2.php?url=" - }, - { - name: "万能接口4", - url: "http://www.662820.com/xnflv/index.php?url=" - }, - { - name: "万能接口5", - url: "http://api.91exp.com/svip/?url=" - }, - { - name: "万能接口6", - url: "http://player.jidiaose.com/supapi/iframe.php?v=" - }, - { - name: "腾讯视频接口", - url: "http://www.82190555.com/index/qqvod.php?url=" - }, - { - name: "爱奇艺超清接口1", - url: "http://api.pucms.com/?url=" - }, - { - name: "爱奇艺超清接口2", - url: "http://api.baiyug.cn/vip/index.php?url=" - }, - { - name: "爱奇艺超清接口3", - url: "https://api.flvsp.com/?url=" - }, - { - name: "芒果TV超清接口", - url: "http://api.xfsub.com/index.php?url=" - }, - { - name: "芒果TV手机接口", - url: "http://65yw.2m.vc/chaojikan.php?url=" - }, - { - name: "优酷超清接口", - url: "http://www.82190555.com/index/qqvod.php?url=" - }, - { - name: "搜狐视频接口", - url: "http://vip.jlsprh.com/index.php?url=" - }, - { - name: "乐视视频接口", - url: "http://2gty.com/apiurl/yun.php?url=" - }, - ]; - - for (let i in data) { - var $option = $(""); - $("#api").append($option); - } - form.render() - $('.play').click(function() { - var url = $('.url').val(); - var api = $('#api').val(); - if (url == '' || url == null) { - layer.open({ - type: 0, - icon: 0, - time: 2000, - title: "错误信息", - offset: '150px', - content: "请输入解析地址!" - }); - } else if (url.indexOf('http')) { - layer.open({ - type: 0, - icon: 0, - time: 2000, - title: "错误信息", - offset: '150px', - content: "请输入正确的网址!" - }); - } else if(api == '' || api == null) { - layer.open({ - type: 0, - icon: 0, - time: 2000, - title: "错误信息", - offset: '150px', - content: "请选择解析接口!" - }); - } else { - layer.open({ - type: 2, - title: "播放界面", - content: [api + url, 'no'], - area: ['1060px', '640px'], - maxmin: true, - closeBtn: 1, - success: function(layero, index) { - $('iframe').attr('allowfullscreen','true'); - } - }); - } - - }); - $('.url').on('click',function() { - layer.tips('如果视频无法正常播放,请切换解析地址!', 'input', { - tips: [3, '#393D49'], - time: 4000 - }); - }) - }); -} diff --git a/src/assets/css/ai.scss b/src/assets/css/ai.scss new file mode 100644 index 0000000..f824edb --- /dev/null +++ b/src/assets/css/ai.scss @@ -0,0 +1,391 @@ +.markdown-content { + line-height: 1.7; + color: #334155; + + // 标题样式 + h1, h2, h3, h4, h5, h6 { + margin: 16px 0 8px; + font-weight: 600; + line-height: 1.4; + color: #1e293b; + + &:first-child { + margin-top: 0; + } + } + + h1 { font-size: 1.8rem; border-bottom: 2px solid #e2e8f0; padding-bottom: 8px; } + h2 { font-size: 1.5rem; border-bottom: 1px solid #e2e8f0; padding-bottom: 6px; } + h3 { font-size: 1.25rem; } + h4 { font-size: 1.1rem; } + h5 { font-size: 1rem; } + h6 { font-size: 0.9rem; color: #64748b; } + + // 段落 + p { + margin: 8px 0; + + &:first-child { + margin-top: 0; + } + + &:last-child { + margin-bottom: 0; + } + } + + // 列表 + ul, ol { + margin: 8px 0; + padding-left: 24px; + } + + li { + margin: 4px 0; + } + + // 代码块容器 + .code-container { + margin: 12px 0; + border-radius: 8px; + overflow: hidden; + background: #1e293b; + box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1); + } + + .code-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 8px 16px; + background: #334155; + border-bottom: 1px solid #475569; + + .language-label { + font-size: 0.75rem; + font-weight: 600; + text-transform: uppercase; + color: #e2e8f0; + font-family: 'Fira Code', 'Consolas', monospace; + } + + .copy-btn { + display: flex; + align-items: center; + gap: 4px; + padding: 4px 12px; + background: #475569; + color: #e2e8f0; + border: none; + border-radius: 4px; + font-size: 0.75rem; + cursor: pointer; + transition: all 0.2s ease; + + &:hover { + background: #64748b; + transform: translateY(-1px); + } + + &:active { + transform: translateY(0); + } + + .copy-icon { + width: 14px; + height: 14px; + } + } + } + + pre { + margin: 0; + padding: 16px; + overflow-x: auto; + background: #1e293b; + + code { + font-family: 'Fira Code', 'Consolas', 'Monaco', monospace; + font-size: 0.9rem; + line-height: 1.6; + color: #e2e8f0; + background: transparent; + padding: 0; + } + } + + // 行内代码 + code:not(pre code) { + background: #f1f5f9; + padding: 2px 6px; + border-radius: 4px; + font-family: 'Fira Code', 'Consolas', monospace; + font-size: 0.9em; + color: #dc2626; + } + + // 引用块 + blockquote { + border-left: 4px solid #3b82f6; + padding-left: 16px; + margin: 12px 0; + color: #64748b; + font-style: italic; + background: #f8fafc; + padding: 12px 16px; + border-radius: 0 8px 8px 0; + } + + // 表格 + table { + border-collapse: collapse; + width: 100%; + margin: 12px 0; + overflow: hidden; + border-radius: 8px; + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1); + + th, td { + border: 1px solid #e2e8f0; + padding: 12px 16px; + text-align: left; + } + + th { + background: #f8fafc; + font-weight: 600; + color: #334155; + } + + tr:nth-child(even) { + background: #f8fafc; + } + + tr:hover { + background: #f1f5f9; + } + } + + // 链接 + a { + color: #3b82f6; + text-decoration: none; + border-bottom: 1px solid transparent; + transition: all 0.2s ease; + + &:hover { + border-bottom-color: #3b82f6; + } + } + + // 分隔线 + hr { + border: none; + border-top: 2px solid #e2e8f0; + margin: 16px 0; + } + + // 图片 + img { + max-width: 100%; + height: auto; + border-radius: 8px; + margin: 8px 0; + box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1); + } + + // 任务列表 + input[type="checkbox"] { + margin-right: 8px; + accent-color: #3b82f6; + } + + // 移动端优化 + @media (max-width: 768px) { + h1 { font-size: 1.4rem; } + h2 { font-size: 1.2rem; } + h3 { font-size: 1.1rem; } + + .code-header { + padding: 6px 12px; + + .language-label { + font-size: 0.65rem; + } + + .copy-btn { + padding: 3px 8px; + font-size: 0.65rem; + + .copy-icon { + width: 12px; + height: 12px; + } + } + } + + pre { + padding: 12px; + + code { + font-size: 0.8rem; + } + } + + table { + font-size: 0.85rem; + + th, td { + padding: 8px 12px; + } + } + + ul, ol { + padding-left: 20px; + } + } +} + +// 流式内容样式 +.streaming-content { + position: relative; + + .cursor-blink { + display: inline-block; + width: 2px; + height: 1.2em; + background: #3b82f6; + animation: blink 1s infinite; + vertical-align: text-bottom; + margin-left: 2px; + } +} + +@keyframes blink { + 0%, 50% { + opacity: 1; + } + 51%, 100% { + opacity: 0; + } +} + +// 消息动画 +@keyframes messageSlideIn { + from { + opacity: 0; + transform: translateY(10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.message-animate { + animation: messageSlideIn 0.3s ease-out; +} + +// 欢迎卡片动画 +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.welcome-animate { + animation: fadeIn 0.6s ease-out; +} + +// 脉冲动画 +@keyframes pulse { + 0%, 100% { + opacity: 1; + } + 50% { + opacity: 0.5; + } +} + +.pulse { + animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; +} + +// 滚动条样式 +.custom-scrollbar { + &::-webkit-scrollbar { + width: 8px; + height: 8px; + } + + &::-webkit-scrollbar-track { + background: #f1f5f9; + border-radius: 10px; + } + + &::-webkit-scrollbar-thumb { + background: linear-gradient(135deg, #3b82f6 0%, #6366f1 100%); + border-radius: 10px; + + &:hover { + background: linear-gradient(135deg, #2563eb 0%, #4f46e5 100%); + } + } + + // 移动端滚动条更细 + @media (max-width: 768px) { + &::-webkit-scrollbar { + width: 4px; + height: 4px; + } + } +} + +// 深色模式支持 +@media (prefers-color-scheme: dark) { + .markdown-content { + color: #cbd5e1; + + h1, h2, h3, h4, h5, h6 { + color: #f1f5f9; + } + + h1 { border-bottom-color: #475569; } + h2 { border-bottom-color: #475569; } + + code:not(pre code) { + background: #334155; + color: #fca5a5; + } + + blockquote { + background: #1e293b; + border-left-color: #60a5fa; + color: #94a3b8; + } + + table { + th, td { + border-color: #475569; + } + + th { + background: #1e293b; + color: #e2e8f0; + } + + tr:nth-child(even) { + background: #1e293b; + } + + tr:hover { + background: #334155; + } + } + } +} diff --git a/src/assets/css/global.css b/src/assets/css/global.css index f731982..257f84c 100644 --- a/src/assets/css/global.css +++ b/src/assets/css/global.css @@ -1,19 +1,269 @@ -/* 全局样式表 */ -html, -body, -#app { +* { margin: 0; padding: 0; - height: 100%; - min-width: 1366px; + box-sizing: border-box; } -.el-breadcrumb { - margin-bottom: 15px; - font-size: 12px; +body { + font-family: + -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", + "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + background-color: #f8fafc; + color: #334155; } -.el-card { - box-shadow: 0px 1px 1px rgba(0, 0, 0, .15)!important; - margin-bottom: 20px; -} \ No newline at end of file +code { + font-family: + source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; +} + +html { + scroll-behavior: smooth; +} + +#root { + min-height: 100vh; +} + +/* 响应式设计 */ +@media (max-width: 768px) { + html { + font-size: 14px; + } +} + +@media (max-width: 480px) { + html { + font-size: 12px; + } +} + +/* 动画效果 */ +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes slideIn { + from { + opacity: 0; + transform: translateX(-20px); + } + to { + opacity: 1; + transform: translateX(0); + } +} + +@keyframes pulse { + 0%, + 100% { + transform: scale(1); + } + 50% { + transform: scale(1.05); + } +} + +.fade-in { + animation: fadeIn 0.5s ease-out forwards; +} + +.slide-in { + animation: slideIn 0.3s ease-out forwards; +} + +.pulse { + animation: pulse 2s infinite; +} + +/* NProgress 样式优化 */ +#nprogress { + pointer-events: none; +} + +#nprogress .bar { + background: linear-gradient(90deg, #667eea 0%, #764ba2 100%) !important; + position: fixed; + z-index: 9999; + top: 0; + left: 0; + width: 100%; + height: 3px; + box-shadow: 0 0 10px rgba(102, 126, 234, 0.5); +} + +#nprogress .peg { + display: none; +} + +#nprogress .spinner { + display: block !important; + position: fixed; + z-index: 9999; + top: 15px; + right: 15px; +} + +#nprogress .spinner-icon { + width: 20px; + height: 20px; + border: 3px solid transparent; + border-top-color: #667eea !important; + border-left-color: #764ba2 !important; + border-radius: 50%; + animation: nprogress-spinner 400ms linear infinite; +} + +@keyframes nprogress-spinner { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} + +/* 页面过渡动画 */ +@keyframes pageTransition { + from { + opacity: 0; + transform: translateY(30px) scale(0.95); + } + to { + opacity: 1; + transform: translateY(0) scale(1); + } +} + +.page-transition { + animation: pageTransition 0.6s cubic-bezier(0.16, 1, 0.3, 1) forwards; +} + +/* 卡片悬停效果 */ +@keyframes cardHover { + 0% { + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05); + } + 100% { + box-shadow: 0 12px 40px rgba(102, 126, 234, 0.2); + } +} + +/* 波浪动画 */ +@keyframes wave { + 0% { + transform: translateX(0) translateZ(0) scaleY(1); + } + 50% { + transform: translateX(-25%) translateZ(0) scaleY(0.55); + } + 100% { + transform: translateX(-50%) translateZ(0) scaleY(1); + } +} + +/* 闪烁动画 */ +@keyframes shimmer { + 0% { + background-position: -1000px 0; + } + 100% { + background-position: 1000px 0; + } +} + +.shimmer { + animation: shimmer 2s infinite; + background: linear-gradient(to right, #f6f7f8 4%, #edeef1 25%, #f6f7f8 36%); + background-size: 1000px 100%; +} + +/* 浮动动画 */ +@keyframes float { + 0%, + 100% { + transform: translateY(0); + } + 50% { + transform: translateY(-10px); + } +} + +.float { + animation: float 3s ease-in-out infinite; +} + +/* 光晕效果 */ +.glow { + box-shadow: 0 0 20px rgba(102, 126, 234, 0.4); + transition: box-shadow 0.3s ease; +} + +.glow:hover { + box-shadow: 0 0 30px rgba(102, 126, 234, 0.6); +} + +/* 渐变文字 */ +.gradient-text { + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +/* 按钮点击效果 */ +.btn-click { + transition: all 0.2s ease; +} + +.btn-click:active { + transform: scale(0.95); +} + +/* Chrome, Safari, Edge */ +::-webkit-scrollbar { + display: none; + width: 0; + height: 0; + background: transparent; +} + +/* Firefox */ +* { + scrollbar-width: none; +} + +/* IE/Edge */ +* { + -ms-overflow-style: none; +} + +/* 平滑滚动 */ +* { + scroll-behavior: smooth; +} + +/* 禁用移动端点击高亮 */ +* { + -webkit-tap-highlight-color: transparent; +} + +/* 文本选择样式 */ +::selection { + background: rgba(102, 126, 234, 0.3); + color: #334155; +} + +::-moz-selection { + background: rgba(102, 126, 234, 0.3); + color: #334155; +} diff --git a/src/assets/css/gold.scss b/src/assets/css/gold.scss new file mode 100644 index 0000000..8102d68 --- /dev/null +++ b/src/assets/css/gold.scss @@ -0,0 +1,906 @@ +/* 终端容器 */ +.terminal-container { + display: flex; + flex-direction: column; + min-height: 100vh; + background: linear-gradient(180deg, #0d0d12 0%, #0a0a0f 100%); +} + +/* 顶部导航栏 */ +.top-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 12px 24px; + background: linear-gradient(90deg, #1a1a24 0%, #12121a 100%); + border-bottom: 1px solid #2a2a3a; +} + +@media (max-width: 768px) { + .top-header { + padding: 10px 16px; + } +} + +.header-left { + display: flex; + align-items: center; + gap: 24px; +} + +@media (max-width: 768px) { + .header-left { + gap: 12px; + } +} + +.logo { + display: flex; + align-items: center; + gap: 8px; +} + +.logo-symbol { + font-size: 24px; + font-weight: 700; + color: #fbbf24; + background: linear-gradient(135deg, #fcd34d, #f59e0b); + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.logo-text { + font-size: 14px; + font-weight: 600; + color: #888; + letter-spacing: 2px; +} + +.market-status { + display: flex; + align-items: center; + gap: 8px; + font-size: 12px; + color: #888; +} + +.status-dot { + width: 8px; + height: 8px; + background: #22c55e; + border-radius: 50%; + animation: pulse 2s infinite; +} + +@keyframes pulse { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.5; } +} + +.header-center { + font-size: 14px; + color: #888; + font-family: 'SF Mono', monospace; +} + +.current-time { + color: #fbbf24; +} + +.header-right { + display: flex; + align-items: center; + gap: 12px; +} + +.refresh-btn { + display: flex; + align-items: center; + justify-content: center; + width: 36px; + height: 36px; + background: rgba(251, 191, 36, 0.1); + border: 1px solid rgba(251, 191, 36, 0.3); + border-radius: 8px; + color: #fbbf24; + cursor: pointer; + transition: all 0.2s; +} + +.refresh-btn:hover { + background: rgba(251, 191, 36, 0.2); + transform: rotate(180deg); +} + +/* 主内容区域 */ +.main-content-new { + display: flex; + flex-direction: column; + gap: 16px; + padding: 16px 24px; + flex: 1; + min-height: 0; + overflow-y: auto; +} + +@media (max-width: 768px) { + .main-content-new { + padding: 12px 16px; + gap: 12px; + } +} + +/* 价格卡片行 */ +.price-cards-row { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 16px; +} + +@media (max-width: 768px) { + .price-cards-row { + grid-template-columns: 1fr; + gap: 12px; + } +} + +/* 新价格卡片样式 */ +.price-card-new { + display: flex; + align-items: flex-start; + gap: 16px; + background: linear-gradient(135deg, #1a1a24 0%, #14141c 100%); + border: 1px solid #2a2a3a; + border-radius: 12px; + padding: 20px; + transition: all 0.3s ease; +} + +.price-card-new:hover { + border-color: #fbbf24; + box-shadow: 0 0 20px rgba(251, 191, 36, 0.1); +} + +.price-card-new.domestic { + border-color: #3a2a2a; +} + +.price-card-new.domestic:hover { + border-color: #ef4444; + box-shadow: 0 0 20px rgba(239, 68, 68, 0.1); +} + +/* 移动端价格卡片适配 */ +@media (max-width: 768px) { + .price-card-new { + flex-wrap: wrap; + padding: 16px; + gap: 12px; + } + + .card-icon { + width: 40px; + height: 40px; + } + + .card-info { + flex: 1; + min-width: 0; + } + + .card-price { + font-size: 24px; + } + + .card-extra { + width: 100%; + padding-left: 0; + border-left: none; + border-top: 1px solid #2a2a3a; + padding-top: 12px; + flex-direction: row; + flex-wrap: wrap; + gap: 8px; + } + + .extra-item { + flex: 1 1 calc(50% - 4px); + min-width: 120px; + } +} + +.card-icon { + width: 48px; + height: 48px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 12px; + flex-shrink: 0; +} + +.card-icon.intl { + background: rgba(251, 191, 36, 0.15); + color: #fbbf24; +} + +.card-icon.cn { + background: rgba(239, 68, 68, 0.15); + color: #ef4444; +} + +.card-info { + flex: 1; +} + +.card-label { + font-size: 12px; + color: #888; + margin-bottom: 4px; + display: flex; + align-items: center; + gap: 8px; +} + +.card-label .badge { + font-size: 9px; + padding: 2px 6px; + background: rgba(251, 191, 36, 0.2); + color: #fbbf24; + border-radius: 4px; + font-weight: 600; +} + +.card-label .badge.cn { + background: rgba(239, 68, 68, 0.2); + color: #ef4444; +} + +.card-price { + font-size: 28px; + font-weight: 700; + font-family: 'SF Mono', monospace; + margin-bottom: 2px; +} + +.card-price.up { color: #22c55e; } +.card-price.down { color: #ef4444; } + +.card-change { + font-size: 13px; + font-family: 'SF Mono', monospace; +} + +.card-change.up { color: #22c55e; } +.card-change.down { color: #ef4444; } + +.card-extra { + display: flex; + flex-direction: column; + gap: 4px; + padding-left: 16px; + border-left: 1px solid #2a2a3a; +} + +.extra-item { + display: flex; + justify-content: space-between; + gap: 16px; + word-break: keep-all; + font-size: 11px; +} + +.extra-item span:first-child { color: #666; } +.extra-item span:last-child { color: #aaa; font-family: 'SF Mono', monospace; } +.extra-item .up { color: #22c55e; } +.extra-item .down { color: #ef4444; } + +/* 双图表区域 */ +.charts-row { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 16px; +} + +@media (max-width: 1200px) { + .charts-row { + grid-template-columns: 1fr; + } +} + +.chart-card { + background: linear-gradient(135deg, #1a1a24 0%, #14141c 100%); + border: 1px solid #2a2a3a; + border-radius: 12px; + overflow: hidden; +} + +.chart-card-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 16px 20px; + border-bottom: 1px solid #2a2a3a; +} + +.chart-card-title { + display: flex; + align-items: center; + gap: 10px; +} + +.chart-card-title h3 { + font-size: 14px; + font-weight: 600; + color: #fff; + margin: 0; +} + +.title-icon { + font-size: 10px; +} + +.title-icon.intl { color: #fbbf24; } +.title-icon.cn { color: #ef4444; } + +.chart-source { + font-size: 10px; + color: #555; + text-transform: uppercase; +} + +.period-selector { + display: flex; + gap: 4px; + background: #0a0a0f; + padding: 4px; + border-radius: 6px; +} + +.period-selector .period-btn { + padding: 4px 10px; + font-size: 11px; + font-weight: 500; + color: #666; + background: transparent; + border: none; + border-radius: 4px; + cursor: pointer; + transition: all 0.2s; +} + +.period-selector .period-btn:hover { + color: #fff; +} + +.period-selector .period-btn.active { + background: linear-gradient(135deg, #fbbf24, #f59e0b); + color: #000; +} + +.chart-area { + height: 280px; + padding: 12px; +} + +.chart-iframe-container { + height: 420px; + width: 100%; + overflow: hidden; + background: #0a0a0f; + position: relative; +} + +.charts-row.single-chart { + display: block; +} + +.chart-card.full-width { + width: 100%; + max-width: 100%; +} + +/* K线图区域样式 */ +.chart-section { + background: linear-gradient(135deg, #1a1a24 0%, #14141c 100%); + border-radius: 16px; + padding: 20px; + margin: 20px 0; + border: 1px solid rgba(251, 191, 36, 0.1); +} + +@media (max-width: 768px) { + .chart-section { + border-radius: 12px; + padding: 12px; + margin: 12px 0; + } +} + +.chart-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 16px; + flex-wrap: wrap; + gap: 12px; +} + +@media (max-width: 768px) { + .chart-header { + margin-bottom: 12px; + } + + .chart-header h3 { + font-size: 14px; + } + + .chart-source { + font-size: 10px; + } +} + +.chart-header h3 { + display: flex; + align-items: center; + gap: 8px; + color: #fbbf24; + font-size: 16px; + font-weight: 600; + margin: 0; +} + +.period-selector { + display: flex; + gap: 6px; +} + +.period-selector button { + padding: 6px 12px; + background: rgba(251, 191, 36, 0.1); + border: 1px solid rgba(251, 191, 36, 0.2); + border-radius: 6px; + color: #fbbf24; + font-size: 13px; + cursor: pointer; + transition: all 0.3s ease; +} + +.period-selector button:hover { + background: rgba(251, 191, 36, 0.2); + border-color: rgba(251, 191, 36, 0.4); +} + +.period-selector button.active { + background: #fbbf24; + color: #000; + border-color: #fbbf24; +} + +.chart-container { + background: #0a0a0f; + border-radius: 10px; + padding: 12px; + border: 1px solid rgba(251, 191, 36, 0.1); + overflow: hidden; +} + +.chart-canvas { + width: 100%; + height: 450px; + min-height: 300px; +} + +/* TradingView容器 */ +.tradingview-container { + height: 450px; + padding: 0; +} + +@media (max-width: 768px) { + .tradingview-container { + height: 350px; + } +} + +.chart-iframe { + width: 100%; + height: 100%; + border: none; +} + +.chart-source { + color: #9ca3af; + font-size: 12px; +} + +/* 电脑端/手机端显示控制 */ +.desktop-only { + display: block !important; +} + +/* 手机端适配 */ +@media (max-width: 768px) { + .chart-section { + padding: 12px; + margin: 12px 0; + border-radius: 12px; + } +} + +/* 平板端适配 */ +@media (min-width: 769px) and (max-width: 1024px) { + .tradingview-container { + height: 380px; + } +} + +.chart-iframe { + width: 100%; + height: 100%; + border: none; +} + +/* Markdown样式 */ +.markdown-body h2 { + font-size: 18px; + font-weight: 700; + color: #fbbf24; + margin: 20px 0 12px 0; + padding-bottom: 8px; + border-bottom: 1px solid #3a3a4a; +} + +.markdown-body h3 { + font-size: 15px; + font-weight: 600; + color: #22c55e; + margin: 16px 0 10px 0; +} + +.markdown-body p { + margin: 8px 0; + color: #ccc; +} + +.markdown-body strong { + color: #fff; + font-weight: 600; +} + +.markdown-body ul, .markdown-body ol { + margin: 8px 0; + padding-left: 20px; +} + +.markdown-body li { + margin: 6px 0; + color: #bbb; +} + +.markdown-body li::marker { + color: #fbbf24; +} + +.markdown-body hr { + border: none; + border-top: 1px dashed #3a3a4a; + margin: 16px 0; +} + +.markdown-body code { + background: rgba(251, 191, 36, 0.1); + color: #fbbf24; + padding: 2px 6px; + border-radius: 4px; + font-size: 12px; +} + +.markdown-body blockquote { + border-left: 3px solid #fbbf24; + padding-left: 12px; + margin: 12px 0; + color: #999; + font-style: italic; +} + +/* 价格面板 */ +.price-panel { + display: flex; + flex-direction: column; + gap: 16px; +} + +.price-card { + background: linear-gradient(135deg, #1a1a24 0%, #14141c 100%); + border: 1px solid #2a2a3a; + border-radius: 12px; + padding: 16px; +} + +.price-card.domestic { + border-color: #3a2a1a; +} + +.card-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 12px; +} + +.card-symbol { + font-size: 16px; + font-weight: 700; + color: #fff; +} + +.card-badge { + font-size: 10px; + padding: 2px 8px; + background: rgba(251, 191, 36, 0.2); + color: #fbbf24; + border-radius: 4px; + font-weight: 600; +} + +.card-badge.cn { + background: rgba(239, 68, 68, 0.2); + color: #ef4444; +} + +.price-main { + margin-bottom: 8px; +} + +.price-value { + font-size: 32px; + font-weight: 700; + font-family: 'SF Mono', monospace; +} + +.price-value.up { + color: #22c55e; +} + +.price-value.down { + color: #ef4444; +} + +.price-change { + display: flex; + gap: 8px; + font-size: 14px; + font-family: 'SF Mono', monospace; + margin-bottom: 12px; +} + +.price-change.up { + color: #22c55e; +} + +.price-change.down { + color: #ef4444; +} + +.price-details { + border-top: 1px solid #2a2a3a; + padding-top: 12px; +} + +.detail-row { + display: flex; + justify-content: space-between; + font-size: 12px; + padding: 4px 0; + color: #888; +} + +.detail-row span:last-child { + color: #ccc; + font-family: 'SF Mono', monospace; +} + +.detail-row .up { + color: #22c55e; +} + +.detail-row .down { + color: #ef4444; +} + +.price-source { + margin-top: 12px; + font-size: 10px; + color: #555; + text-transform: uppercase; +} + +/* 图表区域 */ +.chart-section { + background: linear-gradient(135deg, #1a1a24 0%, #14141c 100%); + border: 1px solid #2a2a3a; + border-radius: 12px; + display: flex; + flex-direction: column; + overflow: hidden; +} + +.chart-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 16px; + border-bottom: 1px solid #2a2a3a; +} + +.chart-title h2 { + font-size: 16px; + font-weight: 600; + color: #fff; + margin: 0; +} + +.chart-subtitle { + font-size: 12px; + color: #666; +} + +.chart-controls { + display: flex; + gap: 12px; +} + +.period-tabs { + display: flex; + gap: 4px; + background: #0a0a0f; + padding: 4px; + border-radius: 8px; +} + +.period-btn { + padding: 6px 12px; + font-size: 12px; + font-weight: 500; + color: #888; + background: transparent; + border: none; + border-radius: 6px; + cursor: pointer; + transition: all 0.2s; +} + +.period-btn:hover { + color: #fff; +} + +.period-btn.active { + background: linear-gradient(135deg, #fbbf24, #f59e0b); + color: #000; +} + +.chart-container { + flex: 1; + min-height: 400px; + padding: 8px; +} + +/* 水印样式 */ +.watermark-container { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; + z-index: 9999; + overflow: hidden; + opacity: 0.08; +} + +.watermark-content { + position: absolute; + top: -50%; + left: -50%; + width: 200%; + height: 200%; + display: flex; + flex-wrap: wrap; + transform: rotate(-30deg); +} + +.watermark-item { + width: 300px; + height: 200px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + font-family: 'SF Mono', monospace; + font-size: 14px; + color: #fbbf24; + font-weight: 600; + gap: 4px; +} + +/* 订阅图标按钮 */ +.subscribe-icon-btn { + display: flex; + align-items: center; + justify-content: center; + width: 24px; + height: 24px; + margin-left: 8px; + background: rgba(251, 191, 36, 0.15); + border: 1px solid rgba(251, 191, 36, 0.4); + border-radius: 6px; + color: #fbbf24; + cursor: pointer; + transition: all 0.3s ease; +} + +.subscribe-icon-btn:hover { + background: rgba(251, 191, 36, 0.25); + border-color: #fbbf24; + transform: scale(1.1); + box-shadow: 0 0 12px rgba(251, 191, 36, 0.3); +} + +.subscribe-icon-btn:active { + transform: scale(0.95); +} + +/* Loading 遮罩 */ +.loading-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(13, 13, 18, 0.9); + backdrop-filter: blur(8px); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 16px; + z-index: 10000; + animation: fadeIn 0.3s ease; +} + +@keyframes fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +.loading-overlay .ant-spin { + display: flex; + flex-direction: column; + align-items: center; + gap: 16px; +} + +.loading-overlay .ant-spin-text { + color: #fbbf24; + font-size: 14px; + font-weight: 500; + margin-top: 12px; +} + +.loading-text { + color: #fbbf24; + font-size: 16px; + font-weight: 500; + letter-spacing: 1px; +} + +/* 自定义 Spin 颜色为金色 */ +.loading-overlay .ant-spin-dot-item { + background-color: #fbbf24 !important; +} diff --git a/src/assets/css/markdown.css b/src/assets/css/markdown.css new file mode 100644 index 0000000..59a739f --- /dev/null +++ b/src/assets/css/markdown.css @@ -0,0 +1,80 @@ +#chat-markdown ol { + padding-left: 2em; +} +#chat-markdown .hljs { + border-radius: 5px; + padding: 50px 15px 15px 15px; + position: relative; + overflow: auto; + background: #292b33; +} +#chat-markdown .hljs::-webkit-scrollbar { + height: 9px; +} +#chat-markdown .hljs::-webkit-scrollbar-track { + background-color: #fff; +} + +#chat-markdown .hljs::-webkit-scrollbar-thumb { + background-color: #d8d8d8; + border-radius: 5px; +} +#chat-markdown .hljs .code-header { + display: flex; + justify-content: space-between; + height: 35px; + width: 100%; + background-color: rgb(50, 55, 65); + position: absolute; + left: 0; + top: 0; + border-radius: 5px 5px 0 0; + font-family: SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace; +} +#chat-markdown .hljs .code-header .copy { + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; + padding-right: 10px; + font-size: 12px; +} +#chat-markdown .hljs .code-header .copy img { + height: 19px; + width: 19px; +} +#chat-markdown .hljs .code-header .copy p { + color: #fff; +} +#chat-markdown .hljs .code-header .lang { + font-size: 12px; + height: 35px; + cursor: pointer; + color: #fff; + line-height: 35px; + padding-left: 15px; +} +#chat-markdown .hljs code { + font-family: SFMono-Regular,Menlo,Monaco,Consolas,monospace !important; +} +#chat-markdown .hljs code { + color: rgb(212, 212, 212); +} +#chat-markdown .hljs code span { + color: rgb(212, 212, 212); +} +#chat-markdown .hljs code .hljs-comment { + color: rgb(106, 153, 85); +} +#chat-markdown .hljs code .hljs-keyword { + color: rgb(86, 156, 214); +} +#chat-markdown .hljs code .function_ { + color: rgb(220, 220, 170); +} +#chat-markdown .hljs code .hljs-params { + color: rgb(156, 220, 254); +} +#chat-markdown .hljs code .class_ { + color: rgb(78, 201, 176); +} \ No newline at end of file diff --git a/src/assets/images/about/me.jpg b/src/assets/images/about/me.jpg deleted file mode 100644 index 4a90729..0000000 Binary files a/src/assets/images/about/me.jpg and /dev/null differ diff --git a/src/assets/images/help/help1.png b/src/assets/images/help/help1.png deleted file mode 100644 index 139922d..0000000 Binary files a/src/assets/images/help/help1.png and /dev/null differ diff --git a/src/assets/images/help/help2.png b/src/assets/images/help/help2.png deleted file mode 100644 index bbae58b..0000000 Binary files a/src/assets/images/help/help2.png and /dev/null differ diff --git a/src/assets/images/help/help3.png b/src/assets/images/help/help3.png deleted file mode 100644 index 3dafede..0000000 Binary files a/src/assets/images/help/help3.png and /dev/null differ diff --git a/src/assets/images/home/wx.jpg b/src/assets/images/home/wx.jpg deleted file mode 100644 index ac6038c..0000000 Binary files a/src/assets/images/home/wx.jpg and /dev/null differ diff --git a/src/assets/images/logo.png b/src/assets/images/logo.png new file mode 100644 index 0000000..98fd977 Binary files /dev/null and b/src/assets/images/logo.png differ diff --git a/src/assets/images/me.jpg b/src/assets/images/me.jpg new file mode 100644 index 0000000..3632890 Binary files /dev/null and b/src/assets/images/me.jpg differ diff --git a/src/assets/images/translate.png b/src/assets/images/translate.png new file mode 100644 index 0000000..85c100d Binary files /dev/null and b/src/assets/images/translate.png differ diff --git a/src/assets/images/video/video1.png b/src/assets/images/video/video1.png deleted file mode 100644 index c8941cb..0000000 Binary files a/src/assets/images/video/video1.png and /dev/null differ diff --git a/src/assets/images/video/video10.png b/src/assets/images/video/video10.png deleted file mode 100644 index 65d7cc0..0000000 Binary files a/src/assets/images/video/video10.png and /dev/null differ diff --git a/src/assets/images/video/video11.png b/src/assets/images/video/video11.png deleted file mode 100644 index ef829e8..0000000 Binary files a/src/assets/images/video/video11.png and /dev/null differ diff --git a/src/assets/images/video/video12.png b/src/assets/images/video/video12.png deleted file mode 100644 index ce7ef0d..0000000 Binary files a/src/assets/images/video/video12.png and /dev/null differ diff --git a/src/assets/images/video/video2.png b/src/assets/images/video/video2.png deleted file mode 100644 index ec76b25..0000000 Binary files a/src/assets/images/video/video2.png and /dev/null differ diff --git a/src/assets/images/video/video3.png b/src/assets/images/video/video3.png deleted file mode 100644 index df0d36c..0000000 Binary files a/src/assets/images/video/video3.png and /dev/null differ diff --git a/src/assets/images/video/video4.png b/src/assets/images/video/video4.png deleted file mode 100644 index 7131896..0000000 Binary files a/src/assets/images/video/video4.png and /dev/null differ diff --git a/src/assets/images/video/video5.png b/src/assets/images/video/video5.png deleted file mode 100644 index a5c0a26..0000000 Binary files a/src/assets/images/video/video5.png and /dev/null differ diff --git a/src/assets/images/video/video6.png b/src/assets/images/video/video6.png deleted file mode 100644 index 68147bd..0000000 Binary files a/src/assets/images/video/video6.png and /dev/null differ diff --git a/src/assets/images/video/video7.png b/src/assets/images/video/video7.png deleted file mode 100644 index 254777c..0000000 Binary files a/src/assets/images/video/video7.png and /dev/null differ diff --git a/src/assets/images/video/video8.png b/src/assets/images/video/video8.png deleted file mode 100644 index f1dcced..0000000 Binary files a/src/assets/images/video/video8.png and /dev/null differ diff --git a/src/assets/images/video/video9.png b/src/assets/images/video/video9.png deleted file mode 100644 index 674b5e0..0000000 Binary files a/src/assets/images/video/video9.png and /dev/null differ diff --git a/src/assets/images/welcome/a.jpg b/src/assets/images/welcome/a.jpg deleted file mode 100644 index ea6e7cd..0000000 Binary files a/src/assets/images/welcome/a.jpg and /dev/null differ diff --git a/src/assets/images/wx.jpg b/src/assets/images/wx.jpg new file mode 100644 index 0000000..73b4f5a Binary files /dev/null and b/src/assets/images/wx.jpg differ diff --git a/src/assets/images/wxPay.png b/src/assets/images/wxPay.png new file mode 100644 index 0000000..d4ca977 Binary files /dev/null and b/src/assets/images/wxPay.png differ diff --git a/src/assets/logo.png b/src/assets/logo.png deleted file mode 100644 index 8db6ffb..0000000 Binary files a/src/assets/logo.png and /dev/null differ diff --git a/src/components/ClickEffect.tsx b/src/components/ClickEffect.tsx new file mode 100644 index 0000000..4759810 --- /dev/null +++ b/src/components/ClickEffect.tsx @@ -0,0 +1,139 @@ +import React, { useEffect, useCallback } from 'react' +import styled from 'styled-components' + +// 社会主义核心价值观词语 +const WORDS = [ + '富强', + '民主', + '文明', + '和谐', + '自由', + '平等', + '公正', + '法治', + '爱国', + '敬业', + '诚信', + '友善' +] + +// 浮动文字样式 +const FloatingText = styled.b<{ x: number; y: number; color: string; opacity: number; scale: number }>` + position: fixed; + left: ${props => props.x}px; + top: ${props => props.y}px; + font-size: 16px; + cursor: default; + color: ${props => props.color}; + opacity: ${props => props.opacity}; + transform: scale(${props => props.scale}); + pointer-events: none; + user-select: none; + transition: none; + z-index: 9999; + font-weight: 500; + text-shadow: 0 0 2px rgba(255, 255, 255, 0.5); +` + +interface WordInstance { + id: number + text: string + x: number + y: number + color: string + opacity: number + scale: number +} + +// 生成随机颜色 +const randomColor = (): string => { + const r = Math.floor(Math.random() * 255) + const g = Math.floor(Math.random() * 255) + const b = Math.floor(Math.random() * 255) + return `rgb(${r}, ${g}, ${b})` +} + +const ClickEffect: React.FC = () => { + const [words, setWords] = React.useState([]) + const wordIndexRef = React.useRef(0) + const animationFrameRef = React.useRef() + + // 处理点击事件 + const handleClick = useCallback((event: MouseEvent) => { + const fontSize = 16 + const x = event.clientX - fontSize / 2 + const y = event.clientY - fontSize + + const newWord: WordInstance = { + id: Date.now() + Math.random(), + text: WORDS[wordIndexRef.current], + x, + y, + color: randomColor(), + opacity: 1, + scale: 1.2 + } + + // 更新词语索引 + wordIndexRef.current = (wordIndexRef.current + 1) % WORDS.length + + setWords(prev => [...prev, newWord]) + }, []) + + // 动画更新循环 + useEffect(() => { + const updateWords = () => { + setWords(prev => { + const updated = prev.map(word => ({ + ...word, + y: word.y - 1, // 向上移动 + opacity: word.opacity - 0.016, // 逐渐消失 + scale: word.scale + 0.002 // 逐渐放大 + })) + + // 移除已经完全透明的词语 + const visible = updated.filter(word => word.opacity > 0) + + return visible + }) + + animationFrameRef.current = requestAnimationFrame(updateWords) + } + + animationFrameRef.current = requestAnimationFrame(updateWords) + + return () => { + if (animationFrameRef.current) { + cancelAnimationFrame(animationFrameRef.current) + } + } + }, []) + + // 添加全局点击事件监听 + useEffect(() => { + window.addEventListener('click', handleClick) + + return () => { + window.removeEventListener('click', handleClick) + } + }, [handleClick]) + + return ( + <> + {words.map(word => ( + + {word.text} + + ))} + + ) +} + +export default ClickEffect diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx new file mode 100644 index 0000000..ffe29dd --- /dev/null +++ b/src/components/Footer.tsx @@ -0,0 +1,191 @@ +import React from 'react' +import { Typography } from 'antd' +import { useTranslation } from 'react-i18next' +import { useNavigate } from 'react-router-dom' +import styled from 'styled-components' +import logoImg from '@/assets/images/logo.png' + +const { Text } = Typography + +const FooterContainer = styled.footer` + background: linear-gradient(180deg, #0a0a0f 0%, #000 100%); + color: #fff; + padding: 40px 24px 24px; + margin-top: auto; + border-top: 1px solid rgba(255, 255, 255, 0.06); +` + +const FooterInner = styled.div` + max-width: 1200px; + margin: 0 auto; + display: grid; + grid-template-columns: 1fr; + gap: 32px; + + @media (min-width: 768px) { + grid-template-columns: 1.4fr 1fr 1.1fr; + gap: 48px; + } +` + +const BrandBlock = styled.div`` + +const LogoRow = styled.div` + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 14px; +` + +const LogoImg = styled.img` + width: 40px; + height: 40px; + border-radius: 10px; + object-fit: cover; + box-shadow: 0 4px 14px rgba(102, 126, 234, 0.35); +` + +const BrandName = styled.span` + font-size: 22px; + font-weight: 700; + background: linear-gradient(135deg, #667eea 0%, #b06ab3 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + letter-spacing: 0.5px; +` + +const Slogan = styled(Text)` + display: block; + color: rgba(255, 255, 255, 0.55) !important; + font-size: 13px; + line-height: 1.7; + max-width: 320px; +` + +const ColumnTitle = styled.h4` + color: #fff; + font-size: 15px; + font-weight: 600; + margin: 0 0 16px; + position: relative; + padding-bottom: 10px; + + &::after { + content: ''; + position: absolute; + left: 0; + bottom: 0; + width: 28px; + height: 2px; + border-radius: 2px; + background: linear-gradient(90deg, #667eea, #b06ab3); + } +` + +const NavList = styled.ul` + list-style: none; + margin: 0; + padding: 0; + display: grid; + grid-template-columns: 1fr 1fr; + gap: 10px 16px; +` + +const NavItem = styled.li` + color: rgba(255, 255, 255, 0.6); + font-size: 14px; + cursor: pointer; + transition: color 0.2s ease, transform 0.2s ease; + + &:hover { + color: #fff; + transform: translateX(3px); + } +` + +const ContactRow = styled.div` + display: flex; + align-items: center; + gap: 10px; + margin-bottom: 14px; + color: rgba(255, 255, 255, 0.75); + font-size: 14px; + line-height: 1.5; + word-break: break-all; +` + +const BottomBar = styled.div` + max-width: 1200px; + margin: 32px auto 0; + padding-top: 18px; + border-top: 1px solid rgba(255, 255, 255, 0.06); + text-align: center; + color: rgba(255, 255, 255, 0.4); + font-size: 12px; +` + +const Footer: React.FC = () => { + const { t } = useTranslation() + const navigate = useNavigate() + + const navLinks = [ + { path: '/cartoon', label: t('nav.cartoon') }, + { path: '/papers', label: t('nav.paper') }, + { path: '/goofish', label: t('nav.goofish') }, + { path: '/video', label: t('nav.video') }, + { path: '/music', label: t('nav.music') }, + { path: '/gold', label: t('nav.gold') }, + { path: '/gpt', label: t('nav.chatgpt') }, + { path: '/markmap', label: t('nav.aimarkmap') }, + ] + + return ( + + + {/* 左:Logo + ChattyPlay */} + + + + ChattyPlay + + {t('home.footer.description')} +
+ {t('home.footer.welcome')} +
+ + {/* 中:快捷导航 */} +
+ {t('home.footer.quickNav')} + + {navLinks.map((item) => ( + navigate(item.path)}> + {item.label} + + ))} + +
+ + {/* 右:联系我 */} +
+ {t('home.footer.contact')} + + {t('home.footer.wechat')} + + + {t('home.footer.email')} + + + {t('home.footer.github')} + +
+
+ + + {t('common.copyright')} + +
+ ) +} + +export default Footer diff --git a/src/components/HeartBeat.tsx b/src/components/HeartBeat.tsx new file mode 100644 index 0000000..3096b89 --- /dev/null +++ b/src/components/HeartBeat.tsx @@ -0,0 +1,261 @@ +import React, { useEffect, useRef } from 'react' +import * as THREE from 'three' +import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js' +import { MeshSurfaceSampler } from 'three-stdlib' +import { TrackballControls } from 'three-stdlib' +import { createNoise4D } from 'simplex-noise' +import gsap from 'gsap' +import styled from 'styled-components' + +const HeartBeatContainer = styled.div` + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background: #000000; + z-index: 9999; +` + +interface HeartBeatProps { + onComplete: () => void +} + +const HeartBeat: React.FC = ({ onComplete }) => { + const containerRef = useRef(null) + const timerRef = useRef>() + + useEffect(() => { + if (!containerRef.current) return + + console.log('初始化粒子心跳效果') + + // 创建场景 + const scene = new THREE.Scene() + + // 创建相机 + const camera = new THREE.PerspectiveCamera( + 75, + window.innerWidth / window.innerHeight, + 0.1, + 1000 + ) + camera.position.z = 1.8 + + // 创建渲染器 + const renderer = new THREE.WebGLRenderer({ antialias: true }) + renderer.setClearColor(new THREE.Color('rgb(0,0,0)')) + renderer.setSize(window.innerWidth, window.innerHeight) + renderer.setPixelRatio(window.devicePixelRatio) + containerRef.current.appendChild(renderer.domElement) + + // 轨迹球控制器 + const controls = new TrackballControls(camera, renderer.domElement) + controls.noPan = true + controls.maxDistance = 3 + controls.minDistance = 0.7 + + // 创建物体组 + const group = new THREE.Group() + scene.add(group) + + let heart: any = null + let sampler: any = null + let originHeart: Float32Array | null = null + + // 调色板 + const palette = [ + new THREE.Color('#ffd4ee'), + new THREE.Color('#ff77fc'), + new THREE.Color('#ff77ae'), + new THREE.Color('#ff1775') + ] + + // 简单噪声 + const simplex = createNoise4D() + const pos = new THREE.Vector3() + + // 粒子类 + class SparkPoint { + color: THREE.Color + rand: number + pos: THREE.Vector3 + one: THREE.Vector3 | null + two: THREE.Vector3 | null + + constructor() { + if (sampler) { + sampler.sample(pos) + } + this.color = palette[Math.floor(Math.random() * palette.length)] + this.rand = Math.random() * 0.03 + this.pos = pos.clone() + this.one = null + this.two = null + } + + update(beatValue: number) { + const noise = + simplex(pos.x * 1, pos.y * 1, pos.z * 1, 0.1) + 1.5 + const noise2 = + simplex(pos.x * 500, pos.y * 500, pos.z * 500, 1) + 1 + this.one = this.pos.clone().multiplyScalar(1.01 + noise * 0.15 * beatValue) + this.two = this.pos + .clone() + .multiplyScalar(1 + noise2 * 1 * (beatValue + 0.3) - beatValue * 1.2) + } + } + + const spikes: SparkPoint[] = [] + let positions: number[] = [] + let colors: number[] = [] + + // 粒子几何体和材质 + const geometry = new THREE.BufferGeometry() + const material = new THREE.PointsMaterial({ + vertexColors: true, + size: 0.009 + }) + const particles = new THREE.Points(geometry, material) + group.add(particles) + + // 心跳动画变量 + const beat = { a: 0 } + + // OBJ加载器 + const loader = new OBJLoader() + loader.load( + '/model/heartBeat.obj', + (obj) => { + console.log('模型加载成功') + heart = (obj as any).children[0] + heart.geometry.rotateX(-Math.PI * 0.5) + heart.geometry.scale(0.04, 0.04, 0.04) + heart.geometry.translate(0, -0.4, 0) + group.add(heart) + + // 基础网格材质 + heart.material = new THREE.MeshBasicMaterial({ + color: new THREE.Color('rgb(0,0,0)') + }) + originHeart = new Float32Array(heart.geometry.attributes.position.array) + + // 创建表面采样器 + sampler = new MeshSurfaceSampler(heart).build() + + // 初始化粒子 + init() + + // 设置心跳动画 + gsap + .timeline({ + repeat: -1, + repeatDelay: 0.3 + }) + .to(beat, { + a: 0.5, + duration: 0.6, + ease: 'power2.in' + }) + .to(beat, { + a: 0.0, + duration: 0.6, + ease: 'power3.out' + }) + + // 开始渲染循环 + renderer.setAnimationLoop(render) + + // 模型加载完成后,开始3秒计时 + console.log('设置3秒定时器') + timerRef.current = setTimeout(() => { + console.log('3秒到达,调用 onComplete') + renderer.setAnimationLoop(null) // 停止渲染循环 + onComplete() + }, 3000) + }, + (progress) => { + console.log('加载进度:', Math.round((progress.loaded / progress.total) * 100) + '%') + }, + (error) => { + console.error('模型加载失败:', error) + } + ) + + function init() { + positions = [] + colors = [] + for (let i = 0; i < 10000; i++) { + const g = new SparkPoint() + spikes.push(g) + } + } + + const maxZ = 0.23 + const rateZ = 0.5 + + function render(a: number) { + positions = [] + colors = [] + spikes.forEach((g) => { + g.update(beat.a) + const rand = g.rand + const color = g.color + if (maxZ * rateZ + rand > (g.one?.z || 0) && (g.one?.z || 0) > -maxZ * rateZ - rand) { + positions.push(g.one!.x, g.one!.y, g.one!.z) + colors.push(color.r, color.g, color.b) + } + if (maxZ * rateZ + rand * 2 > (g.one?.z || 0) && (g.one?.z || 0) > -maxZ * rateZ - rand * 2) { + positions.push(g.two!.x, g.two!.y, g.two!.z) + colors.push(color.r, color.g, color.b) + } + }) + + geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(positions), 3)) + geometry.setAttribute('color', new THREE.BufferAttribute(new Float32Array(colors), 3)) + + if (heart && originHeart) { + const vs = heart.geometry.attributes.position.array + for (let i = 0; i < vs.length; i += 3) { + const v = new THREE.Vector3(originHeart[i], originHeart[i + 1], originHeart[i + 2]) + const noise = simplex(originHeart[i] * 1.5, originHeart[i + 1] * 1.5, originHeart[i + 2] * 1.5, a * 0.0005) + 1 + v.multiplyScalar(0 + noise * 0.15 * beat.a) + vs[i] = v.x + vs[i + 1] = v.y + vs[i + 2] = v.z + } + heart.geometry.attributes.position.needsUpdate = true + } + + controls.update() + renderer.render(scene, camera) + } + + // 窗口大小调整 + const handleResize = () => { + camera.aspect = window.innerWidth / window.innerHeight + camera.updateProjectionMatrix() + renderer.setSize(window.innerWidth, window.innerHeight) + } + window.addEventListener('resize', handleResize) + + // 清理 + return () => { + console.log('清理 HeartBeat 组件') + if (timerRef.current) { + clearTimeout(timerRef.current) + } + window.removeEventListener('resize', handleResize) + renderer.setAnimationLoop(null) + if (containerRef.current && renderer.domElement.parentNode === containerRef.current) { + containerRef.current.removeChild(renderer.domElement) + } + renderer.dispose() + scene.clear() + } + }, [onComplete]) + + return +} + +export default HeartBeat diff --git a/src/components/Live2DDashboard.tsx b/src/components/Live2DDashboard.tsx new file mode 100644 index 0000000..22e3062 --- /dev/null +++ b/src/components/Live2DDashboard.tsx @@ -0,0 +1,188 @@ +import React, { useEffect, useRef, useState } from 'react' +import styled from 'styled-components' + +// 全局变量 +let isGlobalStyleAdded = false +// 全局初始化状态 +let isInitializing = false +// Live2D 实例 +let oml2dInstance: any = null + +const Live2DContainer = styled.div<{ $visible: boolean }>` + position: fixed; + bottom: 20px; + right: 20px; + z-index: 9999; + width: 250px; + height: 350px; + opacity: ${props => props.$visible ? 1 : 0}; + transition: opacity 0.3s ease; + pointer-events: ${props => props.$visible ? 'auto' : 'none'}; + + #oml2d-container, + #oml2d-container * { + pointer-events: auto !important; + } + + @media (max-width: 768px) { + width: 200px; + height: 280px; + bottom: 10px; + right: 10px; + } +` + +const LoadingText = styled.div` + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + color: #667eea; + font-size: 12px; + text-align: center; + pointer-events: none; +` + +interface Live2DDashboardProps { + isVisible: boolean +} + +const Live2DDashboard: React.FC = ({ isVisible }) => { + const containerRef = useRef(null) + const [loaded, setLoaded] = useState(false) + const initRef = useRef(false) + + useEffect(() => { + if (initRef.current || isInitializing) { + console.log('Live2D 已初始化或正在初始化...') + } + + // 标记全局初始化状态 + isInitializing = true + let isMounted = true + + // 添加全局样式覆盖 + if (!isGlobalStyleAdded) { + const styleId = 'oml2d-override-style' + if (!document.getElementById(styleId)) { + const style = document.createElement('style') + style.id = styleId + style.innerHTML = ` + #oml2d-stage { + left: auto !important; + right: 0 !important; + } + ` + document.head.appendChild(style) + } + isGlobalStyleAdded = true + } + + const initLive2D = async () => { + try { + console.log('开始初始化 Live2D 看板娘...') + + // 动态导入 oh-my-live2d + const { loadOml2d } = await import('oh-my-live2d') + + if (!isMounted || !containerRef.current) { + console.log('组件已卸载或容器不存在') + isInitializing = false + return + } + + // 创建容器 + const container = document.createElement('div') + container.id = 'oml2d-container' + container.style.cssText = 'width: 100%; height: 100%;' + containerRef.current.appendChild(container) + + console.log('加载 Live2D 模型...') + // 初始化 Live2D 并保存实例 + oml2dInstance = await loadOml2d({ + models: [ + { + path: 'https://model.hacxy.cn/HK416-2-normal/model.json', + position: [0, 50], + scale: 0.08, + stageStyle: { + height: 450 + } + } + ] + }) + + console.log('Live2D 模型加载完成') + + // 初始化后强制修改样式 + setTimeout(() => { + const stage = document.getElementById('oml2d-stage') + if (stage) { + stage.style.setProperty('left', 'auto', 'important') + stage.style.setProperty('right', '0', 'important') + console.log('oml2d-stage 样式已修改') + } + }, 100) + + console.log('Live2D 看板娘初始化成功') + initRef.current = true + + if (isMounted) { + setLoaded(true) + console.log('看板娘已设置为可见') + } + + } catch (error) { + console.error('Live2D 初始化失败:', error) + // 初始化失败时重置标记,允许重试 + isInitializing = false + initRef.current = false + } + } + + initLive2D() + + return () => { + isMounted = false + + // 组件卸载时销毁 Live2D 实例并清理 DOM + if (oml2dInstance) { + console.log('组件卸载,销毁 Live2D 实例') + try { + if (oml2dInstance.destroy) { + oml2dInstance.destroy() + } + } catch (error) { + console.error('销毁 Live2D 失败:', error) + } + oml2dInstance = null + } + + // 移除所有 oml2d 相关的 DOM 元素 + // 先移除 canvas 等子元素 + const canvases = document.querySelectorAll('#oml2d-stage canvas') + canvases.forEach(canvas => canvas.remove()) + + // 再移除 stage 元素 + const stage = document.getElementById('oml2d-stage') + if (stage) { + stage.remove() + console.log('已移除 oml2d-stage 元素') + } + + // 移除其他可能的 oml2d 元素 + const oml2dElements = document.querySelectorAll('[id^="oml2d"]') + oml2dElements.forEach(el => el.remove()) + + console.log('Live2D 资源清理完成') + } + }, []) + + return ( + + {!loaded && 看板娘加载中...} + + ) +} + +export default Live2DDashboard diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx new file mode 100644 index 0000000..4803c1c --- /dev/null +++ b/src/components/Navbar.tsx @@ -0,0 +1,408 @@ +import React, { useState, useEffect } from 'react' +import { Menu, Button, Drawer, message, Dropdown, Avatar } from 'antd' +import type { MenuProps } from 'antd' +import { + HomeOutlined, + MessageOutlined, + VideoCameraOutlined, + SoundOutlined, + BookOutlined, + UserOutlined, + LogoutOutlined, + MenuOutlined, + ReadOutlined, + GoldOutlined, + AndroidOutlined, + RobotOutlined, + NodeIndexOutlined, + // NotificationOutlined +} from '@ant-design/icons' +import { useLocation, useNavigate } from 'react-router-dom' +import { useTranslation } from 'react-i18next' +import styled from 'styled-components' +import { logoImage, translateImage } from '@/utils/images' +import { isAuthenticated, removeToken } from '@/utils/token' + +const NavbarContainer = styled.nav` + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 1000; + background: rgba(255, 255, 255, 0.95); + backdrop-filter: blur(10px); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + transition: all 0.3s ease; + + .ant-menu { + border-bottom: none; + background: transparent; + } + + .ant-menu-item { + transition: all 0.3s ease; + } + + .ant-menu-item:hover { + background: rgba(102, 126, 234, 0.1) !important; + } + + .ant-menu-item-selected { + background: rgba(102, 126, 234, 0.15) !important; + color: #667eea !important; + } + + @media (max-width: 768px) { + padding: 0 16px; + } +` + +const Logo = styled.div` + display: flex; + align-items: center; + gap: 12px; + font-size: 1.2rem; + font-weight: bold; + color: #667eea; + padding: 0 24px; + cursor: pointer; + transition: all 0.3s ease; + + &:hover { + transform: translateY(-2px); + } + + img { + width: 40px; + height: 40px; + border-radius: 8px; + } + + @media (max-width: 768px) { + padding: 0; + font-size: 1rem; + + img { + width: 32px; + height: 32px; + } + } +` + +const NavbarContent = styled.div` + display: flex; + align-items: center; + justify-content: space-between; + height: 64px; + padding: 0 24px; + + @media (max-width: 768px) { + padding: 0 16px; + } +` + +const LogoutButton = styled(Button)` + border-radius: 20px; + height: 36px; + padding: 0 20px; + font-weight: 500; + transition: all 0.3s ease; + + &:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3); + } +` + +const UserAvatar = styled(Avatar)` + cursor: pointer; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + transition: all 0.3s ease; + + &:hover { + transform: scale(1.1); + box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4); + } +` + +const UserDropdownMenu = styled.div` + padding: 12px 16px; + border-radius: 8px; + background: linear-gradient(135deg, rgba(102, 126, 234, 0.1) 0%, rgba(118, 75, 162, 0.1) 100%); + border: 1px solid rgba(102, 126, 234, 0.2); + + .user-info { + display: flex; + flex-direction: column; + gap: 4px; + } + + .user-label { + font-size: 12px; + color: #888; + } + + .user-name { + font-size: 14px; + font-weight: 600; + color: #333; + } +` + +const Navbar: React.FC = () => { + const { t, i18n } = useTranslation() + const location = useLocation() + const navigate = useNavigate() + const [drawerVisible, setDrawerVisible] = useState(false) + const [isMobile, setIsMobile] = useState(false) + const [isLoggedIn, setIsLoggedIn] = useState(false) + const [username, setUsername] = useState('') + + useEffect(() => { + const checkMobile = () => { + setIsMobile(window.innerWidth <= 768) + } + + checkMobile() + window.addEventListener('resize', checkMobile) + + return () => window.removeEventListener('resize', checkMobile) + }, []) + + useEffect(() => { + // 检查登录状态 + setIsLoggedIn(isAuthenticated()) + }, []) + + useEffect(() => { + // 检查登录状态 + const checkLoginStatus = () => { + const loginStatus = localStorage.getItem('isLoggedIn') + setIsLoggedIn(loginStatus === 'true') + setUsername(localStorage.getItem('username') || '') + } + + checkLoginStatus() + + // 监听存储变化 + const handleStorageChange = (e: StorageEvent) => { + if (e.key === 'isLoggedIn') { + setIsLoggedIn(e.newValue === 'true') + } + if (e.key === 'username') { + setUsername(e.newValue || '') + } + } + + window.addEventListener('storage', handleStorageChange) + return () => window.removeEventListener('storage', handleStorageChange) + }, []) + + const menuItems = [ + { key: '/home', label: t('nav.home'), icon: }, + { key: '/cartoon', label: t('nav.cartoon'), icon: }, + { key: '/papers', label: t('nav.paper'), icon: }, + { key: '/goofish', label: t('nav.goofish'), icon: }, + { key: '/video', label: t('nav.video'), icon: }, + { key: '/music', label: t('nav.music'), icon: }, + { key: '/gold', label: t('nav.gold'), icon: }, + { key: '/gpt', label: t('nav.chatgpt'), icon: }, + { key: '/markmap', label: t('nav.aimarkmap'), icon: }, + // 如果是移动端,不显示监工菜单项 + ...(isMobile ? [] : [{ key: '/worker', label: t('nav.worker'), icon: }]), + // { key: '/news', label: t('nav.news'), icon: }, + { key: '/about', label: t('nav.about'), icon: } + ] + + const handleMenuClick = (e: { key: string }) => { + navigate(e.key) + if (isMobile) { + setDrawerVisible(false) + } + } + + const handleLogout = () => { + removeToken() + localStorage.removeItem('isLoggedIn') + localStorage.removeItem('username') + setIsLoggedIn(false) + message.success(t('common.logoutSuccess')) + navigate('/') + } + + const handleLogoClick = () => { + navigate('/home') + } + + const handleLanguageChange = (lang: string) => { + i18n.changeLanguage(lang) + localStorage.setItem('language', lang) + } + + const languageItems: MenuProps['items'] = [ + { + key: 'zh', + label: t('common.chinese'), + onClick: () => handleLanguageChange('zh') + }, + { + key: 'en', + label: t('common.english'), + onClick: () => handleLanguageChange('en') + } + ] + + const currentKey = menuItems.find(({ key }) => + location.pathname === key || location.pathname.startsWith(`${key}/`) + )?.key ?? location.pathname + + // 移动端视图 + if (isMobile) { + return ( + + + + Logo + ChattyPlay + +
+ +
+
+ + setDrawerVisible(false)} + open={drawerVisible} + > + + + + ) + } + + // PC端视图 + return ( + + + + Logo + ChattyPlay + + + + +
+ + + )} +
+ + + ) +} + +export default Navbar diff --git a/src/components/VerifyCode.tsx b/src/components/VerifyCode.tsx new file mode 100644 index 0000000..fb82664 --- /dev/null +++ b/src/components/VerifyCode.tsx @@ -0,0 +1,93 @@ +import React, { useEffect, useRef } from 'react' +import styled from 'styled-components' + +interface VerifyCodeProps { + code: string +} + +const CanvasWrapper = styled.div` + width: 120px; + height: 40px; + + canvas { + border-radius: 8px; + cursor: pointer; + background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%); + } +` + +const VerifyCode: React.FC = ({ code }) => { + const canvasRef = useRef(null) + + useEffect(() => { + if (!canvasRef.current) return + + const canvas = canvasRef.current + const ctx = canvas.getContext('2d') + if (!ctx) return + + // 清除画布 + ctx.clearRect(0, 0, canvas.width, canvas.height) + + // 绘制干扰线 + for (let i = 0; i < 5; i++) { + ctx.beginPath() + ctx.strokeStyle = `rgba(0, 0, 0, ${Math.random() * 0.3})` + ctx.moveTo(Math.random() * canvas.width, Math.random() * canvas.height) + ctx.lineTo(Math.random() * canvas.width, Math.random() * canvas.height) + ctx.lineWidth = Math.random() * 2 + 1 + ctx.stroke() + } + + // 绘制文字 + const fontSize = 24 + const charSpacing = canvas.width / code.length + ctx.font = `bold ${fontSize}px Arial` + + for (let i = 0; i < code.length; i++) { + ctx.save() + + // 随机倾斜 + const rotate = (Math.random() - 0.5) * 0.4 + ctx.translate(i * charSpacing + charSpacing / 2, canvas.height / 2) + ctx.rotate(rotate) + + // 随机颜色 + const color = `rgba(${Math.floor(Math.random() * 255)}, ${Math.floor(Math.random() * 255)}, ${Math.floor(Math.random() * 255)}, 0.8)` + ctx.fillStyle = color + + ctx.textBaseline = 'middle' + ctx.textAlign = 'center' + + ctx.fillText(code[i], 0, 0) + + ctx.restore() + } + + // 绘制干扰点 + for (let i = 0; i < 50; i++) { + ctx.beginPath() + ctx.arc( + Math.random() * canvas.width, + Math.random() * canvas.height, + Math.random() * 1.5, + 0, + 2 * Math.PI + ) + ctx.fillStyle = `rgba(0, 0, 0, ${Math.random() * 0.3})` + ctx.fill() + } + }, [code]) + + return ( + + + + ) +} + +export default VerifyCode diff --git a/src/components/VersionUpdateModal.tsx b/src/components/VersionUpdateModal.tsx new file mode 100644 index 0000000..731ef6d --- /dev/null +++ b/src/components/VersionUpdateModal.tsx @@ -0,0 +1,109 @@ +import React, { useEffect, useState } from 'react' +import { Modal, Button } from 'antd' +import { useTranslation } from 'react-i18next' +import { + checkVersionUpdate, + handleVersionUpdate, + updateStoredVersion, + getVersionInfo, + isVersionUpdateHandled, + markVersionUpdateHandled +} from '../utils/versionChecker' + +interface VersionUpdateModalProps { + /** 是否自动检测版本更新 */ + autoCheck?: boolean + /** 检测间隔时间(毫秒),默认 5000ms */ + checkInterval?: number +} + +const VersionUpdateModal: React.FC = ({ + autoCheck = true, + checkInterval = 5000 +}) => { + const { t } = useTranslation() + const [visible, setVisible] = useState(false) + const versionInfo = getVersionInfo() + + /** + * 处理更新按钮点击 + */ + const handleUpdate = () => { + // 标记已处理 + markVersionUpdateHandled() + // 更新版本号 + updateStoredVersion() + // 清空 localStorage 并重新加载 + handleVersionUpdate() + } + + /** + * 执行版本检查 + */ + const performVersionCheck = () => { + // 如果已经处理过,不再显示 + if (isVersionUpdateHandled()) { + return + } + + const hasUpdate = checkVersionUpdate() + + if (hasUpdate) { + setVisible(true) + } + } + + /** + * 初始化时检查版本更新 + */ + useEffect(() => { + if (autoCheck) { + // 延迟检查,避免与其他初始化逻辑冲突 + const timer = setTimeout(() => { + performVersionCheck() + }, checkInterval) + + return () => clearTimeout(timer) + } + }, [autoCheck, checkInterval]) + + return ( + {}} + > +
+

+ {t('versionUpdate.message')} +

+

+ {t('versionUpdate.currentVersion')}{versionInfo.stored} +

+

+ {t('versionUpdate.latestVersion')}{versionInfo.current} +

+

+ {t('versionUpdate.description')} +

+ +
+
+ ) +} + +export default VersionUpdateModal diff --git a/src/components/WechatSupport.tsx b/src/components/WechatSupport.tsx new file mode 100644 index 0000000..75d03b8 --- /dev/null +++ b/src/components/WechatSupport.tsx @@ -0,0 +1,164 @@ +import { useState } from 'react' +import { Modal } from 'antd' +import { FaWeixin } from 'react-icons/fa' +import styled from 'styled-components' +import { payImage, wxImage } from '@/utils/images' + +const hintMessages = [ + '点这里,联系我或支持一下 🌷', + '商务合作?来微信聊聊 💬', + '工作内推?快联系我 🤝', + '觉得好用?请作者喝杯咖啡 ☕', + '发现小问题?欢迎告诉我 🐾', + '喜欢我的项目?点这里支持一下 ❤️' +] + +function nextHint(current: number) { + return (current + 1 + Math.floor(Math.random() * (hintMessages.length - 1))) % hintMessages.length +} + +const SupportButton = styled.button` + position: fixed; + right: max(24px, env(safe-area-inset-right)); + bottom: max(24px, env(safe-area-inset-bottom)); + z-index: 10000; + display: flex; + align-items: center; + justify-content: center; + width: 56px; + height: 56px; + padding: 0; + border: 2px solid white; + border-radius: 22px; + background: #167a42; + color: white; + font-size: 15px; + font-weight: 600; + box-shadow: 0 4px 16px rgba(22, 122, 66, 0.28); + svg { width: 30px; height: 30px; flex-shrink: 0; } + cursor: pointer; + animation: wechatSupportPulse 3s ease-in-out infinite; + + &:hover { animation-play-state: paused; background: #126536; } + &:focus-visible { outline: 3px solid #167a42; outline-offset: 4px; } + + @keyframes wechatSupportPulse { + 0%, 100% { transform: translateY(0); } + 50% { transform: translateY(-3px); } + } + + @media (prefers-reduced-motion: reduce) { + animation: none; + } +` + +const HintBubble = styled.span` + position: absolute; + bottom: calc(100% + 12px); + right: -2px; + width: max-content; + max-width: calc(100vw - 48px); + padding: 10px 14px; + border: 1px solid #dcecdf; + border-radius: 16px 16px 4px 16px; + background: #f3fff5; + color: #245c38; + font-size: 13px; + line-height: 1.6; + box-shadow: 0 4px 16px rgba(22, 122, 66, 0.12); + pointer-events: none; + opacity: 0; + animation: wechatSupportHint 14s ease-in-out infinite; + + &::after { + content: ''; + position: absolute; + right: 20px; + bottom: -5px; + width: 8px; + height: 8px; + background: #f3fff5; + border-right: 1px solid #dcecdf; + border-bottom: 1px solid #dcecdf; + transform: rotate(45deg); + } + + @keyframes wechatSupportHint { + 0%, 18%, 55%, 100% { opacity: 0; transform: translateY(4px); } + 22%, 50% { opacity: 1; transform: translateY(0); } + } + + @media (prefers-reduced-motion: reduce) { + animation: none; + } +` + +const Codes = styled.div` + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 20px; + padding-top: 12px; + + figure { + margin: 0; + padding: 16px; + text-align: center; + background: #f8f7ff; + border: 1px solid #eeeafb; + border-radius: 16px; + } + figcaption { margin-bottom: 12px; font-weight: 600; color: #594b85; } + img { display: block; width: 100%; height: auto; border-radius: 8px; } + + @media (max-width: 480px) { + grid-template-columns: 1fr; + } +` + +export default function WechatSupport() { + const [open, setOpen] = useState(false) + const [hintIndex, setHintIndex] = useState(() => Math.floor(Math.random() * hintMessages.length)) + + return ( + <> + setOpen(true)} + > + + setOpen(false)} + footer={null} + width={600} + zIndex={10001} + styles={{ body: { maxHeight: '70vh', overflowY: 'auto' } }} + > + +
+
微信赞赏
+ 微信收款二维码 +
+
+
添加微信
+ 联系作者的微信二维码 +
+
+
+ + ) +} diff --git a/src/components/goofish/GoofishLayout.tsx b/src/components/goofish/GoofishLayout.tsx new file mode 100644 index 0000000..2ace032 --- /dev/null +++ b/src/components/goofish/GoofishLayout.tsx @@ -0,0 +1,298 @@ +import React, { useState, useEffect } from 'react' +import { Layout, Menu, theme, Button, Typography, Space } from 'antd' +import { Outlet, useNavigate, useLocation } from 'react-router-dom' +import { useTranslation } from 'react-i18next' +import { + DashboardOutlined, + UserOutlined, + MessageOutlined, + ShoppingOutlined, + RobotOutlined, + FileTextOutlined, + BranchesOutlined, + MenuFoldOutlined, + MenuUnfoldOutlined, + HomeOutlined +} from '@ant-design/icons' + +const { Sider, Content, Header } = Layout +const { Title } = Typography + +const GoofishLayout: React.FC = () => { + const navigate = useNavigate() + const { t } = useTranslation() + const location = useLocation() + const [collapsed, setCollapsed] = useState(false) + const [isMobile, setIsMobile] = useState(false) + const { + token: { colorBgContainer, borderRadiusLG } + } = theme.useToken() + + // 检测屏幕尺寸 + useEffect(() => { + const checkMobile = () => { + setIsMobile(window.innerWidth < 768) + if (window.innerWidth < 768) { + setCollapsed(true) + } + } + + checkMobile() + window.addEventListener('resize', checkMobile) + return () => window.removeEventListener('resize', checkMobile) + }, []) + + const menuItems = [ + { key: '/goofish', icon: , label: t('goofish.data') }, + { key: '/goofish/accounts', icon: , label: t('goofish.accounts') }, + { key: '/goofish/conversations', icon: , label: t('goofish.conversations') }, + { key: '/goofish/orders', icon: , label: t('goofish.orders') }, + { key: '/goofish/goods', icon: , label: t('goofish.goods') }, + { key: '/goofish/autoreply', icon: , label: t('goofish.autoreply') }, + { key: '/goofish/autosell', icon: , label: t('goofish.autosell') }, + { key: '/goofish/workflow', icon: , label: t('goofish.workflow') }, + { key: '/goofish/logs', icon: , label: t('goofish.logs') } + ] + + const getPageTitle = () => { + const item = menuItems.find(m => m.key === location.pathname) + return item?.label || t('goofish.assistant') + } + + const handleMenuClick = ({ key }: { key: string }) => { + navigate(key) + // 移动端点击菜单后自动收起侧边栏 + if (isMobile) { + setCollapsed(true) + } + } + + return ( + <> + {/* 移动端菜单优化 */} + + + {/* 移动端遮罩层 */} + {isMobile && !collapsed && ( +
setCollapsed(true)} + /> + )} + + +
+ {!collapsed && ( + + + + {t('goofish.assistant')} + + + )} + {collapsed && !isMobile && ( + + )} + {!collapsed && isMobile && ( +
+
+ +
+
+ + +
+ + +
+ + + + +
+ + + ) +} + +export default GoofishLayout diff --git a/src/components/goofish/index.ts b/src/components/goofish/index.ts new file mode 100644 index 0000000..15349d6 --- /dev/null +++ b/src/components/goofish/index.ts @@ -0,0 +1 @@ +export { default as GoofishLayout } from './GoofishLayout' diff --git a/src/components/latex/FileTree.tsx b/src/components/latex/FileTree.tsx new file mode 100644 index 0000000..d7fc6f5 --- /dev/null +++ b/src/components/latex/FileTree.tsx @@ -0,0 +1,855 @@ +import React, { useState, useMemo, useCallback, useEffect, useImperativeHandle, forwardRef } from 'react' +import { Tree, Input, Button, Modal, message, Dropdown, Popconfirm, Upload, Tooltip } from 'antd' +import type { DataNode, TreeProps } from 'antd/es/tree' +import { + FileTextOutlined, + PictureOutlined, + FileOutlined, + PlusOutlined, + DeleteOutlined, + EditOutlined, + MoreOutlined, + FolderOutlined, + FolderOpenOutlined, + FileZipOutlined, +} from '@ant-design/icons' +import type { MenuProps } from 'antd' +import { unzip, strFromU8 } from 'fflate' +import './tree.css' + +// 持久化的文件树存储,在模块级别保存 +let persistedFiles: FileNode[] | null = null + +export interface FileNode { + key: string + title: string + type: 'tex' | 'bib' | 'cls' | 'image' | 'other' | 'folder' + content?: string + children?: FileNode[] + url?: string + imageBlob?: Blob // 真实图片 Blob + imageUrl?: string // base64 预览 URL +} + +export interface FileTreeRef { + replaceTree: (nodes: FileNode[]) => void +} + +// File/Blob 转 base64 +const blobToBase64 = (blob: Blob): Promise => { + return new Promise((resolve, reject) => { + const reader = new FileReader() + reader.onloadend = () => resolve(reader.result as string) + reader.onerror = reject + reader.readAsDataURL(blob) + }) +} + +// base64 转 Blob +const base64ToBlob = (base64: string): Blob => { + const parts = base64.split(';base64,') + const contentType = parts[0].split(':')[1] + const raw = window.atob(parts[1]) + const rawLength = raw.length + const uInt8Array = new Uint8Array(rawLength) + for (let i = 0; i < rawLength; ++i) { + uInt8Array[i] = raw.charCodeAt(i) + } + return new Blob([uInt8Array], { type: contentType }) +} + +const getFileIcon = (type: FileNode['type'], expanded?: boolean) => { + switch (type) { + case 'tex': + return + case 'bib': + return + case 'cls': + return + case 'image': + return + case 'folder': + return expanded ? : + default: + return + } +} + +const getFileType = (filename: string): FileNode['type'] => { + if (filename.endsWith('.tex')) return 'tex' + if (filename.endsWith('.bib')) return 'bib' + if (filename.endsWith('.cls')) return 'cls' + if (/\.(png|jpg|jpeg|gif|svg|eps|bmp|webp)$/i.test(filename)) return 'image' + return 'other' +} + +const isImageFile = (filename: string): boolean => { + return /\.(png|jpg|jpeg|gif|svg|eps|bmp|webp)$/i.test(filename) +} + +// fflate unzip 包装成 Promise +const unzipPromise = (buf: Uint8Array): Promise> => { + return new Promise((resolve, reject) => { + unzip(buf, (err, data) => (err ? reject(err) : resolve(data))) + }) +} + +// 将 zip 条目插入到 file tree 根节点 +const insertEntry = (root: FileNode, path: string, data: Uint8Array): void => { + // 同时兼容 macOS/Linux 的正斜杠和 Windows 的反斜杠 + const parts = path.split(/[\\/]/).filter(Boolean) + // 跳过系统生成目录与隐藏文件 + if (parts.length === 0) return + // macOS 资源目录 + if (parts[0] === '__MACOSX') return + // 隐藏文件 / 目录(以 . 开头) + if (parts.some((p) => p.startsWith('.'))) return + // Windows 系统生成的垃圾文件 + const fileName = parts[parts.length - 1] + if (/^(Thumbs\.db|ehthumbs\.db|desktop\.ini|\.DS_Store)$/i.test(fileName)) return + + let cur = root + for (let i = 0; i < parts.length - 1; i++) { + const name = parts[i] + let next = cur.children!.find((c) => c.type === 'folder' && c.title === name) + if (!next) { + next = { + key: `fld-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`, + title: name, + type: 'folder', + children: [], + } + cur.children!.push(next) + } + cur = next + } + + const isImg = isImageFile(fileName) + const blob = new Blob([data.buffer as ArrayBuffer]) + let content: string | undefined + let imageUrl: string | undefined + if (isImg) { + imageUrl = URL.createObjectURL(blob) + content = undefined + } else { + try { + content = strFromU8(data) + } catch { + content = '' + } + } + cur.children!.push({ + key: `zip-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`, + title: fileName, + type: getFileType(fileName), + content, + imageBlob: isImg ? blob : undefined, + imageUrl, + }) +} + +// 将 zip 二进制转换为 FileNode 数组(保留嵌套结构) +const zipBufferToTree = async (buf: Uint8Array): Promise => { + const entries = await unzipPromise(buf) + const root: FileNode = { + key: 'zip-root', + title: 'root', + type: 'folder', + children: [], + } + for (const [path, data] of Object.entries(entries)) { + insertEntry(root, path, data) + } + return root.children || [] +} + +// 递归统计文件数量 +const countEntries = (nodes: FileNode[]): number => { + let total = 0 + const walk = (ns: FileNode[]) => { + for (const n of ns) { + if (n.type !== 'folder') total++ + if (n.children) walk(n.children) + } + } + walk(nodes) + return total +} + +const initialFiles: FileNode[] = [ + { + key: 'main', + title: 'main.tex', + type: 'tex', + content: `\\documentclass{article} +\\usepackage[utf8]{inputenc} +\\usepackage{ctex} +\\usepackage{graphicx} +\\usepackage{amsmath} + +\\title{我的第一篇 LaTeX 文档} +\\author{Your Name} +\\date{\\today} + +\\begin{document} + +\\maketitle + +\\section{简介} +这是使用 LaTeX 编写的示例文档。 + +\\section{数学公式} +著名的欧拉公式: +\\begin{equation} +e^{i\\pi} + 1 = 0 +\\end{equation} + +\\section{列表} +\\begin{itemize} + \\item 第一项 + \\item 第二项 + \\item 第三项 +\\end{itemize} + +\\section{结论} +本文档展示了 LaTeX 的一些基本功能。 + +\\end{document}`, + }, +] + +interface FileTreeProps { + selectedKey: string | null + onSelectFile: (key: string, content: string, imageBlob?: Blob) => void // 修改:添加 imageBlob 参数 + onImagesChange?: (images: Array<{ key: string; name: string; blob: Blob }>) => void // 新增:图片文件变化时的回调 + // 压缩包解压完成后的回调(父组件用来完全替代文件树) + onZipUploaded?: (rootNodes: FileNode[]) => void +} + +interface TreeTitleProps { + nodeKey: string + title: string + nodeType: FileNode['type'] + editingName: string + editingKey: string | null + onStartRename: (key: string) => void + onDeleteFile: (key: string) => void + onConfirmRename: () => void + onEditingNameChange: (name: string) => void +} + +const TreeNodeTitle: React.FC = ({ + nodeKey, + title, + nodeType, + editingName, + editingKey, + onStartRename, + onDeleteFile, + onConfirmRename, + onEditingNameChange, +}) => { + const menuItems: MenuProps['items'] = [ + { + key: 'rename', + icon: , + label: '重命名', + onClick: (e) => { + e.domEvent.stopPropagation() + onStartRename(nodeKey) + }, + }, + { + key: 'delete', + icon: , + label: ( + { + e?.stopPropagation() + onDeleteFile(nodeKey) + }} + okText="确定" + cancelText="取消" + > + e.stopPropagation()}>删除 + + ), + }, + ] + + if (editingKey === nodeKey) { + return ( + onEditingNameChange(e.target.value)} + onKeyDown={(e) => { + if (e.key === 'Enter') onConfirmRename() + }} + onBlur={() => onConfirmRename()} + onClick={(e) => e.stopPropagation()} + /> + ) + } + + return ( +
+ + {title} + + + e.stopPropagation()} + style={{ + opacity: 0.5, + fontSize: 12, + flexShrink: 0, + cursor: 'pointer', + transition: 'opacity 0.2s' + }} + onMouseEnter={(e) => { + e.currentTarget.style.opacity = '1' + }} + onMouseLeave={(e) => { + e.currentTarget.style.opacity = '0.5' + }} + /> + +
+ ) +} + +const FileTree = forwardRef(({ selectedKey, onSelectFile, onImagesChange, onZipUploaded }, ref) => { + const [files, setFiles] = useState(() => { + // 初始化时优先使用持久化的数据 + if (persistedFiles) return persistedFiles + const savedFiles = localStorage.getItem('latex-file-tree-v3') + if (savedFiles) { + try { + const parsed = JSON.parse(savedFiles) + persistedFiles = parsed + return parsed + } catch (e) { + console.error('加载文件树失败:', e) + } + } + return initialFiles + }) + const [expandedKeys, setExpandedKeys] = useState([]) + const [isAddModalOpen, setIsAddModalOpen] = useState(false) + const [isAddFolderModalOpen, setIsAddFolderModalOpen] = useState(false) + const [newFileName, setNewFileName] = useState('') + const [newFolderName, setNewFolderName] = useState('') + const [editingKey, setEditingKey] = useState(null) + const [editingName, setEditingName] = useState('') + const [currentFolderKey, setCurrentFolderKey] = useState(null) + + // 保存文件树(不保存 Blob,Blob 单独用 IndexedDB) + useEffect(() => { + const filesToSave = files.map(node => { + // 从 localStorage 恢复文件内容 + const savedContent = localStorage.getItem(`latex-file-${node.key}`) + // 如果是图片节点,保存 base64 数据到 localStorage + if (node.type === 'image' && node.imageUrl) { + localStorage.setItem(`latex-image-${node.key}`, node.imageUrl) + } + return { + ...node, + content: savedContent ?? node.content, + imageBlob: undefined, // 不序列化 Blob + imageUrl: node.type === 'image' ? node.imageUrl : undefined, + } + }) + persistedFiles = filesToSave + localStorage.setItem('latex-file-tree-v3', JSON.stringify(filesToSave)) + }, [files]) + + const findNode = useCallback((nodes: FileNode[], key: string): FileNode | null => { + for (const node of nodes) { + if (node.key === key) return node + if (node.children) { + const found = findNode(node.children, key) + if (found) return found + } + } + return null + }, []) + + const findParentNode = useCallback((nodes: FileNode[], key: string, parent: FileNode | null = null): FileNode | null => { + for (const node of nodes) { + if (node.key === key) return parent + if (node.children) { + const found = findParentNode(node.children, key, node) + if (found) return found + } + } + return null + }, []) + + const addNodeToParent = useCallback((currentNodes: FileNode[], parentKey: string | null, newNode: FileNode): FileNode[] => { + if (parentKey === null) { + return [...currentNodes, newNode] + } + + return currentNodes.map((node) => { + if (node.key === parentKey) { + return { + ...node, + children: [...(node.children || []), newNode] + } + } + if (node.children) { + return { + ...node, + children: addNodeToParent(node.children, parentKey, newNode) + } + } + return node + }) + }, []) + + const deleteNode = useCallback((nodes: FileNode[], keyToDelete: string): FileNode[] => { + return nodes.filter((node) => { + if (node.key === keyToDelete) { + // 清理图片 URL + if (node.imageUrl) { + URL.revokeObjectURL(node.imageUrl) + } + return false + } + if (node.children) { + node.children = deleteNode(node.children, keyToDelete) + } + return true + }) + }, []) + + const renameNode = useCallback((nodes: FileNode[], keyToRename: string, newName: string): FileNode[] => { + return nodes.map((node) => { + if (node.key === keyToRename) { + return { + ...node, + title: newName, + type: node.type === 'folder' ? 'folder' : getFileType(newName), + } + } + if (node.children) { + return { + ...node, + children: renameNode(node.children, keyToRename, newName) + } + } + return node + }) + }, []) + + const handleDeleteFile = useCallback((key: string) => { + setFiles((prev) => deleteNode(prev, key)) + if (selectedKey === key) { + onSelectFile('', '') + } + message.success('已删除') + }, [deleteNode, selectedKey, onSelectFile]) + + const handleStartRename = useCallback((key: string) => { + const node = findNode(files, key) + if (node) { + setEditingKey(key) + setEditingName(node.title) + } + }, [files, findNode]) + + const handleConfirmRename = useCallback(() => { + if (!editingKey || !editingName.trim()) { + setEditingKey(null) + return + } + + setFiles((prev) => renameNode(prev, editingKey, editingName.trim())) + setEditingKey(null) + setEditingName('') + message.success('重命名成功') + }, [editingKey, editingName, renameNode]) + + const handleSelect: TreeProps['onSelect'] = useCallback((selectedKeys: React.Key[]) => { + if (selectedKeys.length > 0) { + const key = selectedKeys[0] as string + const node = findNode(files, key) + + if (node) { + // 更新当前文件夹为选中节点的父文件夹 + const parentNode = findParentNode(files, key) + setCurrentFolderKey(parentNode?.key || null) + + if (node.type !== 'folder') { + if (node.type === 'image') { + // 优先使用 localStorage 恢复图片(base64 格式) + const savedImageUrl = localStorage.getItem(`latex-image-${key}`) + const imageUrl = savedImageUrl || node.imageUrl || '' + onSelectFile(key, `IMAGE:${imageUrl}`, node.imageBlob) + } else { + // 优先使用 localStorage 恢复文件内容 + const savedContent = localStorage.getItem(`latex-file-${key}`) + onSelectFile(key, savedContent ?? node.content ?? '') + } + } else { + onSelectFile(key, '') + } + } + } else { + setCurrentFolderKey(null) + } + }, [files, findNode, findParentNode, onSelectFile]) + + const handleAddFile = useCallback(() => { + if (!newFileName.trim()) { + message.error('请输入文件名') + return + } + + const newFile: FileNode = { + key: `file-${Date.now()}`, + title: newFileName.trim(), + type: getFileType(newFileName.trim()), + content: '', + } + + setFiles((prev) => addNodeToParent(prev, currentFolderKey, newFile)) + + if (currentFolderKey && !expandedKeys.includes(currentFolderKey)) { + setExpandedKeys([...expandedKeys, currentFolderKey]) + } + + setNewFileName('') + setIsAddModalOpen(false) + message.success('文件添加成功') + onSelectFile(newFile.key, '') + }, [newFileName, currentFolderKey, addNodeToParent, expandedKeys, onSelectFile]) + + const handleAddFolder = useCallback(() => { + if (!newFolderName.trim()) { + message.error('请输入文件夹名称') + return + } + + const newFolder: FileNode = { + key: `folder-${Date.now()}`, + title: newFolderName.trim(), + type: 'folder', + children: [], + } + + setFiles((prev) => addNodeToParent(prev, currentFolderKey, newFolder)) + + if (currentFolderKey && !expandedKeys.includes(currentFolderKey)) { + setExpandedKeys([...expandedKeys, currentFolderKey]) + } + + setNewFolderName('') + setIsAddFolderModalOpen(false) + message.success('文件夹创建成功') + }, [newFolderName, currentFolderKey, addNodeToParent, expandedKeys]) + + // 上传图片文件 - 使用 base64 存储,刷新后能恢复 + const handleImageUpload = useCallback(async (file: File) => { + if (!isImageFile(file.name)) { + message.error('请上传图片文件 (png, jpg, jpeg, gif, svg, eps, bmp, webp)') + return false + } + + if (file.size > 10 * 1024 * 1024) { + message.error('图片大小不能超过10MB') + return false + } + + // 转为 base64 + const base64 = await blobToBase64(file) + const key = `image-${Date.now()}-${file.name}` + + const newImageFile: FileNode = { + key, + title: file.name, + type: 'image', + imageBlob: file, // 保留 Blob 用于编译 + imageUrl: base64, // 使用 base64,刷新后能恢复 + content: base64, // 兼容旧逻辑 + url: base64, + } + + setFiles((prev) => addNodeToParent(prev, currentFolderKey, newImageFile)) + + if (currentFolderKey && !expandedKeys.includes(currentFolderKey)) { + setExpandedKeys([...expandedKeys, currentFolderKey]) + } + + message.success(`图片 "${file.name}" 上传成功`) + onSelectFile(key, `IMAGE:${base64}`, file) + + return false + }, [currentFolderKey, addNodeToParent, expandedKeys, onSelectFile]) + + // 上传 zip 压缩包 - 解压后回调给父组件做整体替代 + const handleZipUpload = useCallback(async (file: File) => { + if (!file.name.toLowerCase().endsWith('.zip')) { + message.error('请上传 .zip 压缩包文件') + return false + } + + if (file.size > 50 * 1024 * 1024) { + message.error('压缩包大小不能超过 50MB') + return false + } + + try { + message.loading({ content: '正在解压压缩包...', key: 'zip-extract', duration: 0 }) + const buf = new Uint8Array(await file.arrayBuffer()) + const rootNodes = await zipBufferToTree(buf) + message.destroy('zip-extract') + + if (rootNodes.length === 0) { + message.warning('压缩包中没有可识别的文件') + return false + } + + message.success(`解压完成,共 ${countEntries(rootNodes)} 个文件`) + + // 通知父组件接管后续的完全替代流程 + onZipUploaded?.(rootNodes) + } catch (err) { + message.destroy('zip-extract') + const errorMsg = err instanceof Error ? err.message : '未知错误' + message.error('解压失败:' + errorMsg) + } + + return false + }, [onZipUploaded]) + + // 调试用 - 移入生产后删除 + useEffect(() => { + console.log('files updated:', JSON.stringify(files.map(f => ({ key: f.key, title: f.title })))) + }, [files]) + + // 暴露给父组件的 imperative 方法 + useImperativeHandle(ref, () => ({ + replaceTree: (nodes: FileNode[]) => { + setFiles(nodes) + setExpandedKeys([]) + setCurrentFolderKey(null) + setEditingKey(null) + setEditingName('') + }, + })) + + const treeData = useMemo((): DataNode[] => { + const build = (nodes: FileNode[]): DataNode[] => { + // @ts-ignore + return nodes.map((node) => ({ + key: node.key, + title: ( + + ), + icon: ({ expanded }: { expanded: boolean }) => getFileIcon(node.type, expanded), + isLeaf: node.type !== 'folder', + children: node.children ? build(node.children) : undefined, + })) + } + return build(files) + }, [files, editingName, editingKey, handleStartRename, handleDeleteFile, handleConfirmRename]) + + const getCurrentFolderName = () => { + if (!currentFolderKey) return '' + const folder = findNode(files, currentFolderKey) + return folder ? ` (到 "${folder.title}")` : '' + } + + // 获取所有图片文件(用于编译) + useEffect(() => { + if (onImagesChange) { + const collectImages = (nodes: FileNode[]): Array<{ key: string; name: string; blob: Blob }> => { + const images: Array<{ key: string; name: string; blob: Blob }> = [] + for (const node of nodes) { + if (node.type === 'image') { + let blob = node.imageBlob + // 如果没有 Blob 但有 base64,则转换 + if (!blob && node.imageUrl && node.imageUrl.startsWith('data:')) { + blob = base64ToBlob(node.imageUrl) + } + if (blob) { + images.push({ + key: node.key, + name: node.title, + blob + }) + } + } + if (node.children) { + images.push(...collectImages(node.children)) + } + } + return images + } + + onImagesChange(collectImages(files)) + } + }, [files, onImagesChange]) + + return ( +
+
+ 文件 + +
+ +
+ setExpandedKeys(keys)} + onSelect={handleSelect} + treeData={treeData} + style={{ width: '100%' }} + /> +
+ + { + setIsAddModalOpen(false) + setNewFileName('') + }} + okText="创建" + cancelText="取消" + zIndex={1100} + > + setNewFileName(e.target.value)} + onPressEnter={handleAddFile} + autoFocus + /> +
+ 支持的文件类型: .tex, .bib, .cls, .txt 等文本文件 +
+
+ + { + setIsAddFolderModalOpen(false) + setNewFolderName('') + }} + okText="创建" + cancelText="取消" + > + setNewFolderName(e.target.value)} + onPressEnter={handleAddFolder} + autoFocus + /> + +
+ ) +}) + +export default FileTree \ No newline at end of file diff --git a/src/components/latex/LatexEditor.tsx b/src/components/latex/LatexEditor.tsx new file mode 100644 index 0000000..5dd0554 --- /dev/null +++ b/src/components/latex/LatexEditor.tsx @@ -0,0 +1,155 @@ +import React, { useEffect, useRef } from 'react' +import Editor, { OnMount } from '@monaco-editor/react' +import type { editor } from 'monaco-editor' +import { Spin } from 'antd' + +interface LatexEditorProps { + value: string + onChange: (value: string) => void + fileName?: string +} + +const LatexEditor: React.FC = ({ value, onChange, fileName }) => { + const editorRef = useRef(null) + + // 编辑器挂载完成 + const handleEditorDidMount: OnMount = (editor, monaco) => { + editorRef.current = editor + + // 注册 LaTeX 语言(如果 Monaco 内置没有) + if (!monaco.languages.getLanguages().some((lang: { id: string }) => lang.id === 'latex')) { + monaco.languages.register({ id: 'latex' }) + + // LaTeX 语法高亮规则 + monaco.languages.setMonarchTokensProvider('latex', { + tokenizer: { + root: [ + // 注释 + [/%.*$/, 'comment'], + // 命令以 \ 开头 + [/\\[a-zA-Z]+/, 'keyword'], + [/\\[^a-zA-Z]/, 'keyword'], + // 环境 + [/\\begin\{[^}]+\}/, 'keyword'], + [/\\end\{[^}]+\}/, 'keyword'], + // 大括号内容 + [/\{[^}]*\}/, 'string'], + // 编译指令 + [/\\(?:documentclass|usepackage|begin|end|author|title|date|bibliography)/, 'keyword'], + // 数学模式 + [/\$\$/, { token: 'delimiter', bracket: '@open', next: '@mathDisplay' }], + [/\$/, { token: 'delimiter', bracket: '@open', next: '@mathInline' }], + // 普通文本 + [/[\[\]]/, 'string'], + ], + mathDisplay: [ + [/\$\$/, { token: 'delimiter', bracket: '@close', next: '@pop' }], + [/./, 'number'], + ], + mathInline: [ + [/\$/, { token: 'delimiter', bracket: '@close', next: '@pop' }], + [/./, 'number'], + ], + }, + }) + + // LaTeX 主题定义(可选) + monaco.editor.defineTheme('latexTheme', { + base: 'vs', + inherit: true, + rules: [ + { token: 'keyword', foreground: '667eea', fontStyle: 'bold' }, + { token: 'comment', foreground: '6b7280', fontStyle: 'italic' }, + { token: 'string', foreground: '10b981' }, + { token: 'number', foreground: 'f59e0b' }, + ], + colors: {}, + }) + } + + // 设置编辑器选项 + editor.updateOptions({ + fontSize: 14, + lineNumbers: 'on', + minimap: { enabled: false }, + wordWrap: 'on', + automaticLayout: true, + scrollBeyondLastLine: false, + fontFamily: "'Fira Code', 'Cascadia Code', Consolas, monospace", + fontLigatures: true, + tabSize: 2, + renderWhitespace: 'selection', + bracketPairColorization: { enabled: true }, + }) + + // 聚焦编辑器 + editor.focus() + } + + // 内容变化处理 + const handleEditorChange = (newValue: string | undefined) => { + if (newValue !== undefined) { + onChange(newValue) + } + } + + // 监听 value 变化(文件切换时) + useEffect(() => { + if (editorRef.current) { + const currentValue = editorRef.current.getValue() + if (currentValue !== value) { + editorRef.current.setValue(value) + } + } + }, [value]) + + return ( +
+ {/* 文件标签 */} + {fileName && ( +
+ {fileName} + | + .tex, .bib, .cls, .txt 等文本文件 +
+ )} + + {/* 编辑器 */} +
+ + +
+ } + options={{ + minimap: { enabled: false }, + fontSize: 14, + lineNumbers: 'on', + wordWrap: 'on', + automaticLayout: true, + scrollBeyondLastLine: false, + }} + /> +
+
+ ) +} + +export default LatexEditor diff --git a/src/components/latex/PdfPreview.tsx b/src/components/latex/PdfPreview.tsx new file mode 100644 index 0000000..54d1a53 --- /dev/null +++ b/src/components/latex/PdfPreview.tsx @@ -0,0 +1,304 @@ +import React, { useState } from 'react' +import { Document, Page, pdfjs } from 'react-pdf' +import { Spin, Button, Space, message } from 'antd' +import { + ZoomInOutlined, + ZoomOutOutlined, + LeftOutlined, + RightOutlined, + ReloadOutlined, + FilePdfOutlined, + DownloadOutlined +} from '@ant-design/icons' +import 'react-pdf/dist/Page/AnnotationLayer.css' +import 'react-pdf/dist/Page/TextLayer.css' + +// 配置 PDF.js worker +pdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.mjs` + +interface PdfPreviewProps { + pdfBlob: Blob | null + isCompiling: boolean + compileError?: string | null + onRetry?: () => void + // 可选:自定义下载文件名 + downloadFileName?: string +} + +const PdfPreview: React.FC = ({ + pdfBlob, + isCompiling, + compileError, + onRetry, + downloadFileName = 'document.pdf', // 默认文件名 +}) => { + const [numPages, setNumPages] = useState(0) + const [pageNumber, setPageNumber] = useState(1) + const [scale, setScale] = useState(1.0) + const [pdfUrl, setPdfUrl] = useState(null) + const [, setLoadError] = useState(null) + + // 生成 PDF URL + React.useEffect(() => { + if (pdfBlob) { + // 清理旧的URL + if (pdfUrl) { + URL.revokeObjectURL(pdfUrl) + } + + const url = URL.createObjectURL(pdfBlob) + setPdfUrl(url) + setLoadError(null) + setPageNumber(1) + setNumPages(0) // 重置页数 + + return () => { + URL.revokeObjectURL(url) + } + } else { + setPdfUrl(null) + setNumPages(0) + } + }, [pdfBlob]) + + // PDF 加载成功 + const onDocumentLoadSuccess = ({ numPages }: { numPages: number }) => { + setNumPages(numPages) + setLoadError(null) + } + + // PDF 加载失败 + const onDocumentLoadError = (error: Error) => { + console.error('PDF load error:', error) + setLoadError('PDF 加载失败,请尝试重新编译') + } + + // 翻页 + const goToPrevPage = () => { + setPageNumber(prev => Math.max(1, prev - 1)) + } + + const goToNextPage = () => { + setPageNumber(prev => Math.min(numPages, prev + 1)) + } + + // 缩放 + const zoomIn = () => { + setScale(prev => Math.min(3, prev + 0.25)) + } + + const zoomOut = () => { + setScale(prev => Math.max(0.5, prev - 0.25)) + } + + // 下载 PDF + const handleDownload = () => { + if (!pdfBlob) { + message.warning('没有可下载的 PDF 文件') + return + } + + try { + // 创建下载链接 + const url = URL.createObjectURL(pdfBlob) + const link = document.createElement('a') + link.href = url + link.download = downloadFileName + + // 触发下载 + document.body.appendChild(link) + link.click() + + // 清理 + document.body.removeChild(link) + URL.revokeObjectURL(url) + + message.success('PDF 下载成功') + } catch (error) { + console.error('下载失败:', error) + message.error('下载失败,请重试') + } + } + + // 判断是否可以下载 + const canDownload = !isCompiling && !compileError && pdfBlob + + return ( +
+ {/* 工具栏 */} +
+ PDF 预览 + + + {/* 下载按钮 */} + {canDownload && ( +
+ + {/* PDF 内容区 */} +
+ {/* 编译中 */} + {isCompiling && ( +
+ + 编译可能需要几秒钟... +
+ )} + + {/* 编译错误 */} + {!isCompiling && compileError && ( +
+
+ {compileError} +
+ {onRetry && ( + + )} +
+ )} + + {/* PDF 预览 */} + {!isCompiling && !compileError && pdfUrl && ( +
+ + + 加载 PDF... +
+ } + error={ +
+ PDF 加载失败 +
+ } + > + + +
+ } + /> + +
+ )} + + {/* 空状态 */} + {!isCompiling && !compileError && !pdfUrl && ( +
+ + + 点击「编译」按钮生成 PDF + + {onRetry && ( + + )} +
+ )} +
+ + {/* 翻页控制 */} + {numPages > 0 && ( +
+
+ )} + + ) +} + +export default PdfPreview diff --git a/src/components/latex/tree.css b/src/components/latex/tree.css new file mode 100644 index 0000000..bb24a81 --- /dev/null +++ b/src/components/latex/tree.css @@ -0,0 +1,28 @@ +/* 覆盖 Ant Design Tree 组件的样式 */ +.ant-tree .ant-tree-node-content-wrapper, +div.ant-tree .ant-tree-node-content-wrapper, +[class*="ant-tree-node-content-wrapper"] { + display: flex !important; + flex: 1 !important; + min-width: 0 !important; + width: 100% !important; +} + +/* 确保标题容器占满剩余空间 */ +.ant-tree .ant-tree-title, +[class*="ant-tree-title"] { + flex: 1 !important; + min-width: 0 !important; + width: 100% !important; +} + +/* 树节点整体占满宽度 */ +.ant-tree .ant-tree-treenode, +[class*="ant-tree-treenode"] { + width: 100% !important; +} + +/* 文件图标和内容容器 */ +.ant-tree-node-content-wrapper .ant-tree-iconEle { + flex-shrink: 0 !important; +} diff --git a/src/components/markdown/MarkdownEditor.tsx b/src/components/markdown/MarkdownEditor.tsx new file mode 100644 index 0000000..8711be9 --- /dev/null +++ b/src/components/markdown/MarkdownEditor.tsx @@ -0,0 +1,151 @@ +import React, { useEffect, useRef } from 'react' +import Editor, { OnMount } from '@monaco-editor/react' +import type { editor } from 'monaco-editor' +import { Spin } from 'antd' + +type ThemeMode = 'light' | 'dark' + +interface MarkdownEditorProps { + value: string + onChange: (value: string) => void + fileName?: string + theme: ThemeMode + /** 查看分享文档时置为只读 */ + readOnly?: boolean + onScrollRatio?: (ratio: number) => void + scrollToRatio?: number +} + +const MarkdownEditor: React.FC = ({ + value, + onChange, + fileName, + theme, + readOnly = false, + onScrollRatio, + scrollToRatio, +}) => { + const editorRef = useRef(null) + // 避免“预览滚动 -> 编辑器滚动”再次触发回传造成抖动 + const suppressScrollRef = useRef(false) + // onMount 只执行一次,用 ref 持有最新的回调,避免闭包捕获旧的 syncScroll 状态 + const onScrollRatioRef = useRef(onScrollRatio) + + useEffect(() => { + onScrollRatioRef.current = onScrollRatio + }, [onScrollRatio]) + + const handleEditorDidMount: OnMount = (editor) => { + editorRef.current = editor + + editor.updateOptions({ + fontSize: 14, + lineNumbers: 'on', + minimap: { enabled: false }, + wordWrap: 'on', + automaticLayout: true, + scrollBeyondLastLine: false, + fontFamily: "'Fira Code', 'Cascadia Code', Consolas, monospace", + fontLigatures: true, + tabSize: 2, + renderWhitespace: 'selection', + bracketPairColorization: { enabled: true }, + smoothScrolling: true, + padding: { top: 12, bottom: 24 }, + readOnly, + }) + + editor.onDidScrollChange(() => { + if (suppressScrollRef.current) return + if (!onScrollRatioRef.current) return + const scrollTop = editor.getScrollTop() + const max = Math.max(1, editor.getScrollHeight() - editor.getLayoutInfo().height) + onScrollRatioRef.current(Math.min(1, Math.max(0, scrollTop / max))) + }) + } + + // 外部(预览侧)滚动同步 + useEffect(() => { + const ed = editorRef.current + if (!ed || scrollToRatio === undefined) return + const max = Math.max(1, ed.getScrollHeight() - ed.getLayoutInfo().height) + const target = max * scrollToRatio + if (Math.abs(ed.getScrollTop() - target) < 4) return + suppressScrollRef.current = true + ed.setScrollTop(target) + const timer = window.setTimeout(() => { + suppressScrollRef.current = false + }, 60) + return () => window.clearTimeout(timer) + }, [scrollToRatio]) + + // 文件切换时重置内容 + useEffect(() => { + const ed = editorRef.current + if (ed && ed.getValue() !== value) { + ed.setValue(value) + } + }, [value]) + + // 主题跟随页面 + useEffect(() => { + editorRef.current?.updateOptions({ theme: theme === 'dark' ? 'vs-dark' : 'vs' }) + }, [theme]) + + // 只读状态(查看分享文档时) + useEffect(() => { + editorRef.current?.updateOptions({ readOnly }) + }, [readOnly]) + + return ( +
+ {fileName && ( +
+ {fileName} + | + + Markdown 源码 + +
+ )} + +
+ onChange(v ?? '')} + onMount={handleEditorDidMount} + loading={ +
+ +
+ } + options={{ + minimap: { enabled: false }, + fontSize: 14, + lineNumbers: 'on', + wordWrap: 'on', + automaticLayout: true, + scrollBeyondLastLine: false, + }} + /> +
+
+ ) +} + +export default MarkdownEditor diff --git a/src/components/markdown/MarkdownPreview.tsx b/src/components/markdown/MarkdownPreview.tsx new file mode 100644 index 0000000..a539b51 --- /dev/null +++ b/src/components/markdown/MarkdownPreview.tsx @@ -0,0 +1,238 @@ +import React, { useCallback, useEffect, useLayoutEffect, useRef } from 'react' +import { + decodeMermaidSource, + escapeHtml, + renderMermaidToSvg, + type RenderedDiagram, + type ThemeMode, +} from '@/utils/markdown' +import './markdown.css' + +interface MarkdownPreviewProps { + /** 已渲染过的 HTML(由页面层统一渲染,便于同时产出目录数据) */ + html: string + theme: ThemeMode + onScrollRatio?: (ratio: number) => void + scrollToRatio?: number + /** 预览区当前所处的章节标题 id,用于目录高亮 */ + onActiveHeadingChange?: (id: string | null) => void + /** 请求滚动到指定标题;带 ts 以便连续点击同一标题也能触发 */ + scrollToHeading?: { id: string; ts: number } | null +} + +/** 判定“当前章节”时的顶部留白,与标题锚点滚动位置的偏移保持一致 */ +const HEADING_OFFSET = 28 + +// 渲染结果放在模块级缓存:移动端切换视图会卸载并重新挂载组件, +// 有缓存就能立即回填,而不必重新渲染一遍图表 +const DIAGRAM_CACHE_LIMIT = 80 +const diagramCache = new Map() + +function cacheDiagram(key: string, value: RenderedDiagram) { + if (diagramCache.size >= DIAGRAM_CACHE_LIMIT) { + // Map 按插入顺序迭代,这里淘汰最早写入的一条 + const oldest = diagramCache.keys().next().value + if (oldest !== undefined) diagramCache.delete(oldest) + } + diagramCache.set(key, value) +} + +const MarkdownPreview: React.FC = ({ + html, + theme, + onScrollRatio, + scrollToRatio, + onActiveHeadingChange, + scrollToHeading, +}) => { + const containerRef = useRef(null) + const suppressScrollRef = useRef(false) + // 渲染任务令牌:只有最新的任务能写 DOM,旧任务在每个 await 之后都会让位 + const taskRef = useRef(0) + // 渲染失败的图表(主题 + 源码),避免同一份错误代码被反复重试刷屏 + const failedRef = useRef(new Set()) + // 标题元素缓存(预览 DOM 每次都被重建,需要用最新的节点) + const headingElsRef = useRef([]) + const activeIdRef = useRef(null) + const rafRef = useRef(null) + + /** 计算当前所处章节并上报(仅在变化时回调) */ + const computeActiveHeading = useCallback(() => { + const el = containerRef.current + if (!el || !onActiveHeadingChange) return + const headingEls = headingElsRef.current + if (!headingEls.length) return + + const containerTop = el.getBoundingClientRect().top + let current: string | null = null + for (const node of headingEls) { + if (!node.isConnected) continue + if (node.getBoundingClientRect().top - containerTop <= HEADING_OFFSET) { + current = node.id + } else { + // querySelectorAll 保证文档顺序,越过阈值即可停止 + break + } + } + // 还没滚到第一个标题时,认为处于文档开头 + if (!current) current = headingEls[0].id + + if (current !== activeIdRef.current) { + activeIdRef.current = current + onActiveHeadingChange(current) + } + }, [onActiveHeadingChange]) + + const scheduleActiveUpdate = useCallback(() => { + if (rafRef.current !== null) return + rafRef.current = window.requestAnimationFrame(() => { + rafRef.current = null + computeActiveHeading() + }) + }, [computeActiveHeading]) + + /** + * 源码每变化一次就会整体重建预览 DOM(dangerouslySetInnerHTML)。 + * 这里在浏览器绘制前:① 用缓存同步回填图表,避免输入时图表闪空;② 刷新标题元素缓存。 + */ + useLayoutEffect(() => { + const el = containerRef.current + if (!el) return + + headingElsRef.current = Array.from( + el.querySelectorAll('h1[id],h2[id],h3[id],h4[id],h5[id],h6[id]') + ) + + el.querySelectorAll('.md-mermaid').forEach((node) => { + if (node.dataset.rendered === '1') return + const code = decodeMermaidSource(node.getAttribute('data-mermaid')) + if (!code) return + const cached = diagramCache.get(`${theme}::${code}`) + if (cached) { + node.innerHTML = cached.svg + cached.bindFunctions?.(node) + node.dataset.rendered = '1' + } else { + node.classList.add('md-mermaid-loading') + } + }) + + computeActiveHeading() + }, [html, theme, computeActiveHeading]) + + const renderPendingDiagrams = useCallback( + async (token: number) => { + const container = containerRef.current + if (!container) return + + const nodes = Array.from(container.querySelectorAll('.md-mermaid')) + for (const node of nodes) { + // 已有更新的任务在跑,让位给它,它会从头处理所有占位块 + if (token !== taskRef.current) return + if (!node.isConnected || node.dataset.rendered === '1') continue + + const code = decodeMermaidSource(node.getAttribute('data-mermaid')) + if (!code) continue + + const key = `${theme}::${code}` + if (failedRef.current.has(key)) { + node.classList.remove('md-mermaid-loading') + continue + } + + try { + const rendered = await renderMermaidToSvg(code, theme) + // 先写缓存:即使当前节点已被 React 替换,渲染结果也不会浪费 + cacheDiagram(key, rendered) + if (token !== taskRef.current || !node.isConnected) continue + node.innerHTML = rendered.svg + rendered.bindFunctions?.(node) + node.dataset.rendered = '1' + node.classList.remove('md-mermaid-loading') + } catch (err) { + failedRef.current.add(key) + if (failedRef.current.size > 120) failedRef.current.clear() + if (token !== taskRef.current || !node.isConnected) continue + const message = err instanceof Error ? err.message : String(err) + node.innerHTML = `
图表渲染失败:${escapeHtml(message)}
` + node.dataset.rendered = '1' + node.classList.remove('md-mermaid-loading') + } + } + }, + [theme] + ) + + // 源码稳定后再渲染图表(首次进入还需等待 Mermaid chunk 加载) + useEffect(() => { + const el = containerRef.current + if (!el) return + const token = ++taskRef.current + const timer = window.setTimeout(() => { + void renderPendingDiagrams(token) + }, 180) + return () => window.clearTimeout(timer) + }, [html, theme, renderPendingDiagrams]) + + // 目录点击:滚动到对应标题 + useEffect(() => { + const el = containerRef.current + if (!el || !scrollToHeading) return + const target = el.querySelector(`#${scrollToHeading.id}`) + if (!target) return + + const delta = target.getBoundingClientRect().top - el.getBoundingClientRect().top + suppressScrollRef.current = true + el.scrollTo({ top: el.scrollTop + delta - 12, behavior: 'smooth' }) + + const timer = window.setTimeout(() => { + suppressScrollRef.current = false + // 跳转结束后重新判定当前章节,让目录高亮跟上 + computeActiveHeading() + }, 420) + return () => window.clearTimeout(timer) + }, [scrollToHeading, computeActiveHeading]) + + // 外部(编辑器侧)滚动同步 + useEffect(() => { + const el = containerRef.current + if (!el || scrollToRatio === undefined) return + const max = Math.max(1, el.scrollHeight - el.clientHeight) + const target = max * scrollToRatio + if (Math.abs(el.scrollTop - target) < 4) return + suppressScrollRef.current = true + el.scrollTop = target + const timer = window.setTimeout(() => { + suppressScrollRef.current = false + }, 60) + return () => window.clearTimeout(timer) + }, [scrollToRatio]) + + // 卸载时清掉待执行的动画帧 + useEffect(() => { + return () => { + if (rafRef.current !== null) window.cancelAnimationFrame(rafRef.current) + } + }, []) + + const handleScroll = () => { + const el = containerRef.current + if (!el) return + if (!suppressScrollRef.current && onScrollRatio) { + const max = Math.max(1, el.scrollHeight - el.clientHeight) + onScrollRatio(Math.min(1, Math.max(0, el.scrollTop / max))) + } + scheduleActiveUpdate() + } + + return ( +
+ ) +} + +export default MarkdownPreview diff --git a/src/components/markdown/TableOfContents.tsx b/src/components/markdown/TableOfContents.tsx new file mode 100644 index 0000000..1afed6e --- /dev/null +++ b/src/components/markdown/TableOfContents.tsx @@ -0,0 +1,39 @@ +import React from 'react' +import type { MarkdownHeading } from '@/utils/markdown' + +interface TableOfContentsProps { + headings: MarkdownHeading[] + activeId: string | null + onSelect: (id: string) => void +} + +/** + * 文档目录:层级按标题深度缩进,点击滚动到预览中的对应位置 + */ +const TableOfContents: React.FC = ({ headings, activeId, onSelect }) => { + if (!headings.length) { + return
当前文档还没有标题
+ } + + // 以文档里出现过的最浅层级为基准缩进,避免整篇只有 h3 时左侧留白过多 + const minDepth = headings.reduce((min, h) => Math.min(min, h.depth), 6) + + return ( + + ) +} + +export default TableOfContents diff --git a/src/components/markdown/markdown.css b/src/components/markdown/markdown.css new file mode 100644 index 0000000..547bdba --- /dev/null +++ b/src/components/markdown/markdown.css @@ -0,0 +1,318 @@ +/* Markdown 预览排版样式:.md-preview 下的明暗双主题 */ + +.md-preview { + --md-bg: #ffffff; + --md-fg: #24292f; + --md-muted: #6b7280; + --md-border: #e5e7eb; + --md-code-bg: #f6f8fa; + --md-inline-code-bg: rgba(27, 31, 35, 0.06); + --md-link: #2563eb; + --md-quote-bar: #d0d7de; + --md-table-stripe: #f6f8fa; + --md-hl-keyword: #cf222e; + --md-hl-string: #0a3069; + --md-hl-number: #0550ae; + --md-hl-comment: #6e7781; + --md-hl-title: #8250df; + --md-hl-attr: #953800; + + height: 100%; + overflow: auto; + padding: 28px 32px 96px; + background: var(--md-bg); + color: var(--md-fg); + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', + 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif; + font-size: 15px; + line-height: 1.75; + word-wrap: break-word; +} + +[data-md-theme='dark'] .md-preview { + --md-bg: #1e1e21; + --md-fg: #e6e6e6; + --md-muted: #9ba1a6; + --md-border: #333338; + --md-code-bg: #2a2a2e; + --md-inline-code-bg: rgba(255, 255, 255, 0.1); + --md-link: #6cb6ff; + --md-quote-bar: #444449; + --md-table-stripe: #26262a; + --md-hl-keyword: #ff7b72; + --md-hl-string: #a5d6ff; + --md-hl-number: #79c0ff; + --md-hl-comment: #8b949e; + --md-hl-title: #d2a8ff; + --md-hl-attr: #ffa657; +} + +.md-preview > :first-child { margin-top: 0; } + +.md-preview h1, +.md-preview h2, +.md-preview h3, +.md-preview h4, +.md-preview h5, +.md-preview h6 { + margin: 1.6em 0 0.6em; + font-weight: 600; + line-height: 1.3; +} + +.md-preview h1 { font-size: 1.9em; padding-bottom: 0.3em; border-bottom: 1px solid var(--md-border); } +.md-preview h2 { font-size: 1.5em; padding-bottom: 0.3em; border-bottom: 1px solid var(--md-border); } +.md-preview h3 { font-size: 1.25em; } +.md-preview h4 { font-size: 1.05em; } +.md-preview h5, .md-preview h6 { font-size: 1em; color: var(--md-muted); } + +.md-preview p, .md-preview ul, .md-preview ol, .md-preview blockquote, .md-preview table, .md-preview pre { + margin: 0.9em 0; +} + +.md-preview ul, .md-preview ol { padding-left: 1.6em; } +.md-preview li + li { margin-top: 0.25em; } +.md-preview li > ul, .md-preview li > ol { margin: 0.25em 0; } + +.md-preview a { color: var(--md-link); text-decoration: none; } +.md-preview a:hover { text-decoration: underline; } + +.md-preview blockquote { + padding: 0.2em 1em; + border-left: 4px solid var(--md-quote-bar); + color: var(--md-muted); +} + +.md-preview code { + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, 'Courier New', monospace; + font-size: 0.88em; + padding: 0.2em 0.4em; + border-radius: 4px; + background: var(--md-inline-code-bg); +} + +.md-preview pre code { padding: 0; background: none; font-size: 0.86em; } + +.md-preview .md-code-block { position: relative; margin: 1em 0; } + +.md-preview .md-code-lang { + position: absolute; + top: 0; + right: 0; + padding: 2px 10px; + font-size: 11px; + letter-spacing: 0.04em; + text-transform: uppercase; + color: var(--md-muted); + background: var(--md-code-bg); + border-radius: 0 8px 0 8px; + pointer-events: none; +} + +.md-preview .md-code-block pre { + margin: 0; + padding: 16px; + overflow: auto; + border-radius: 8px; + border: 1px solid var(--md-border); + background: var(--md-code-bg); +} + +.md-preview table { + border-collapse: collapse; + width: 100%; + display: block; + overflow: auto; +} + +.md-preview th, .md-preview td { + padding: 8px 13px; + border: 1px solid var(--md-border); + text-align: left; +} + +.md-preview thead th { background: var(--md-table-stripe); font-weight: 600; } +.md-preview tbody tr:nth-child(2n) { background: var(--md-table-stripe); } + +.md-preview img { max-width: 100%; border-radius: 6px; } +.md-preview hr { border: none; border-top: 1px solid var(--md-border); margin: 2em 0; } + +.md-preview .md-math-block { margin: 1em 0; overflow-x: auto; } +.md-preview .katex-display { margin: 0.6em 0; overflow-x: auto; overflow-y: hidden; padding: 2px 0; } + +.md-preview .md-mermaid { + display: flex; + justify-content: center; + margin: 1.2em 0; + padding: 16px; + border: 1px solid var(--md-border); + border-radius: 8px; + background: var(--md-code-bg); + overflow-x: auto; +} + +.md-preview .md-mermaid svg { max-width: 100%; height: auto; } + +/* 尚未渲染完成时的占位提示:首次进入需等待 Mermaid 按需加载 */ +.md-preview .md-mermaid-loading { min-height: 56px; } + +.md-preview .md-mermaid-loading::after { + content: '图表渲染中…'; + align-self: center; + color: var(--md-muted); + font-size: 13px; + letter-spacing: 0.02em; +} + +.md-preview .md-mermaid-error { + margin: 0; + color: #e11d48; + font-size: 12px; + white-space: pre-wrap; + background: none; + border: none; +} + +.md-preview input[type='checkbox'] { margin-right: 6px; } + +/* 打印:只保留预览区域,用于导出 PDF;同时强制浅色,保证纸质可读。 + 通过 html[data-md-print] 限定,避免影响其他页面的打印行为 */ +@media print { + html[data-md-print] body * { visibility: hidden !important; } + html[data-md-print] .md-preview, + html[data-md-print] .md-preview * { visibility: visible !important; } + html[data-md-print] .md-preview { + /* 覆盖暗色变量,避免打印出黑底白字 */ + --md-bg: #ffffff; + --md-fg: #111111; + --md-muted: #555555; + --md-border: #cccccc; + --md-code-bg: #f5f5f5; + --md-inline-code-bg: rgba(0, 0, 0, 0.06); + --md-link: #1a4fd6; + --md-quote-bar: #cccccc; + --md-table-stripe: #f5f5f5; + + position: absolute; + inset: 0; + width: 100%; + height: auto; + padding: 0; + overflow: visible; + background: #fff; + color: #111; + } + html[data-md-print] .md-preview .md-code-block pre { page-break-inside: avoid; } + html[data-md-print] .md-preview .md-mermaid { page-break-inside: avoid; } +} + +/* ============ 目录面板 ============ */ + +.md-toc-panel { + --md-bg: #ffffff; + --md-fg: #24292f; + --md-muted: #6b7280; + --md-border: #e5e7eb; + --md-toc-active: #667eea; + --md-toc-hover: rgba(102, 126, 234, 0.08); + + display: flex; + flex-direction: column; + height: 100%; + min-height: 0; + background: var(--md-bg); + border-left: 1px solid var(--md-border); + overflow: hidden; +} + +[data-md-theme='dark'] .md-toc-panel { + --md-bg: #1e1e21; + --md-fg: #e6e6e6; + --md-muted: #9ba1a6; + --md-border: #333338; + --md-toc-active: #8b9ff5; + --md-toc-hover: rgba(139, 159, 245, 0.12); +} + +.md-toc-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; + padding: 10px 12px 10px 14px; + font-size: 12px; + font-weight: 600; + letter-spacing: 0.04em; + color: var(--md-muted); + border-bottom: 1px solid var(--md-border); + flex-shrink: 0; +} + +.md-toc { + flex: 1; + min-height: 0; + overflow: auto; + padding: 8px 6px 24px; +} + +.md-toc-item { + display: block; + width: 100%; + padding: 5px 10px; + border: none; + border-radius: 6px; + background: none; + cursor: pointer; + text-align: left; + font-family: inherit; + font-size: 13px; + line-height: 1.5; + color: var(--md-fg); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + transition: background 0.15s ease, color 0.15s ease; +} + +.md-toc-item:hover { background: var(--md-toc-hover); } + +.md-toc-item.is-active { + color: var(--md-toc-active); + background: var(--md-toc-hover); + font-weight: 600; +} + +.md-toc-empty { + padding: 20px 16px; + text-align: center; + font-size: 13px; + color: var(--md-muted); +} + +/* ============ 分享查看提示条 ============ */ + +.md-share-banner { + display: flex; + align-items: center; + gap: 12px; + flex-wrap: wrap; + flex-shrink: 0; + padding: 8px 16px; + font-size: 13px; + color: #4c3f8f; + background: linear-gradient(135deg, rgba(102, 126, 234, 0.1), rgba(118, 75, 162, 0.1)); + border-bottom: 1px solid rgba(102, 126, 234, 0.25); +} + +[data-md-theme='dark'] .md-share-banner { + color: #c3b6f5; + background: linear-gradient(135deg, rgba(102, 126, 234, 0.16), rgba(118, 75, 162, 0.16)); + border-bottom-color: rgba(102, 126, 234, 0.35); +} + +.md-share-banner-text { + display: flex; + align-items: center; + gap: 6px; + font-weight: 500; +} diff --git a/src/components/markmap/EditNodeModal.tsx b/src/components/markmap/EditNodeModal.tsx new file mode 100644 index 0000000..28e9ff5 --- /dev/null +++ b/src/components/markmap/EditNodeModal.tsx @@ -0,0 +1,43 @@ +import React from 'react' +import { Modal, Input } from 'antd' +import { useTranslation } from 'react-i18next' + +const { TextArea } = Input + +interface EditNodeModalProps { + visible: boolean + defaultValue: string + onSave: (value: string) => void + onCancel: () => void +} + +const EditNodeModal: React.FC = ({ + visible, + defaultValue, + onSave, + onCancel +}) => { + const { t } = useTranslation() + + return ( + +
+