diff --git a/.gitignore b/.gitignore index 4d33c12e..c8257314 100644 --- a/.gitignore +++ b/.gitignore @@ -146,6 +146,7 @@ tmp .history .DS_Store main/xiaozhi-server/data +main/xiaozhi-server/config/assets/wakeup_words.* main/manager-web/node_modules .config.yaml .secrets.yaml @@ -160,3 +161,7 @@ main/xiaozhi-server/models/sherpa-onnx* /asr-models/iic/SenseVoiceSmall/ /main/xiaozhi-server/asr-models/iic/SenseVoiceSmall/ /models/SenseVoiceSmall/model.pt +my_wakeup_words.mp3 +main/manager-api/.vscode +# Ignore webpack cache directory +main/manager-web/.webpack_cache/ diff --git a/Dockerfile-server b/Dockerfile-server index e81b8ccf..7eb77114 100644 --- a/Dockerfile-server +++ b/Dockerfile-server @@ -5,15 +5,15 @@ WORKDIR /app COPY main/xiaozhi-server/requirements.txt . -# 优化apt安装 +# 安装Python依赖 RUN pip install --no-cache-dir -r requirements.txt -# 第三阶段:生产镜像 +# 第二阶段:生产镜像 FROM python:3.10-slim WORKDIR /opt/xiaozhi-esp32-server -# 优化apt安装 +# 安装系统依赖 RUN apt-get update && \ apt-get install -y --no-install-recommends libopus0 ffmpeg && \ apt-get clean && \ diff --git a/README.md b/README.md index b59d9d45..810ce514 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,28 @@ -[![SVG Banners](https://svg-banners.vercel.app/api?type=origin&text1=你好😃,小智📟&text2=开源小智ESP-32后端服务&width=830&height=210)](https://github.com/xinnan-tech/xiaozhi-esp32-server) +[![Banners](docs/images/banner1.png)](https://github.com/xinnan-tech/xiaozhi-esp32-server) + + +

小智后端服务xiaozhi-esp32-server

+

+本项目为开源智能硬件项目 +xiaozhi-esp32提供后端服务
+根据小智通信协议使用Python实现
+帮助您快速搭建小智服务器 +

+ +

+English +· 简体中文 +· 更新日志部署文档反馈问题 +

+

+ + GitHub Contributors + - GitHub Contributors + GitHub Contributors Issues @@ -9,15 +30,14 @@ GitHub pull requests + + GitHub pull requests + + + stars +

-# 小智 ESP-32 后端服务(xiaozhi-esp32-server) - -(中文 | [English](README_en.md)) - -本项目为开源智能硬件项目 [xiaozhi-esp32](https://github.com/78/xiaozhi-esp32) -提供后端服务。根据 [小智通信协议](https://ccnphfhqs21z.feishu.cn/wiki/M0XiwldO9iJwHikpXD5cEx71nKh) 使用 `Python` 实现。 - --- ## 适用人群 👥 @@ -51,7 +71,7 @@ - + 控制家电开关 @@ -95,6 +115,11 @@ + + + 播报新闻 + + @@ -103,20 +128,7 @@ ## 系统要求与部署前提 🖥️ -- **硬件**:一套兼容 `xiaozhi-esp32` - 的硬件设备(具体型号请参考 [此处](https://rcnv1t9vps13.feishu.cn/wiki/DdgIw4BUgivWDPkhMj1cGIYCnRf))。 - -- **电脑或服务器**:建议 4 核 CPU、8G 内存的电脑。如果开启ASR也使用API,可运行在2核CPU、2G内存的服务器中。 -- **固件编译**:请将本后端服务的接口地址更新至 `xiaozhi-esp32` 项目中,再重新编译`xiaozhi-esp32`固件并烧录到设备上。 - -![图片](docs/images/deploy.png) - -如果你没有esp32相关的硬件设备,但是非常想体验该项目,可以使用以下的项目让你的电脑、手机模拟成esp32设备。 - -- [小智安卓端](https://github.com/TOM88812/xiaozhi-android-client) -- [小智电脑端](https://github.com/Huang-junsen/py-xiaozhi) - -如果你是一名软件开发者,这里有一份[《致开发者的公开信》](docs/contributor_open_letter.md),欢迎加入! +建议 4 核 CPU、8G 内存的电脑。如果开启ASR也使用API,可运行在2核CPU、2G内存的服务器中。[请参考部署架构图](./docs/images/deploy.png) --- @@ -139,116 +151,9 @@ server: --- -## 功能清单 ✨ +## 部署方式 🚀 -### 已实现 ✅ - -- **通信协议** - 基于 `xiaozhi-esp32` 协议,通过 WebSocket 实现数据交互。 -- **对话交互** - 支持唤醒对话、手动对话及实时打断。长时间无对话时自动休眠 -- **意图识别** - 支持使用LLM意图识别、function call函数调用,减少硬编码意图判断 -- **多语言识别** - 支持国语、粤语、英语、日语、韩语(默认使用 FunASR)。 -- **LLM 模块** - 支持灵活切换 LLM 模块,默认使用 ChatGLMLLM,也可选用阿里百炼、DeepSeek、Ollama 等接口。 -- **TTS 模块** - 支持 EdgeTTS(默认)、火山引擎豆包 TTS 等多种 TTS 接口,满足语音合成需求。 -- **记忆功能** - 支持超长记忆、本地总结记忆、无记忆三种模式,满足不同场景需求。 -- **IOT功能** - 支持管理注册设备IOT功能,支持基于对话上下文语境下的智能物联网控制。 - -### 正在开发 🚧 - -- 多种心情模式 -- 智控台webui - -想了解具体开发进度,[请点击这里](https://github.com/users/xinnan-tech/projects/3) - -![图片](docs/images/webui.png) ---- - -## 本项目支持的平台/组件列表 📋 - -### LLM 语言模型 - -| 类型 | 平台名称 | 使用方式 | 收费模式 | 备注 | -|:---:|:------------------:|:---------------------:|:-----------:|:-----------------------------------------------------------------------------------------------------------------------:| -| LLM | 阿里百炼 (AliLLM) | openai 接口调用 | 消耗 token | [点击申请密钥](https://bailian.console.aliyun.com/?apiKey=1#/api-key) | -| LLM | DoubaoLLM | openai 接口调用 | 消耗 token | [点击申请密钥](https://console.volcengine.com/ark/region:ark+cn-beijing/model/detail?Id=doubao-pro-32k&projectName=undefined) | -| LLM | 深度求索 (DeepSeekLLM) | openai 接口调用 | 消耗 token | [点击申请密钥](https://platform.deepseek.com/) | -| LLM | 智谱(ChatGLMLLM) | openai 接口调用 | 免费 | 虽然免费,仍需[点击申请密钥](https://bigmodel.cn/usercenter/proj-mgmt/apikeys) | -| LLM | OllamaLLM | ollama 接口调用 | 免费/消耗 token | 需预先下载模型(`ollama pull`),服务地址:`http://localhost:11434` | -| LLM | DifyLLM | dify 接口调用 | 免费/消耗 token | 本地化部署,注意配置提示词需在 Dify 控制台设置 | -| LLM | FastgptLLM | fastgpt 接口调用 | 免费/消耗 token | 本地化部署,注意配置提示词需在 Fastgpt 控制台设置 | -| LLM | GeminiLLM | gemini 接口调用 | 免费 | [点击申请密钥](https://aistudio.google.com/apikey) | -| LLM | CozeLLM | coze 接口调用 | 消耗 token | 需提供 bot_id、user_id 及个人令牌 | -| LLM | Home Assistant | homeassistant语音助手接口调用 | 免费 | 需提供home assistant令牌 | - -实际上,任何支持 openai 接口调用的 LLM 均可接入使用。 - ---- - -### TTS 语音合成 - -| 类型 | 平台名称 | 使用方式 | 收费模式 | 备注 | -|:---:|:----------------------:|:----:|:--------:|:-------------------------------------------------------------------------:| -| TTS | EdgeTTS | 接口调用 | 免费 | 默认 TTS,基于微软语音合成技术 | -| TTS | 火山引擎豆包 TTS (DoubaoTTS) | 接口调用 | 消耗 token | [点击创建密钥](https://console.volcengine.com/speech/service/8);建议使用付费版本以获得更高并发 | -| TTS | AliyunTTS | 接口调用 | 消耗 token | [点击创建密钥](https://nls-portal.console.aliyun.com/applist) | -| TTS | CosyVoiceSiliconflow | 接口调用 | 消耗 token | 需申请硅基流动 API 密钥;输出格式为 wav | -| TTS | TTS302AI | 接口调用 | 消耗 token | [点击创建密钥](https://dash.302.ai/apis/list) | -| TTS | CozeCnTTS | 接口调用 | 消耗 token | 需提供 Coze API key;输出格式为 wav | -| TTS | GizwitsTTS | 接口调用 | 消耗 token | [点击创建密钥](https://agentrouter.gizwitsapi.com) | -| TTS | ACGNTTS | 接口调用 | 消耗 token | [联系网站管理员购买密钥](www.ttson.cn) | -| TTS | OpenAITTS | 接口调用 | 消耗 token | 境外使用,境外购买 | -| TTS | FishSpeech | 接口调用 | 免费/自定义 | 本地启动 TTS 服务;启动方法见配置文件内说明 | -| TTS | GPT_SOVITS_V2 | 接口调用 | 免费/自定义 | 本地启动 TTS 服务,适用于个性化语音合成场景 | -| TTS | GPT_SOVITS_V3 | 接口调用 | 免费/自定义 | 本地启动 TTS 服务,适用于个性化语音合成场景 | -| TTS | MinimaxTTS | 接口调用 | 免费/自定义 | 本地启动 TTS 服务,适用于个性化语音合成场景 | - ---- - -### VAD 语音活动检测 - -| 类型 | 平台名称 | 使用方式 | 收费模式 | 备注 | -|:---:|:---------:|:----:|:----:|:--:| -| VAD | SileroVAD | 本地使用 | 免费 | | - ---- - -### ASR 语音识别 - -| 类型 | 平台名称 | 使用方式 | 收费模式 | 备注 | -|:---:|:---------:|:----:|:----:|:--:| -| ASR | FunASR | 本地使用 | 免费 | | -| ASR | SherpaASR | 本地使用 | 免费 | | -| ASR | DoubaoASR | 接口调用 | 收费 | | - - ---- - -### Memory 记忆存储 - -| 类型 | 平台名称 | 使用方式 | 收费模式 | 备注 | -|:------:|:---------------:|:----:|:---------:|:--:| -| Memory | mem0ai | 接口调用 | 1000次/月额度 | | -| Memory | mem_local_short | 本地总结 | 免费 | | - ---- - -### Intent 意图识别 - -| 类型 | 平台名称 | 使用方式 | 收费模式 | 备注 | -|:------:|:-------------:|:----:|:-------:|:---------------------:| -| Intent | intent_llm | 接口调用 | 根据LLM收费 | 通过大模型识别意图,通用性强 | -| Intent | function_call | 接口调用 | 根据LLM收费 | 通过大模型函数调用完成意图,速度快,效果好 | - ---- - -## 使用方式 🚀 +[![Banners](docs/images/banner2.png)](./docs/Deployment.md) ### 一、[部署文档](./docs/Deployment.md) @@ -278,109 +183,112 @@ server: ## 常见问题 ❓ -### 1、为什么我说的话,小智识别出来很多韩文、日文、英文?🇰🇷 +如遇到问题或产品建议反馈[点这里](docs/FAQ.md)。 -建议:检查一下`models/SenseVoiceSmall`是否已经有`model.pt` -文件,如果没有就要下载,查看这里[下载语音识别模型文件](docs/Deployment.md#模型文件) +--- -### 2、为什么会出现“TTS 任务出错 文件不存在”?📁 +## 产品生态 👬 +小智是一个生态,当你使用这个产品时,也可以看看其他在这个生态圈的优秀项目 -建议:检查一下是否正确使用`conda` 安装了`libopus`和`ffmpeg`库。 +- [小智安卓客户端](https://github.com/TOM88812/xiaozhi-android-client) -如果没有安装,就安装 + 一个基于xiaozhi-server的Android、IOS语音对话应用,支持实时语音交互和文字对话。现在是flutter版本,打通IOS、Android端。 +- [小智电脑客户端](https://github.com/Huang-junsen/py-xiaozhi) -``` -conda install conda-forge::libopus -conda install conda-forge::ffmpeg -``` + 该项目提供了一个基于 Python 实现的小白 AI 客户端,使得在不具备实体硬件条件的情况下,依然能够体过代码体验小智 AI 的功能。主要功能包括 AI 语音交互、视觉多模态识别、IoT 设备集成、联网音乐播放、语音唤醒、自动对话模式、图形化界面、命令行模式、跨平台支持、音量控制、会话管理、加密音频传输、自动验证码处理等。 +- [小智Java服务端](https://github.com/joey-zhou/xiaozhi-esp32-server-java) -### 3、TTS 经常失败,经常超时 ⏰ + 小智开源后端服务 Java 版本是一个基于 Java 的开源项目,它包括前后端的服务,旨在为用户提供一个完整的后端服务解决方案。 +--- +## 功能清单 ✨ -建议:如果 `EdgeTTS` 经常失败,请先检查是否使用了代理(梯子)。如果使用了,请尝试关闭代理后再试; -如果用的是火山引擎的豆包 TTS,经常失败时建议使用付费版本,因为测试版本仅支持 2 个并发。 +### 已实现 ✅ -### 4、如何提高小智对话响应速度? ⚡ +- **通信协议** + 基于 `xiaozhi-esp32` 协议,通过 WebSocket 实现数据交互。 +- **对话交互** + 支持唤醒对话、手动对话及实时打断。长时间无对话时自动休眠 +- **意图识别** + 支持使用LLM意图识别、function call函数调用,减少硬编码意图判断 +- **多语言识别** + 支持国语、粤语、英语、日语、韩语(默认使用 FunASR)。 +- **LLM 模块** + 支持灵活切换 LLM 模块,默认使用 ChatGLMLLM,也可选用阿里百炼、DeepSeek、Ollama 等接口。 +- **TTS 模块** + 支持 EdgeTTS(默认)、火山引擎豆包 TTS 等多种 TTS 接口,满足语音合成需求。 +- **记忆功能** + 支持超长记忆、本地总结记忆、无记忆三种模式,满足不同场景需求。 +- **IOT功能** + 支持管理注册设备IOT功能,支持基于对话上下文语境下的智能物联网控制。 -本项目默认配置为低成本方案,建议初学者先使用默认免费模型,解决“跑得动”的问题,再优化“跑得快”。 -如需提升响应速度,可尝试更换各组件。以下为各组件的响应速度测试数据(仅供参考,不构成承诺): +### 正在开发 🚧 -| 影响因素 | 因素值 | -|:-----:|:----------------:| -| 测试地点 | 广东省广州市海珠区 | -| 测试时间 | 2025年2月19日 12:52 | -| 宽带运营商 | 中国联通 | +- 多种心情模式 +- 智控台webui -测试方法: +想了解具体开发进度,[请点击这里](https://github.com/users/xinnan-tech/projects/3) -1、把各组件的密钥配置上去,只有配置了密钥的组件才参与测试。 +如果你是一名软件开发者,这里有一份[《致开发者的公开信》](docs/contributor_open_letter.md),欢迎加入! -2、配置完密钥后,执行以下方法 +--- -``` -# 进入项目根目录,执行以下命令: -conda activate xiaozhi-esp32-server -python performance_tester.py -``` +## 本项目支持的平台/组件列表 📋 -生成报告如下 +### LLM 语言模型 -LLM 性能排行: +| 使用方式 | 支持平台 | 免费平台 | +|:---:|:---:|:---:| +| openai 接口调用 | 阿里百炼、火山引擎豆包、深度求索、智谱ChatGLM、Gemini | 智谱ChatGLM、Gemini | +| ollama 接口调用 | Ollama | - | +| dify 接口调用 | Dify | - | +| fastgpt 接口调用 | Fastgpt | - | +| coze 接口调用 | Coze | - | -| 模块名称 | 平均首Token时间 | 平均总响应时间 | -|:-----------|:-----------|:--------| -| AliLLM | 0.547s | 1.485s | -| ChatGLMLLM | 0.677s | 3.057s | +实际上,任何支持 openai 接口调用的 LLM 均可接入使用。 -TTS 性能排行: +--- -| 模块名称 | 平均合成时间 | -|----------------------|--------| -| EdgeTTS | 1.019s | -| DoubaoTTS | 0.503s | -| CosyVoiceSiliconflow | 3.732s | +### TTS 语音合成 -推荐配置组合 (综合响应速度): +| 使用方式 | 支持平台 | 免费平台 | +|:---:|:---:|:---:| +| 接口调用 | EdgeTTS、火山引擎豆包TTS、腾讯云、阿里云TTS、CosyVoiceSiliconflow、TTS302AI、CozeCnTTS、GizwitsTTS、ACGNTTS、OpenAITTS | EdgeTTS、CosyVoiceSiliconflow(部分) | +| 本地服务 | FishSpeech、GPT_SOVITS_V2、GPT_SOVITS_V3、MinimaxTTS | FishSpeech、GPT_SOVITS_V2、GPT_SOVITS_V3、MinimaxTTS | -| 组合方案 | 综合得分 | LLM首Token | TTS合成 | -|-------------------------------|-------|-----------|--------| -| AliLLM + DoubaoTTS | 0.539 | 0.547s | 0.503s | -| AliLLM + EdgeTTS | 0.642 | 0.547s | 1.019s | -| ChatGLMLLM + DoubaoTTS | 0.642 | 0.677s | 0.503s | -| ChatGLMLLM + EdgeTTS | 0.745 | 0.677s | 1.019s | -| AliLLM + CosyVoiceSiliconflow | 1.184 | 0.547s | 3.732s | +--- -### 结论 🔍 +### VAD 语音活动检测 -`2025年2月19日`,如果我的电脑在`广东省广州市海珠区`,且使用的是`中国联通`网络,我会优先使用: +| 类型 | 平台名称 | 使用方式 | 收费模式 | 备注 | +|:---:|:---------:|:----:|:----:|:--:| +| VAD | SileroVAD | 本地使用 | 免费 | | -- LLM:`AliLLM` -- TTS:`DoubaoTTS` +--- -### 5、我说话很慢,停顿时小智老是抢话 🗣️ +### ASR 语音识别 -建议:在配置文件中找到如下部分,将 `min_silence_duration_ms` 的值调大(例如改为 `1000`): +| 使用方式 | 支持平台 | 免费平台 | +|:---:|:---:|:---:| +| 本地使用 | FunASR、SherpaASR | FunASR、SherpaASR | +| 接口调用 | DoubaoASR | - | -```yaml -VAD: - SileroVAD: - threshold: 0.5 - model_dir: models/snakers4_silero-vad - min_silence_duration_ms: 700 # 如果说话停顿较长,可将此值调大 -``` +--- -### 6、我想通过小智控制电灯、空调、远程开关机等操作 💡 +### Memory 记忆存储 -建议:在配置文件中将 `LLM` 设置为 `HomeAssistant`,通过 调用`HomeAssistant`接口实现相关控制。 +| 类型 | 平台名称 | 使用方式 | 收费模式 | 备注 | +|:------:|:---------------:|:----:|:---------:|:--:| +| Memory | mem0ai | 接口调用 | 1000次/月额度 | | +| Memory | mem_local_short | 本地总结 | 免费 | | -### 7、更多问题,可联系我们反馈 💬 +--- -我们的联系方式放在[百度网盘中,点击前往](https://pan.baidu.com/s/1x6USjvP1nTRsZ45XlJu65Q),提取码是`223y`。 +### Intent 意图识别 -网盘里有“硬件烧录QQ群”、“开源服务端交流群”、“产品建议联系人” 三张图片,请根据需要选择加入。 - -- 硬件烧录QQ群:适用于硬件烧录问题 -- 开源服务端交流群:适用于服务端问题 -- 产品建议联系人:适用于产品功能、产品设计等建议 +| 类型 | 平台名称 | 使用方式 | 收费模式 | 备注 | +|:------:|:-------------:|:----:|:-------:|:---------------------:| +| Intent | intent_llm | 接口调用 | 根据LLM收费 | 通过大模型识别意图,通用性强 | +| Intent | function_call | 接口调用 | 根据LLM收费 | 通过大模型函数调用完成意图,速度快,效果好 | --- @@ -395,4 +303,4 @@ VAD: Star History Chart - + \ No newline at end of file diff --git a/README_en.md b/README_en.md index 88306675..1dd70554 100644 --- a/README_en.md +++ b/README_en.md @@ -1,8 +1,29 @@ +[![Banners](docs/images/banner1.png)](https://github.com/xinnan-tech/xiaozhi-esp32-server) + +
+

Xiaozhi Backend Server xiaozhi-esp32-server

+
-[![SVG Banners](https://svg-banners.vercel.app/api?type=origin&text1=Hello😃,%20XiaoZhi📟&text2=Open%20Source%20XiaoZhi%20ESP-32%20Backend%20Service&width=830&height=210)](https://github.com/xinnan-tech/xiaozhi-esp32-server)

+This project provides backend services for the open-source smart hardware project +xiaozhi-esp32
+Implemented in Python according to the Xiaozhi Communication Protocol
+Helping you quickly set up your Xiaozhi server +

+ +

+简体中文 +· English +· ChangelogDeployment GuideReport Issues +

+

+ + GitHub Contributors + - GitHub Contributors + GitHub Contributors Issues @@ -10,79 +31,114 @@ GitHub pull requests + + GitHub pull requests + + + GitHub pull requests +

-# XiaoZhi ESP-32 Backend Service (xiaozhi-esp32-server) - -([中文](README.md) | English) - -This project provides the backend service for the open source smart hardware project [xiaozhi-esp32](https://github.com/78/xiaozhi-esp32). It is implemented in `Python` based on the [XiaoZhi Communication Protocol](https://ccnphfhqs21z.feishu.cn/wiki/M0XiwldO9iJwHikpXD5cEx71nKh). - --- -## Target Audience 👥 +## Target Users 👥 -This project is designed to be used in conjunction with ESP32 hardware devices. If you have already purchased an ESP32 device, successfully connected to the backend service deployed by XieGe, and now wish to set up your own `xiaozhi-esp32` backend service, then this project is perfect for you. +This project requires ESP32 hardware devices. If you have purchased ESP32-related hardware, successfully connected to Brother Xia's backend service, and wish to set up your own `xiaozhi-esp32` backend service, then this project is perfect for you. -Want to see it in action? Check out the videos 🎥 +Want to see it in action? Check out these videos 🎥 + + + + + +
- - - XiaoZhi ESP32 connecting to a custom backend model - - + + + Xiaozhi esp32 connecting to your own backend model + + - - - Custom Voice - - + + + Custom voice + + - - - Conversing in Cantonese - - + + + Communicating in Cantonese + + - - - Control Home Appliances - - + + + Control home appliances + + - - - Lowest Cost Configuration - - + + + Lowest cost configuration + + +
+ + + Custom voice + + + + + Play music + + + + + + Weather plugin + + + + + + IOT command control device + + + + + + News broadcast + +
--- -## System Requirements and Deployment Prerequisites 🖥️ +## System Requirements and Prerequisites 🖥️ -- **Hardware**: A set of devices compatible with `xiaozhi-esp32` (for specific models, please refer to [this link](https://rcnv1t9vps13.feishu.cn/wiki/DdgIw4BUgivWDPkhMj1cGIYCnRf)). -- **Server**: A computer with at least a 4-core CPU and 8GB of memory. -- **Firmware Compilation**: Please update the backend service API endpoint in the `xiaozhi-esp32` project, then recompile the firmware and flash it to your device. +- **Computer or Server**: Recommended 4-core CPU, 8GB RAM computer. If using ASR with API, can run on a 2-core CPU, 2GB RAM server. +- **Update Client Interface**: Please update the backend service interface address in the client. --- ## Warning ⚠️ -This project is relatively new and has not yet undergone network security evaluations. **Do not use it in a production environment.** +1. This is open-source software. This software and any third-party API service providers it interfaces with (including but not limited to speech recognition, large language models, speech synthesis, and other platforms) have no commercial partnership. We do not provide any form of guarantee for their service quality or financial security. +We recommend users prioritize service providers with relevant business licenses and carefully read their service agreements and privacy policies. This software does not host any account keys, does not participate in fund transfers, and does not bear the risk of recharge fund losses. -If you deploy this project on a public network for learning purposes, be sure to enable protection in the configuration file `config.yaml`: +2. This project is relatively new and has not yet passed network security testing. Please do not use it in production environments. If you deploy this project for learning purposes in a public network environment, please make sure to enable protection in the `config.yaml` configuration file: ```yaml server: @@ -91,202 +147,151 @@ server: enabled: true ``` -Once protection is enabled, you will need to validate the machine's token or MAC address based on your actual situation. Please refer to the configuration documentation for details. +After enabling protection, you need to verify the machine's token or MAC address according to actual circumstances. Please refer to the configuration documentation for details. --- +## Deployment Methods 🚀 + +### I. [Deployment Guide](./docs/Deployment.md) + +This project supports three deployment methods. You can choose based on your actual needs. + +1. [Quick Docker Deployment](./docs/Deployment.md) + +Suitable for regular users who want to quickly experience without much environment configuration. The downside is that pulling the image can be slow. Video tutorial available: [Beautiful expert teaches Docker deployment](https://www.bilibili.com/video/BV1RNQnYDE5t) + +2. [Deploy Using Docker Environment](./docs/Deployment.md#%E6%96%B9%E5%BC%8F%E4%BA%8C%E5%80%9F%E5%8A%A9docker%E7%8E%AF%E5%A2%83%E8%BF%90%E8%A1%8C%E9%83%A8%E7%BD%B2) + +For software engineers who have Docker installed and want to make custom code modifications. + +3. [Local Source Code Run](./docs/Deployment.md#%E6%96%B9%E5%BC%8F%E4%B8%89%E6%9C%AC%E5%9C%B0%E6%BA%90%E7%A0%81%E8%BF%90%E8%A1%8C) + +Suitable for users familiar with `Conda` environment or who want to build the running environment from scratch. + +For scenarios requiring higher response speed, we recommend using the local source code run method to reduce additional overhead. Video tutorial available: [Handsome expert teaches source code deployment](https://www.bilibili.com/video/BV1GvQWYZEd2) + +### II. [Firmware Compilation](./docs/firmware-build.md) + +Click here to view the detailed process of [firmware compilation](./docs/firmware-build.md). + +After successful flashing and network connection, wake up Xiaozhi using the wake word and pay attention to the console output on the server side. + +--- + +## Common Questions ❓ + +For issues or product suggestions, please [click here](docs/FAQ.md). + +--- + +## Product Ecosystem 👬 +Xiaozhi is an ecosystem. When using this product, you might want to check out other excellent projects in this ecosystem: + +- [Xiaozhi Android Client](https://github.com/TOM88812/xiaozhi-android-client) + A voice dialogue application based on xiaozhi-server for Android and iOS, supporting real-time voice interaction and text dialogue. Now in Flutter version, supporting both iOS and Android. +- [Xiaozhi PC Client](https://github.com/Huang-junsen/py-xiaozhi) + This project provides a Python-based Xiaobai AI client, allowing you to experience Xiaozhi AI features through code even without physical hardware. Main features include AI voice interaction, visual multimodal recognition, IoT device integration, online music playback, voice wake-up, automatic dialogue mode, graphical interface, command-line mode, cross-platform support, volume control, session management, encrypted audio transmission, automatic verification code processing, etc. +- [Xiaozhi Java Server](https://github.com/joey-zhou/xiaozhi-esp32-server-java) + + The Xiaozhi open-source backend service Java version is a Java-based open-source project that includes both frontend and backend services, aiming to provide users with a complete backend service solution. +--- ## Feature List ✨ ### Implemented ✅ - **Communication Protocol** - Based on the `xiaozhi-esp32` protocol, data exchange is implemented via WebSocket. + Based on `xiaozhi-esp32` protocol, implementing data interaction through WebSocket. - **Dialogue Interaction** - Supports wake-up dialogues, manual conversations, and real-time interruptions. Automatically enters sleep mode after long periods of inactivity. -- **Multilingual Recognition** - Supports Mandarin, Cantonese, English, Japanese, and Korean (default using FunASR). + Supports wake-up dialogue, manual dialogue, and real-time interruption. Automatically sleeps after long periods without dialogue +- **Intent Recognition** + Supports LLM intent recognition and function call, reducing hard-coded intent judgment +- **Multi-language Recognition** + Supports Mandarin, Cantonese, English, Japanese, Korean (default using FunASR). - **LLM Module** - Allows flexible switching of LLM modules. The default is ChatGLMLLM, with options to use AliLLM, DeepSeek, Ollama, and others. + Supports flexible switching of LLM modules, default using ChatGLMLLM, can also use Alibaba Bailian, DeepSeek, Ollama, and other interfaces. - **TTS Module** - Supports multiple TTS interfaces including EdgeTTS (default) and Volcano Engine Doubao TTS to meet speech synthesis requirements. + Supports EdgeTTS (default), Volcano Engine Doubao TTS, and other TTS interfaces to meet speech synthesis needs. +- **Memory Function** + Supports ultra-long memory, local summary memory, and no memory modes to meet different scenario needs. +- **IOT Function** + Supports managing registered device IOT functions, supporting intelligent IoT control based on dialogue context. -### In Development 🚧 +### Under Development 🚧 -- Conversation Memory Feature -- Multiple Mood Modes -- Smart Control Panel Web UI +- Multiple mood modes +- Smart control panel webui -![Screenshot](docs/images/webui.png) +To learn about specific development progress, [click here](https://github.com/users/xinnan-tech/projects/3) + +If you are a software developer, here's an [Open Letter to Developers](docs/contributor_open_letter.md), welcome to join! --- -## Supported Platforms/Components 📋 +## Supported Platforms/Components List 📋 -### LLM +### LLM Language Models -| Type | Platform Name | Usage Method | Pricing Model | Remarks | -|:----:|:-----------------------------:|:-----------------------------:|:-----------------:|:-------------------------------------------------------------------------:| -| LLM | AliLLM (阿里百炼) | OpenAI API call | Token consumption | [Click to apply for API key](https://bailian.console.aliyun.com/?apiKey=1#/api-key) | -| LLM | DeepSeekLLM (深度求索) | OpenAI API call | Token consumption | [Click to apply for API key](https://platform.deepseek.com/) | -| LLM | ChatGLMLLM (智谱) | OpenAI API call | Free | Although free, you still need to [click to apply for an API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys) | -| LLM | OllamaLLM | Ollama API call | Free/Custom | Requires pre-downloading the model (`ollama pull`); service URL: `http://localhost:11434` | -| LLM | DifyLLM | Dify API call | Token consumption | For local deployment. Note that prompt configuration must be set in the Dify console. | -| LLM | GeminiLLM | Gemini API call | Free | [Click to apply for API key](https://aistudio.google.com/apikey) | -| LLM | CozeLLM | Coze API call | Token consumption | Requires providing bot_id, user_id, and personal token. | -| LLM | Home Assistant | Home Assistant voice assistant API call | Free | Requires providing a Home Assistant token. | +| Usage Method | Supported Platforms | Free Platforms | +|:---:|:---:|:---:| +| openai interface call | Alibaba Bailian, Volcano Engine Doubao, DeepSeek, Zhipu ChatGLM, Gemini | Zhipu ChatGLM, Gemini | +| ollama interface call | Ollama | - | +| dify interface call | Dify | - | +| fastgpt interface call | Fastgpt | - | +| coze interface call | Coze | - | -In fact, any LLM that supports OpenAI API calls can be integrated. +In fact, any LLM supporting openai interface calls can be integrated. --- -### TTS +### TTS Speech Synthesis -| Type | Platform Name | Usage Method | Pricing Model | Remarks | -|:----:|:--------------------------------------:|:------------:|:-----------------:|:--------------------------------------------------------------------------------------:| -| TTS | EdgeTTS | API call | Free | Default TTS based on Microsoft's speech synthesis technology. | -| TTS | DoubaoTTS (火山引擎豆包 TTS) | API call | Token consumption | [Click to create an API key](https://console.volcengine.com/speech/service/8); it is recommended to use the paid version for higher concurrency. | -| TTS | CosyVoiceSiliconflow | API call | Token consumption | Requires application for the Siliconflow API key; output format is WAV. | -| TTS | CozeCnTTS | API call | Token consumption | Requires providing a Coze API key; output format is WAV. | -| TTS | FishSpeech | API call | Free/Custom | Starts a local TTS service; see the configuration file for startup instructions. | -| TTS | GPT_SOVITS_V2 | API call | Free/Custom | Starts a local TTS service, suitable for personalized speech synthesis scenarios. | +| Usage Method | Supported Platforms | Free Platforms | +|:---:|:---:|:---:| +| Interface Call | EdgeTTS, Volcano Engine Doubao TTS, Tencent Cloud, Alibaba Cloud TTS, CosyVoiceSiliconflow, TTS302AI, CozeCnTTS, GizwitsTTS, ACGNTTS, OpenAITTS | EdgeTTS, CosyVoiceSiliconflow(partial) | +| Local Service | FishSpeech, GPT_SOVITS_V2, GPT_SOVITS_V3, MinimaxTTS | FishSpeech, GPT_SOVITS_V2, GPT_SOVITS_V3, MinimaxTTS | --- -### VAD +### VAD Voice Activity Detection -| Type | Platform Name | Usage Method | Pricing Model | Remarks | -|:----:|:-------------------:|:------------:|:-------------:|:-------:| -| VAD | SileroVAD | Local | Free | | +| Type | Platform Name | Usage Method | Pricing Model | Notes | +|:---:|:---------:|:----:|:----:|:--:| +| VAD | SileroVAD | Local Use | Free | | --- -### ASR +### ASR Speech Recognition -| Type | Platform Name | Usage Method | Pricing Model | Remarks | -|:----:|:-------------------:|:------------:|:-------------:|:-------:| -| ASR | FunASR | Local | Free | | -| ASR | SherpaASR | Local | Free | | -| ASR | DoubaoASR | API call | Paid | | +| Usage Method | Supported Platforms | Free Platforms | +|:---:|:---:|:---:| +| Local Use | FunASR, SherpaASR | FunASR, SherpaASR | +| Interface Call | DoubaoASR | - | --- -## Usage 🚀 +### Memory Storage -### 1. [Deployment Documentation](./docs/Deployment.md) - -This project supports three deployment methods. Choose the one that best fits your needs. - -The documentation provided here is a **written tutorial**. If you prefer a **video tutorial**, you can refer to [this expert's hands-on guide](https://www.bilibili.com/video/BV1gePuejEvT). - -Combining both the written and video tutorials can help you get started more quickly. - -1. [Docker Quick Deployment](./docs/Deployment.md) - Suitable for general users who want a quick experience without extensive environment configuration. The only downside is that pulling the image can be a bit slow. - -2. [Deployment Using Docker Environment](./docs/Deployment.md#%E6%96%B9%E5%BC%8F%E4%BA%8C%E5%80%9F%E5%8A%A9docker%E7%8E%AF%E5%A2%83%E8%BF%90%E8%A1%8C%E9%83%A8%E7%BD%B2) - Ideal for software engineers who already have Docker installed and wish to customize the code. - -3. [Running from Local Source Code](./docs/Deployment.md#%E6%96%B9%E5%BC%8F%E4%B8%89%E6%9C%AC%E5%9C%B0%E6%BA%90%E7%A0%81%E8%BF%90%E8%A1%8C) - Suitable for users familiar with the `Conda` environment or those who wish to build the runtime environment from scratch. - -For scenarios requiring higher response speeds, running from the local source code is recommended to reduce additional overhead. - -### 2. [Firmware Compilation](./docs/firmware-build.md) - -Click [here](./docs/firmware-build.md) for a detailed guide on firmware compilation. - -After successful compilation and network connection, wake up XiaoZhi using the wake-up word and monitor the server console for output. +| Type | Platform Name | Usage Method | Pricing Model | Notes | +|:------:|:---------------:|:----:|:---------:|:--:| +| Memory | mem0ai | Interface Call | 1000 times/month quota | | +| Memory | mem_local_short | Local Summary | Free | | --- -## Frequently Asked Questions ❓ +### Intent Recognition -### 1. TTS often fails and times out ⏰ - -**Suggestion:** -If `EdgeTTS` frequently fails, please first check whether you are using a proxy (VPN). If so, try disabling the proxy and try again. If you are using Volcano Engine Doubao TTS and it often fails, it is recommended to use the paid version since the trial only supports 2 concurrent requests. - -### 2. I want to control lights, air conditioners, remote power on/off, etc. with XiaoZhi 💡 - -**Suggestion:** -Set the `LLM` to `HomeAssistant` in the configuration file and use the `HomeAssistant` API to perform the relevant controls. - -### 3. I speak slowly, and XiaoZhi always interrupts during pauses 🗣️ - -**Suggestion:** -Locate the following section in the configuration file and increase the value of `min_silence_duration_ms` (for example, change it to `1000`): - -```yaml -VAD: - SileroVAD: - threshold: 0.5 - model_dir: models/snakers4_silero-vad - min_silence_duration_ms: 700 # If your pauses are longer, increase this value -``` - -### 4. Why does XiaoZhi recognize a lot of Korean, Japanese, and English in what I say? 🇰🇷 - -**Suggestion:** -Check whether the `model.pt` file exists in the `models/SenseVoiceSmall` directory. If it does not, please download it. See [Download ASR Model Files](docs/Deployment.md#模型文件) for details. - -### 5. Why does the error “TTS task error: file does not exist” occur? 📁 - -**Suggestion:** -Verify that you have correctly installed the `libopus` and `ffmpeg` libraries using `conda`. If not, install them using: - -``` -conda install conda-forge::libopus -conda install conda-forge::ffmpeg -``` - -### 6. How can I improve XiaoZhi's dialogue response speed? ⚡ - -The default configuration of this project is designed to be cost-effective. It is recommended that beginners first use the default free models to ensure that the system runs smoothly, then optimize for faster response times. -To improve response speed, you can try replacing individual components. Below are the response time test results for each component (for reference only, not a guarantee): - -**LLM Performance Ranking:** - -| Module Name | Average First Token Time | Average Total Response Time | -|--------------|--------------------------|-----------------------------| -| AliLLM | 0.547s | 1.485s | -| ChatGLMLLM | 0.677s | 3.057s | -| OllamaLLM | 0.003s | 0.003s | - -**TTS Performance Ranking:** - -| Module Name | Average Synthesis Time | -|----------------------------|------------------------| -| EdgeTTS | 1.019s | -| DoubaoTTS | 0.503s | -| CosyVoiceSiliconflow | 3.732s | - -**Recommended Configuration Combination (Overall Response Speed):** - -| Combination Scheme | Overall Score | LLM First Token | TTS Synthesis | -|-----------------------------------|---------------|-----------------|---------------| -| AliLLM + DoubaoTTS | 0.539 | 0.547s | 0.503s | -| AliLLM + EdgeTTS | 0.642 | 0.547s | 1.019s | -| ChatGLMLLM + DoubaoTTS | 0.642 | 0.677s | 0.503s | -| ChatGLMLLM + EdgeTTS | 0.745 | 0.677s | 1.019s | -| AliLLM + CosyVoiceSiliconflow | 1.184 | 0.547s | 3.732s | - -**Conclusion 🔍** - -_As of February 19, 2025, if my computer were located in Haizhu District, Guangzhou, Guangdong Province, and connected via China Unicom, I would prioritize using:_ - -- **LLM:** `AliLLM` -- **TTS:** `DoubaoTTS` - -### 7. For more questions, feel free to contact us for feedback 💬 - -Our contact information is in [Baidu Netdisk](https://pan.baidu.com/s/1x6USjvP1nTRsZ45XlJu65Q),The extraction code is`223y`。 +| Type | Platform Name | Usage Method | Pricing Model | Notes | +|:------:|:-------------:|:----:|:-------:|:---------------------:| +| Intent | intent_llm | Interface Call | Based on LLM pricing | Intent recognition through large models, highly generalizable | +| Intent | function_call | Interface Call | Based on LLM pricing | Intent completion through large model function calls, fast and effective | --- -## Acknowledgements 🙏 +## Acknowledgments 🙏 -- This project was inspired by the [Bailing Voice Dialogue Robot](https://github.com/wwbin2017/bailing) and implemented based on it. -- Many thanks to [Tenclass](https://www.tenclass.com/) for providing detailed documentation support for the XiaoZhi communication protocol. +- This project was inspired by [Bailing Voice Dialogue Robot](https://github.com/wwbin2017/bailing) and implemented based on it. +- Thanks to [Tenclass](https://www.tenclass.com/) for providing detailed documentation support for the Xiaozhi communication protocol. @@ -294,4 +299,4 @@ Our contact information is in [Baidu Netdisk](https://pan.baidu.com/s/1x6USjvP1n Star History Chart - \ No newline at end of file + \ No newline at end of file diff --git a/docs/Deployment.md b/docs/Deployment.md index 8765d26f..7338a981 100644 --- a/docs/Deployment.md +++ b/docs/Deployment.md @@ -241,7 +241,7 @@ pip install -r requirements.txt ## 4.配置项目文件 -接下里,程序还不能直接运行,你需要配置一下,你到底使用的是什么模型。你可以看这个教程: +接下来,程序还不能直接运行,你需要配置一下,你到底使用的是什么模型。你可以看这个教程: [跳转到配置项目文件](#配置项目) ## 5.运行项目 @@ -328,14 +328,14 @@ LLM: 以下是一些常见问题,供参考: -[1、为什么我说的话,小智识别出来很多韩文、日文、英文](../README.md#1%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E8%AF%B4%E7%9A%84%E8%AF%9D%E5%B0%8F%E6%99%BA%E8%AF%86%E5%88%AB%E5%87%BA%E6%9D%A5%E5%BE%88%E5%A4%9A%E9%9F%A9%E6%96%87%E6%97%A5%E6%96%87%E8%8B%B1%E6%96%87) +[1、为什么我说的话,小智识别出来很多韩文、日文、英文](./FAQ.md#1%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E8%AF%B4%E7%9A%84%E8%AF%9D%E5%B0%8F%E6%99%BA%E8%AF%86%E5%88%AB%E5%87%BA%E6%9D%A5%E5%BE%88%E5%A4%9A%E9%9F%A9%E6%96%87%E6%97%A5%E6%96%87%E8%8B%B1%E6%96%87) -[2、为什么会出现“TTS 任务出错 文件不存在”?](../README.md#1%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E8%AF%B4%E7%9A%84%E8%AF%9D%E5%B0%8F%E6%99%BA%E8%AF%86%E5%88%AB%E5%87%BA%E6%9D%A5%E5%BE%88%E5%A4%9A%E9%9F%A9%E6%96%87%E6%97%A5%E6%96%87%E8%8B%B1%E6%96%87) +[2、为什么会出现“TTS 任务出错 文件不存在”?](./FAQ.md#1%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E8%AF%B4%E7%9A%84%E8%AF%9D%E5%B0%8F%E6%99%BA%E8%AF%86%E5%88%AB%E5%87%BA%E6%9D%A5%E5%BE%88%E5%A4%9A%E9%9F%A9%E6%96%87%E6%97%A5%E6%96%87%E8%8B%B1%E6%96%87) -[3、TTS 经常失败,经常超时](../README.md#1%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E8%AF%B4%E7%9A%84%E8%AF%9D%E5%B0%8F%E6%99%BA%E8%AF%86%E5%88%AB%E5%87%BA%E6%9D%A5%E5%BE%88%E5%A4%9A%E9%9F%A9%E6%96%87%E6%97%A5%E6%96%87%E8%8B%B1%E6%96%87) +[3、TTS 经常失败,经常超时](./FAQ.md#1%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E8%AF%B4%E7%9A%84%E8%AF%9D%E5%B0%8F%E6%99%BA%E8%AF%86%E5%88%AB%E5%87%BA%E6%9D%A5%E5%BE%88%E5%A4%9A%E9%9F%A9%E6%96%87%E6%97%A5%E6%96%87%E8%8B%B1%E6%96%87) -[4、如何提高小智对话响应速度?](../README.md#1%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E8%AF%B4%E7%9A%84%E8%AF%9D%E5%B0%8F%E6%99%BA%E8%AF%86%E5%88%AB%E5%87%BA%E6%9D%A5%E5%BE%88%E5%A4%9A%E9%9F%A9%E6%96%87%E6%97%A5%E6%96%87%E8%8B%B1%E6%96%87) +[4、如何提高小智对话响应速度?](./FAQ.md#1%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E8%AF%B4%E7%9A%84%E8%AF%9D%E5%B0%8F%E6%99%BA%E8%AF%86%E5%88%AB%E5%87%BA%E6%9D%A5%E5%BE%88%E5%A4%9A%E9%9F%A9%E6%96%87%E6%97%A5%E6%96%87%E8%8B%B1%E6%96%87) -[5、我说话很慢,停顿时小智老是抢话](../README.md#1%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E8%AF%B4%E7%9A%84%E8%AF%9D%E5%B0%8F%E6%99%BA%E8%AF%86%E5%88%AB%E5%87%BA%E6%9D%A5%E5%BE%88%E5%A4%9A%E9%9F%A9%E6%96%87%E6%97%A5%E6%96%87%E8%8B%B1%E6%96%87) +[5、我说话很慢,停顿时小智老是抢话](./FAQ.md#1%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E8%AF%B4%E7%9A%84%E8%AF%9D%E5%B0%8F%E6%99%BA%E8%AF%86%E5%88%AB%E5%87%BA%E6%9D%A5%E5%BE%88%E5%A4%9A%E9%9F%A9%E6%96%87%E6%97%A5%E6%96%87%E8%8B%B1%E6%96%87) -[6、我想通过小智控制电灯、空调、远程开关机等操作](../README.md#1%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E8%AF%B4%E7%9A%84%E8%AF%9D%E5%B0%8F%E6%99%BA%E8%AF%86%E5%88%AB%E5%87%BA%E6%9D%A5%E5%BE%88%E5%A4%9A%E9%9F%A9%E6%96%87%E6%97%A5%E6%96%87%E8%8B%B1%E6%96%87) \ No newline at end of file +[6、我想通过小智控制电灯、空调、远程开关机等操作](./FAQ.md#1%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E8%AF%B4%E7%9A%84%E8%AF%9D%E5%B0%8F%E6%99%BA%E8%AF%86%E5%88%AB%E5%87%BA%E6%9D%A5%E5%BE%88%E5%A4%9A%E9%9F%A9%E6%96%87%E6%97%A5%E6%96%87%E8%8B%B1%E6%96%87) diff --git a/docs/FAQ.md b/docs/FAQ.md new file mode 100644 index 00000000..8acdb1a0 --- /dev/null +++ b/docs/FAQ.md @@ -0,0 +1,139 @@ +# 常见问题 ❓ + +### 1、为什么我说的话,小智识别出来很多韩文、日文、英文?🇰🇷 + +建议:检查一下`models/SenseVoiceSmall`是否已经有`model.pt` +文件,如果没有就要下载,查看这里[下载语音识别模型文件](Deployment.md#模型文件) + +### 2、为什么会出现"TTS 任务出错 文件不存在"?📁 + +建议:检查一下是否正确使用`conda` 安装了`libopus`和`ffmpeg`库。 + +如果没有安装,就安装 + +``` +conda install conda-forge::libopus +conda install conda-forge::ffmpeg +``` + +### 3、TTS 经常失败,经常超时 ⏰ + +建议:如果 `EdgeTTS` 经常失败,请先检查是否使用了代理(梯子)。如果使用了,请尝试关闭代理后再试; +如果用的是火山引擎的豆包 TTS,经常失败时建议使用付费版本,因为测试版本仅支持 2 个并发。 + +### 4、如何提高小智对话响应速度? ⚡ + +本项目默认配置为低成本方案,建议初学者先使用默认免费模型,解决"跑得动"的问题,再优化"跑得快"。 +如需提升响应速度,可尝试更换各组件。以下为各组件的响应速度测试数据(仅供参考,不构成承诺): + +| 影响因素 | 因素值 | +|:-----:|:----------------:| +| 测试地点 | 广东省广州市海珠区 | +| 测试时间 | 2025年2月19日 12:52 | +| 宽带运营商 | 中国联通 | + +测试方法: + +1、把各组件的密钥配置上去,只有配置了密钥的组件才参与测试。 + +2、配置完密钥后,执行以下方法 + +``` +# 进入项目根目录,执行以下命令: +conda activate xiaozhi-esp32-server +python performance_tester.py +``` + +生成报告如下 + +LLM 性能排行: + +| 模块名称 | 平均首Token时间 | 平均总响应时间 | +|:-----------|:-----------|:--------| +| AliLLM | 0.547s | 1.485s | +| ChatGLMLLM | 0.677s | 3.057s | + +TTS 性能排行: + +| 模块名称 | 平均合成时间 | +|----------------------|--------| +| EdgeTTS | 1.019s | +| DoubaoTTS | 0.503s | +| CosyVoiceSiliconflow | 3.732s | + +推荐配置组合 (综合响应速度): + +| 组合方案 | 综合得分 | LLM首Token | TTS合成 | +|-------------------------------|-------|-----------|--------| +| AliLLM + DoubaoTTS | 0.539 | 0.547s | 0.503s | +| AliLLM + EdgeTTS | 0.642 | 0.547s | 1.019s | +| ChatGLMLLM + DoubaoTTS | 0.642 | 0.677s | 0.503s | +| ChatGLMLLM + EdgeTTS | 0.745 | 0.677s | 1.019s | +| AliLLM + CosyVoiceSiliconflow | 1.184 | 0.547s | 3.732s | + +### 结论 🔍 + +`2025年2月19日`,如果我的电脑在`广东省广州市海珠区`,且使用的是`中国联通`网络,我会优先使用: + +- LLM:`AliLLM` +- TTS:`DoubaoTTS` + +### 5、我说话很慢,停顿时小智老是抢话 🗣️ + +建议:在配置文件中找到如下部分,将 `min_silence_duration_ms` 的值调大(例如改为 `1000`): + +```yaml +VAD: + SileroVAD: + threshold: 0.5 + model_dir: models/snakers4_silero-vad + min_silence_duration_ms: 700 # 如果说话停顿较长,可将此值调大 +``` + +### 6、我想通过小智控制电灯、空调、远程开关机等操作 💡 + +本项目,支持以工具调用的方式控制HomeAssistant设备 + +1、首先选择一款支持function call支持的LLM,例如`ChatGLMLLM`。 + +2、在配置文件中,将 `selected_module.Intent` 设置为 `function_call`。 + +3、登录`HomeAssistant`,点击`左下角个人`,切换`安全`导航栏,划到底部`长期访问令牌`生成api_key。 + +在配置文件中,配置好你的home assistant的`devices`(被控制的设备)和`api_key`和`base_url`等信息。例如: + +``` yaml +plugins + home_assistant: + devices: + - 客厅,玩具灯,switch.cuco_cn_460494544_cp1_on_p_2_1 + - 卧室,台灯,switch.iot_cn_831898993_socn1_on_p_2_1 + base_url: http://你的homeassistant地址:8123 + api_key: 你的home assistant api访问令牌 +``` + +最后,允许function_call 插件在配置文件中启用`hass_get_state`(必须)、`hass_set_state`(必须)、`hass_play_music`(不想用ha听音乐可以不启动),例如: + +``` yaml +Intent: + ... + function_call: + type: nointent + functions: + - change_role + - get_weather + - get_news + - hass_get_state + - hass_set_state + - hass_play_music +``` + +### 7、更多问题,可联系我们反馈 💬 + +我们的联系方式放在[百度网盘中,点击前往](https://pan.baidu.com/s/1x6USjvP1nTRsZ45XlJu65Q),提取码是`223y`。 + +网盘里有"硬件烧录QQ群"、"开源服务端交流群"、"产品建议联系人" 三张图片,请根据需要选择加入。 + +- 硬件烧录QQ群:适用于硬件烧录问题 +- 开源服务端交流群:适用于服务端问题 +- 产品建议联系人:适用于产品功能、产品设计等建议 \ No newline at end of file diff --git a/docs/firmware-build.md b/docs/firmware-build.md index b726826c..78a90ae8 100644 --- a/docs/firmware-build.md +++ b/docs/firmware-build.md @@ -92,14 +92,14 @@ https://espressif.github.io/esp-launchpad/ 以下是一些常见问题,供参考: -[1、为什么我说的话,小智识别出来很多韩文、日文、英文](../README.md#1tts-%E7%BB%8F%E5%B8%B8%E5%A4%B1%E8%B4%A5%E7%BB%8F%E5%B8%B8%E8%B6%85%E6%97%B6-) +[1、为什么我说的话,小智识别出来很多韩文、日文、英文](./FAQ.md#1tts-%E7%BB%8F%E5%B8%B8%E5%A4%B1%E8%B4%A5%E7%BB%8F%E5%B8%B8%E8%B6%85%E6%97%B6-) -[2、为什么会出现“TTS 任务出错 文件不存在”?](../README.md#1tts-%E7%BB%8F%E5%B8%B8%E5%A4%B1%E8%B4%A5%E7%BB%8F%E5%B8%B8%E8%B6%85%E6%97%B6-) +[2、为什么会出现“TTS 任务出错 文件不存在”?](./FAQ.md#1tts-%E7%BB%8F%E5%B8%B8%E5%A4%B1%E8%B4%A5%E7%BB%8F%E5%B8%B8%E8%B6%85%E6%97%B6-) -[3、TTS 经常失败,经常超时](../README.md#1tts-%E7%BB%8F%E5%B8%B8%E5%A4%B1%E8%B4%A5%E7%BB%8F%E5%B8%B8%E8%B6%85%E6%97%B6-) +[3、TTS 经常失败,经常超时](./FAQ.md#1tts-%E7%BB%8F%E5%B8%B8%E5%A4%B1%E8%B4%A5%E7%BB%8F%E5%B8%B8%E8%B6%85%E6%97%B6-) -[4、如何提高小智对话响应速度?](../README.md#1tts-%E7%BB%8F%E5%B8%B8%E5%A4%B1%E8%B4%A5%E7%BB%8F%E5%B8%B8%E8%B6%85%E6%97%B6-) +[4、如何提高小智对话响应速度?](./FAQ.md#1tts-%E7%BB%8F%E5%B8%B8%E5%A4%B1%E8%B4%A5%E7%BB%8F%E5%B8%B8%E8%B6%85%E6%97%B6-) -[5、我说话很慢,停顿时小智老是抢话](../README.md#1tts-%E7%BB%8F%E5%B8%B8%E5%A4%B1%E8%B4%A5%E7%BB%8F%E5%B8%B8%E8%B6%85%E6%97%B6-) +[5、我说话很慢,停顿时小智老是抢话](./FAQ.md#1tts-%E7%BB%8F%E5%B8%B8%E5%A4%B1%E8%B4%A5%E7%BB%8F%E5%B8%B8%E8%B6%85%E6%97%B6-) -[6、我想通过小智控制电灯、空调、远程开关机等操作](../README.md#1tts-%E7%BB%8F%E5%B8%B8%E5%A4%B1%E8%B4%A5%E7%BB%8F%E5%B8%B8%E8%B6%85%E6%97%B6-) +[6、我想通过小智控制电灯、空调、远程开关机等操作](./FAQ.md#1tts-%E7%BB%8F%E5%B8%B8%E5%A4%B1%E8%B4%A5%E7%BB%8F%E5%B8%B8%E8%B6%85%E6%97%B6-) diff --git a/docs/images/banner1.png b/docs/images/banner1.png new file mode 100644 index 00000000..974ddaf3 Binary files /dev/null and b/docs/images/banner1.png differ diff --git a/docs/images/banner2.png b/docs/images/banner2.png new file mode 100644 index 00000000..4d54073e Binary files /dev/null and b/docs/images/banner2.png differ diff --git a/docs/images/demo0.png b/docs/images/demo0.png new file mode 100644 index 00000000..99592be6 Binary files /dev/null and b/docs/images/demo0.png differ diff --git a/docs/images/demo5.png b/docs/images/demo5.png index 8e03685b..c6da2997 100644 Binary files a/docs/images/demo5.png and b/docs/images/demo5.png differ diff --git a/docs/images/demo9.png b/docs/images/demo9.png index 74b6e463..ce74a02d 100644 Binary files a/docs/images/demo9.png and b/docs/images/demo9.png differ diff --git a/docs/images/webui.png b/docs/images/webui.png deleted file mode 100644 index 4d4ae599..00000000 Binary files a/docs/images/webui.png and /dev/null differ diff --git a/main/README.md b/main/README.md index df4e57a4..9dc57ee3 100644 --- a/main/README.md +++ b/main/README.md @@ -1,4 +1,4 @@ -本文档是开发类文档,如需部署小智服务端,[点击这里查看部署教程](../README.md#%E4%BD%BF%E7%94%A8%E6%96%B9%E5%BC%8F-) +本文档是开发类文档,如需部署小智服务端,[点击这里查看部署教程](./FAQ.md#%E4%BD%BF%E7%94%A8%E6%96%B9%E5%BC%8F-) # 项目目录介绍 当你看到这份文件的时候,这个这个项目还没完善好。我们还有很多东西要做。 @@ -18,6 +18,4 @@ xiaozhi-esp32-server # manager-web 、manager-api接口协议 -[manager前后端接口协议](https://app.apifox.com/invite/project?token=eXg2_tUv85q-gc3ZRowmn) - -[前端页面设计图](https://codesign.qq.com/app/s/526108506410828) +https://2662r3426b.vicp.fun/xiaozhi-esp32-api/api/v1/doc.html diff --git a/main/manager-api/README.md b/main/manager-api/README.md index 27e4ab10..5f7fda86 100644 --- a/main/manager-api/README.md +++ b/main/manager-api/README.md @@ -1,16 +1,15 @@ -本文档是开发类文档,如需部署小智服务端,[点击这里查看部署教程](../../README.md#%E4%BD%BF%E7%94%A8%E6%96%B9%E5%BC%8F-) +本文档是开发类文档,如需部署小智服务端,[点击这里查看部署教程](.././FAQ.md#%E4%BD%BF%E7%94%A8%E6%96%B9%E5%BC%8F-) # 项目介绍 manager-api 该项目基于SpringBoot框架开发。 开发使用代码编辑器,导入项目时,选择`manager-api`文件夹作为项目目录 -参照[manager前后端接口协议](https://app.apifox.com/invite/project?token=H_8qhgfjUeaAL0wybghgU)开发 - # 开发环境 JDK 21 Maven 3.8+ MySQL 8.0+ +Redis 5.0+ Vue 3.x # 创建数据库 @@ -43,6 +42,30 @@ spring: password: 123456 ``` + +# 连接Redis + +如果还没有Redis,你可以通过docker安装redis + +``` +docker run --name xiaozhi-esp32-server-redis -d -p 6379:6379 redis +``` + +# 确认项目Redis连接信息 + +在`src/main/resources/application-dev.yml`中配置Redis连接信息 + +``` +spring: + data: + redis: + host: localhost + port: 6379 + password: + database: 0 +``` + + # 测试启动 本项目为SpringBoot项目,启动方式为: diff --git a/main/manager-api/pom.xml b/main/manager-api/pom.xml index eacbdff9..9ad38043 100644 --- a/main/manager-api/pom.xml +++ b/main/manager-api/pom.xml @@ -18,7 +18,7 @@ UTF-8 UTF-8 21 - 5.12.0 + 5.10.1 1.2.20 3.5.5 5.8.24 @@ -27,7 +27,6 @@ 2.0.2 1.6.2 33.0.0-jre - 3.3.2 4.20.0 @@ -88,6 +87,36 @@ ${junit.version} test + + org.junit.jupiter + junit-jupiter-engine + ${junit.version} + test + + + org.junit.jupiter + junit-jupiter-params + ${junit.version} + test + + + org.junit.platform + junit-platform-launcher + 1.10.1 + test + + + org.junit.platform + junit-platform-commons + 1.10.1 + test + + + org.junit.platform + junit-platform-engine + 1.10.1 + test + org.springframework.boot spring-boot-starter-test diff --git a/main/manager-api/src/main/java/xiaozhi/common/annotation/DataFilter.java b/main/manager-api/src/main/java/xiaozhi/common/annotation/DataFilter.java index b25c6fb4..9bd6cb9d 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/annotation/DataFilter.java +++ b/main/manager-api/src/main/java/xiaozhi/common/annotation/DataFilter.java @@ -1,6 +1,10 @@ package xiaozhi.common.annotation; -import java.lang.annotation.*; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; /** * 数据过滤注解 diff --git a/main/manager-api/src/main/java/xiaozhi/common/annotation/LogOperation.java b/main/manager-api/src/main/java/xiaozhi/common/annotation/LogOperation.java index b2514ef5..6f6f778d 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/annotation/LogOperation.java +++ b/main/manager-api/src/main/java/xiaozhi/common/annotation/LogOperation.java @@ -1,6 +1,10 @@ package xiaozhi.common.annotation; -import java.lang.annotation.*; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; /** * 操作日志注解 diff --git a/main/manager-api/src/main/java/xiaozhi/common/aspect/RedisAspect.java b/main/manager-api/src/main/java/xiaozhi/common/aspect/RedisAspect.java index 69248613..d4233e72 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/aspect/RedisAspect.java +++ b/main/manager-api/src/main/java/xiaozhi/common/aspect/RedisAspect.java @@ -1,14 +1,15 @@ package xiaozhi.common.aspect; -import xiaozhi.common.exception.ErrorCode; -import xiaozhi.common.exception.RenException; -import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import lombok.extern.slf4j.Slf4j; +import xiaozhi.common.exception.ErrorCode; +import xiaozhi.common.exception.RenException; + /** * Redis切面处理类 * Copyright (c) 人人开源 All rights reserved. @@ -19,7 +20,7 @@ import org.springframework.stereotype.Component; @Component public class RedisAspect { /** - * 是否开启redis缓存 true开启 false关闭 + * 是否开启redis缓存 true开启 false关闭 */ @Value("${renren.redis.open}") private boolean open; diff --git a/main/manager-api/src/main/java/xiaozhi/common/config/MybatisPlusConfig.java b/main/manager-api/src/main/java/xiaozhi/common/config/MybatisPlusConfig.java index 2890a61c..250e0d07 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/config/MybatisPlusConfig.java +++ b/main/manager-api/src/main/java/xiaozhi/common/config/MybatisPlusConfig.java @@ -1,12 +1,14 @@ package xiaozhi.common.config; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; + import xiaozhi.common.interceptor.DataFilterInterceptor; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; /** * mybatis-plus配置 diff --git a/main/manager-api/src/main/java/xiaozhi/common/config/SwaggerConfig.java b/main/manager-api/src/main/java/xiaozhi/common/config/SwaggerConfig.java index c9e38ab1..da23a233 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/config/SwaggerConfig.java +++ b/main/manager-api/src/main/java/xiaozhi/common/config/SwaggerConfig.java @@ -1,11 +1,12 @@ package xiaozhi.common.config; -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.info.Info; import org.springdoc.core.models.GroupedOpenApi; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; + /** * Swagger配置 * Copyright (c) 人人开源 All rights reserved. @@ -14,11 +15,60 @@ import org.springframework.context.annotation.Configuration; @Configuration public class SwaggerConfig { + @Bean + public GroupedOpenApi deviceApi() { + return GroupedOpenApi.builder() + .group("device") + .pathsToMatch("/device/**") + .build(); + } + + @Bean + public GroupedOpenApi agentApi() { + return GroupedOpenApi.builder() + .group("agent") + .pathsToMatch("/agent/**") + .build(); + } + + @Bean + public GroupedOpenApi modelApi() { + return GroupedOpenApi.builder() + .group("models") + .pathsToMatch("/models/**") + .build(); + } + + @Bean + public GroupedOpenApi oatApi() { + return GroupedOpenApi.builder() + .group("ota") + .pathsToMatch("/ota/**") + .build(); + } + + @Bean + public GroupedOpenApi timbreApi() { + return GroupedOpenApi.builder() + .group("timbre") + .pathsToMatch("/timbre/**") + .build(); + } + + @Bean + public GroupedOpenApi sysApi() { + return GroupedOpenApi.builder() + .group("admin") + .pathsToMatch("/admin/**") + .build(); + } + @Bean public GroupedOpenApi userApi() { - String[] paths = {"/**"}; - return GroupedOpenApi.builder().group("xiaozhi") - .pathsToMatch(paths).build(); + return GroupedOpenApi.builder() + .group("user") + .pathsToMatch("/user/**") + .build(); } @Bean diff --git a/main/manager-api/src/main/java/xiaozhi/common/convert/DateConverter.java b/main/manager-api/src/main/java/xiaozhi/common/convert/DateConverter.java index a8439180..fd0f74c2 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/convert/DateConverter.java +++ b/main/manager-api/src/main/java/xiaozhi/common/convert/DateConverter.java @@ -1,17 +1,17 @@ package xiaozhi.common.convert; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.core.convert.converter.Converter; -import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; - import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; + /** * 日期转换 * Copyright (c) 人人开源 All rights reserved. diff --git a/main/manager-api/src/main/java/xiaozhi/common/entity/BaseEntity.java b/main/manager-api/src/main/java/xiaozhi/common/entity/BaseEntity.java index e7e2f345..ce267bab 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/entity/BaseEntity.java +++ b/main/manager-api/src/main/java/xiaozhi/common/entity/BaseEntity.java @@ -1,12 +1,13 @@ package xiaozhi.common.entity; +import java.io.Serializable; +import java.util.Date; + import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; -import lombok.Data; -import java.io.Serializable; -import java.util.Date; +import lombok.Data; /** * 基础实体类,所有实体都需要继承 diff --git a/main/manager-api/src/main/java/xiaozhi/common/exception/RenException.java b/main/manager-api/src/main/java/xiaozhi/common/exception/RenException.java index cf295dcf..9b928d5c 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/exception/RenException.java +++ b/main/manager-api/src/main/java/xiaozhi/common/exception/RenException.java @@ -1,6 +1,5 @@ package xiaozhi.common.exception; - import xiaozhi.common.utils.MessageUtils; /** @@ -10,7 +9,6 @@ import xiaozhi.common.utils.MessageUtils; */ public class RenException extends RuntimeException { - private int code; private String msg; diff --git a/main/manager-api/src/main/java/xiaozhi/common/exception/RenExceptionHandler.java b/main/manager-api/src/main/java/xiaozhi/common/exception/RenExceptionHandler.java index 06665ee2..0f83772e 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/exception/RenExceptionHandler.java +++ b/main/manager-api/src/main/java/xiaozhi/common/exception/RenExceptionHandler.java @@ -1,13 +1,13 @@ package xiaozhi.common.exception; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.apache.shiro.authz.UnauthorizedException; import org.springframework.dao.DuplicateKeyException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; -import xiaozhi.common.utils.Result; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import xiaozhi.common.utils.Result; /** * 异常处理器 @@ -23,35 +23,34 @@ public class RenExceptionHandler { * 处理自定义异常 */ @ExceptionHandler(RenException.class) - public Result handleRenException(RenException ex) { - Result result = new Result(); + public Result handleRenException(RenException ex) { + Result result = new Result<>(); result.error(ex.getCode(), ex.getMsg()); return result; } @ExceptionHandler(DuplicateKeyException.class) - public Result handleDuplicateKeyException(DuplicateKeyException ex) { - Result result = new Result(); + public Result handleDuplicateKeyException(DuplicateKeyException ex) { + Result result = new Result<>(); result.error(ErrorCode.DB_RECORD_EXISTS); return result; } @ExceptionHandler(UnauthorizedException.class) - public Result handleUnauthorizedException(UnauthorizedException ex) { - Result result = new Result(); + public Result handleUnauthorizedException(UnauthorizedException ex) { + Result result = new Result<>(); result.error(ErrorCode.FORBIDDEN); return result; } - @ExceptionHandler(Exception.class) - public Result handleException(Exception ex) { + public Result handleException(Exception ex) { log.error(ex.getMessage(), ex); - return new Result().error(); + return new Result().error(); } } \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/common/handler/FieldMetaObjectHandler.java b/main/manager-api/src/main/java/xiaozhi/common/handler/FieldMetaObjectHandler.java index 20371fd6..a6b33b62 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/handler/FieldMetaObjectHandler.java +++ b/main/manager-api/src/main/java/xiaozhi/common/handler/FieldMetaObjectHandler.java @@ -1,13 +1,15 @@ package xiaozhi.common.handler; -import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; -import xiaozhi.common.constant.Constant; -import xiaozhi.common.user.UserDetail; -import xiaozhi.modules.security.user.SecurityUser; +import java.util.Date; + import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; -import java.util.Date; +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; + +import xiaozhi.common.constant.Constant; +import xiaozhi.common.user.UserDetail; +import xiaozhi.modules.security.user.SecurityUser; /** * 公共字段,自动填充值 @@ -22,35 +24,34 @@ public class FieldMetaObjectHandler implements MetaObjectHandler { private final static String UPDATER = "updater"; private final static String DATA_OPERATION = "dataOperation"; - private final static String DEPT_ID = "deptId"; @Override public void insertFill(MetaObject metaObject) { UserDetail user = SecurityUser.getUser(); Date date = new Date(); - //创建者 + // 创建者 strictInsertFill(metaObject, CREATOR, Long.class, user.getId()); - //创建时间 + // 创建时间 strictInsertFill(metaObject, CREATE_DATE, Date.class, date); - //更新者 + // 更新者 strictInsertFill(metaObject, UPDATER, Long.class, user.getId()); - //更新时间 + // 更新时间 strictInsertFill(metaObject, UPDATE_DATE, Date.class, date); - //数据标识 + // 数据标识 strictInsertFill(metaObject, DATA_OPERATION, String.class, Constant.DataOperation.INSERT.getValue()); } @Override public void updateFill(MetaObject metaObject) { - //更新者 + // 更新者 strictUpdateFill(metaObject, UPDATER, Long.class, SecurityUser.getUserId()); - //更新时间 + // 更新时间 strictUpdateFill(metaObject, UPDATE_DATE, Date.class, new Date()); - //数据标识 + // 数据标识 strictInsertFill(metaObject, DATA_OPERATION, String.class, Constant.DataOperation.UPDATE.getValue()); } } \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/common/interceptor/DataFilterInterceptor.java b/main/manager-api/src/main/java/xiaozhi/common/interceptor/DataFilterInterceptor.java index 160e7ff3..0457686b 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/interceptor/DataFilterInterceptor.java +++ b/main/manager-api/src/main/java/xiaozhi/common/interceptor/DataFilterInterceptor.java @@ -1,8 +1,17 @@ package xiaozhi.common.interceptor; -import cn.hutool.core.util.StrUtil; +import java.util.Map; + +import org.apache.ibatis.executor.Executor; +import org.apache.ibatis.mapping.BoundSql; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.session.ResultHandler; +import org.apache.ibatis.session.RowBounds; + import com.baomidou.mybatisplus.core.toolkit.PluginUtils; import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; + +import cn.hutool.core.util.StrUtil; import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.StringValue; @@ -10,13 +19,6 @@ import net.sf.jsqlparser.expression.operators.conditional.AndExpression; import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.statement.select.PlainSelect; import net.sf.jsqlparser.statement.select.Select; -import org.apache.ibatis.executor.Executor; -import org.apache.ibatis.mapping.BoundSql; -import org.apache.ibatis.mapping.MappedStatement; -import org.apache.ibatis.session.ResultHandler; -import org.apache.ibatis.session.RowBounds; - -import java.util.Map; /** * 数据过滤 @@ -25,8 +27,10 @@ import java.util.Map; */ public class DataFilterInterceptor implements InnerInterceptor { + @SuppressWarnings("rawtypes") @Override - public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) { + public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, + ResultHandler resultHandler, BoundSql boundSql) { DataScope scope = getDataScope(parameter); // 不进行数据过滤 if (scope == null || StrUtil.isBlank(scope.getSqlFilter())) { @@ -48,7 +52,7 @@ public class DataFilterInterceptor implements InnerInterceptor { // 判断参数里是否有DataScope对象 if (parameter instanceof Map) { Map parameterMap = (Map) parameter; - for (Map.Entry entry : parameterMap.entrySet()) { + for (Map.Entry entry : parameterMap.entrySet()) { if (entry.getValue() != null && entry.getValue() instanceof DataScope) { return (DataScope) entry.getValue(); } diff --git a/main/manager-api/src/main/java/xiaozhi/common/page/PageData.java b/main/manager-api/src/main/java/xiaozhi/common/page/PageData.java index b7e943d2..83e93c11 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/page/PageData.java +++ b/main/manager-api/src/main/java/xiaozhi/common/page/PageData.java @@ -1,11 +1,11 @@ package xiaozhi.common.page; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - import java.io.Serializable; import java.util.List; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + /** * 分页工具类 * Copyright (c) 人人开源 All rights reserved. diff --git a/main/manager-api/src/main/java/xiaozhi/common/page/TokenDTO.java b/main/manager-api/src/main/java/xiaozhi/common/page/TokenDTO.java index 48d26f3a..cce1a6df 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/page/TokenDTO.java +++ b/main/manager-api/src/main/java/xiaozhi/common/page/TokenDTO.java @@ -1,10 +1,10 @@ package xiaozhi.common.page; +import java.io.Serializable; + import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -import java.io.Serializable; - /** * 令牌信息 * @@ -14,7 +14,6 @@ import java.io.Serializable; @Schema(description = "令牌信息") public class TokenDTO implements Serializable { - @Schema(description = "密码") private String token; diff --git a/main/manager-api/src/main/java/xiaozhi/common/redis/RedisConfig.java b/main/manager-api/src/main/java/xiaozhi/common/redis/RedisConfig.java index a4316b63..703a8492 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/redis/RedisConfig.java +++ b/main/manager-api/src/main/java/xiaozhi/common/redis/RedisConfig.java @@ -1,6 +1,5 @@ package xiaozhi.common.redis; -import jakarta.annotation.Resource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; @@ -8,6 +7,8 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; +import jakarta.annotation.Resource; + /** * Redis配置 * Copyright (c) 人人开源 All rights reserved. diff --git a/main/manager-api/src/main/java/xiaozhi/common/redis/RedisUtils.java b/main/manager-api/src/main/java/xiaozhi/common/redis/RedisUtils.java index 4626b14d..240e1339 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/redis/RedisUtils.java +++ b/main/manager-api/src/main/java/xiaozhi/common/redis/RedisUtils.java @@ -1,14 +1,15 @@ package xiaozhi.common.redis; -import jakarta.annotation.Resource; -import org.springframework.data.redis.core.HashOperations; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.stereotype.Component; - import java.util.Collection; import java.util.Map; import java.util.concurrent.TimeUnit; +import org.springframework.data.redis.core.HashOperations; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import jakarta.annotation.Resource; + /** * Redis工具类 * Copyright (c) 人人开源 All rights reserved. diff --git a/main/manager-api/src/main/java/xiaozhi/common/service/BaseService.java b/main/manager-api/src/main/java/xiaozhi/common/service/BaseService.java index 01bd48ca..2feaefd1 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/service/BaseService.java +++ b/main/manager-api/src/main/java/xiaozhi/common/service/BaseService.java @@ -1,10 +1,10 @@ package xiaozhi.common.service; -import com.baomidou.mybatisplus.core.conditions.Wrapper; - import java.io.Serializable; import java.util.Collection; +import com.baomidou.mybatisplus.core.conditions.Wrapper; + /** * 基础服务接口,所有Service接口都要继承 * Copyright (c) 人人开源 All rights reserved. @@ -56,7 +56,8 @@ public interface BaseService { *

* * @param entity 实体对象 - * @param updateWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper} + * @param updateWrapper 实体对象封装操作类 + * {@link com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper} */ boolean update(T entity, Wrapper updateWrapper); diff --git a/main/manager-api/src/main/java/xiaozhi/common/service/CrudService.java b/main/manager-api/src/main/java/xiaozhi/common/service/CrudService.java index bc1094e4..51f16bcb 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/service/CrudService.java +++ b/main/manager-api/src/main/java/xiaozhi/common/service/CrudService.java @@ -1,11 +1,11 @@ package xiaozhi.common.service; -import xiaozhi.common.page.PageData; - import java.io.Serializable; import java.util.List; import java.util.Map; +import xiaozhi.common.page.PageData; + /** * CRUD基础服务接口 * Copyright (c) 人人开源 All rights reserved. diff --git a/main/manager-api/src/main/java/xiaozhi/common/service/impl/BaseServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/common/service/impl/BaseServiceImpl.java index 16fd6feb..8ebb4cd1 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/service/impl/BaseServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/common/service/impl/BaseServiceImpl.java @@ -1,5 +1,18 @@ package xiaozhi.common.service.impl; +import java.io.Serializable; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.function.BiConsumer; + +import org.apache.ibatis.binding.MapperMethod; +import org.apache.ibatis.logging.Log; +import org.apache.ibatis.logging.LogFactory; +import org.apache.ibatis.session.SqlSession; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.enums.SqlMethod; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @@ -10,22 +23,11 @@ import com.baomidou.mybatisplus.core.toolkit.ReflectionKit; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; + import xiaozhi.common.constant.Constant; import xiaozhi.common.page.PageData; import xiaozhi.common.service.BaseService; import xiaozhi.common.utils.ConvertUtils; -import org.apache.ibatis.binding.MapperMethod; -import org.apache.ibatis.logging.Log; -import org.apache.ibatis.logging.LogFactory; -import org.apache.ibatis.session.SqlSession; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; - -import java.io.Serializable; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.function.BiConsumer; /** * 基础服务类,所有Service都要继承 @@ -45,7 +47,7 @@ public abstract class BaseServiceImpl, T> implements Bas * @param isAsc 排序方式 */ protected IPage getPage(Map params, String defaultOrderField, boolean isAsc) { - //分页参数 + // 分页参数 long curPage = 1; long limit = 10; @@ -56,17 +58,17 @@ public abstract class BaseServiceImpl, T> implements Bas limit = Long.parseLong((String) params.get(Constant.LIMIT)); } - //分页对象 + // 分页对象 Page page = new Page<>(curPage, limit); - //分页参数 + // 分页参数 params.put(Constant.PAGE, page); - //排序字段 + // 排序字段 String orderField = (String) params.get(Constant.ORDER_FIELD); String order = (String) params.get(Constant.ORDER); - //前端字段排序 + // 前端字段排序 if (StringUtils.isNotBlank(orderField) && StringUtils.isNotBlank(order)) { if (Constant.ASC.equalsIgnoreCase(order)) { return page.addOrder(OrderItem.asc(orderField)); @@ -75,12 +77,12 @@ public abstract class BaseServiceImpl, T> implements Bas } } - //没有排序字段,则不排序 + // 没有排序字段,则不排序 if (StringUtils.isBlank(defaultOrderField)) { return page; } - //默认排序 + // 默认排序 if (isAsc) { page.addOrder(OrderItem.asc(defaultOrderField)); } else { @@ -90,13 +92,13 @@ public abstract class BaseServiceImpl, T> implements Bas return page; } - protected PageData getPageData(List list, long total, Class target) { - List targetList = ConvertUtils.sourceToTarget(list, target); + protected PageData getPageData(List list, long total, Class target) { + List targetList = ConvertUtils.sourceToTarget(list, target); return new PageData<>(targetList, total); } - protected PageData getPageData(IPage page, Class target) { + protected PageData getPageData(IPage page, Class target) { return getPageData(page.getRecords(), page.getTotal(), target); } @@ -126,10 +128,12 @@ public abstract class BaseServiceImpl, T> implements Bas return SqlHelper.retBool(result); } + @SuppressWarnings("unchecked") protected Class currentMapperClass() { return (Class) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseServiceImpl.class, 0); } + @SuppressWarnings("unchecked") @Override public Class currentModelClass() { return (Class) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseServiceImpl.class, 1); @@ -164,11 +168,11 @@ public abstract class BaseServiceImpl, T> implements Bas /** * 执行批量操作 */ + @SuppressWarnings("deprecation") protected boolean executeBatch(Collection list, int batchSize, BiConsumer consumer) { return SqlHelper.executeBatch(this.currentModelClass(), this.log, list, batchSize, consumer); } - @Override @Transactional(rollbackFor = Exception.class) public boolean updateById(T entity) { diff --git a/main/manager-api/src/main/java/xiaozhi/common/service/impl/CrudServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/common/service/impl/CrudServiceImpl.java index 6608e7c3..524a8cb2 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/service/impl/CrudServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/common/service/impl/CrudServiceImpl.java @@ -1,26 +1,30 @@ package xiaozhi.common.service.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.ReflectionKit; -import xiaozhi.common.page.PageData; -import xiaozhi.common.service.CrudService; -import xiaozhi.common.utils.ConvertUtils; -import org.springframework.beans.BeanUtils; - import java.io.Serializable; import java.util.Arrays; import java.util.List; import java.util.Map; +import org.springframework.beans.BeanUtils; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.ReflectionKit; + +import xiaozhi.common.page.PageData; +import xiaozhi.common.service.CrudService; +import xiaozhi.common.utils.ConvertUtils; + /** * CRUD基础服务类 * Copyright (c) 人人开源 All rights reserved. * Website: https://www.renren.io */ -public abstract class CrudServiceImpl, T, D> extends BaseServiceImpl implements CrudService { +public abstract class CrudServiceImpl, T, D> extends BaseServiceImpl + implements CrudService { + @SuppressWarnings("unchecked") protected Class currentDtoClass() { return (Class) ReflectionKit.getSuperClassGenericType(getClass(), CrudServiceImpl.class, 2); } @@ -29,8 +33,7 @@ public abstract class CrudServiceImpl, T, D> extends Bas public PageData page(Map params) { IPage page = baseDao.selectPage( getPage(params, null, false), - getWrapper(params) - ); + getWrapper(params)); return getPageData(page, currentDtoClass()); } @@ -56,7 +59,7 @@ public abstract class CrudServiceImpl, T, D> extends Bas T entity = ConvertUtils.sourceToTarget(dto, currentModelClass()); insert(entity); - //copy主键值到dto + // copy主键值到dto BeanUtils.copyProperties(entity, dto); } diff --git a/main/manager-api/src/main/java/xiaozhi/common/user/UserDetail.java b/main/manager-api/src/main/java/xiaozhi/common/user/UserDetail.java index 2ad023d7..0aa9210b 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/user/UserDetail.java +++ b/main/manager-api/src/main/java/xiaozhi/common/user/UserDetail.java @@ -1,9 +1,9 @@ package xiaozhi.common.user; -import lombok.Data; - import java.io.Serializable; +import lombok.Data; + /** * 登录用户信息 * Copyright (c) 人人开源 All rights reserved. diff --git a/main/manager-api/src/main/java/xiaozhi/common/utils/ConvertUtils.java b/main/manager-api/src/main/java/xiaozhi/common/utils/ConvertUtils.java index 7a5bc0ed..07ade50f 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/utils/ConvertUtils.java +++ b/main/manager-api/src/main/java/xiaozhi/common/utils/ConvertUtils.java @@ -1,12 +1,13 @@ package xiaozhi.common.utils; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.BeanUtils; - import java.util.ArrayList; import java.util.Collection; import java.util.List; +import org.springframework.beans.BeanUtils; + +import lombok.extern.slf4j.Slf4j; + /** * 转换工具类 * Copyright (c) 人人开源 All rights reserved. @@ -20,7 +21,7 @@ public class ConvertUtils { } T targetObject = null; try { - targetObject = target.newInstance(); + targetObject = target.getDeclaredConstructor().newInstance(); BeanUtils.copyProperties(source, targetObject); } catch (Exception e) { log.error("convert error ", e); @@ -34,10 +35,10 @@ public class ConvertUtils { return null; } - List targetList = new ArrayList<>(sourceList.size()); + List targetList = new ArrayList<>(sourceList.size()); try { for (Object source : sourceList) { - T targetObject = target.newInstance(); + T targetObject = target.getDeclaredConstructor().newInstance(); BeanUtils.copyProperties(source, targetObject); targetList.add(targetObject); } diff --git a/main/manager-api/src/main/java/xiaozhi/common/utils/HttpContextUtils.java b/main/manager-api/src/main/java/xiaozhi/common/utils/HttpContextUtils.java index 8d76434c..0e46acf1 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/utils/HttpContextUtils.java +++ b/main/manager-api/src/main/java/xiaozhi/common/utils/HttpContextUtils.java @@ -1,20 +1,21 @@ package xiaozhi.common.utils; -import jakarta.servlet.http.HttpServletRequest; +import java.util.Date; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; + import org.apache.commons.lang3.StringUtils; import org.springframework.http.HttpHeaders; import org.springframework.util.DigestUtils; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; + +import jakarta.servlet.http.HttpServletRequest; import xiaozhi.common.exception.ErrorCode; import xiaozhi.common.exception.RenException; -import java.util.Date; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Map; - /** * Http * Copyright (c) 人人开源 All rights reserved. @@ -70,15 +71,15 @@ public class HttpContextUtils { } public static String getLanguage() { - //默认语言 + // 默认语言 String defaultLanguage = "zh-CN"; - //request + // request HttpServletRequest request = getHttpServletRequest(); if (request == null) { return defaultLanguage; } - //请求语言 + // 请求语言 defaultLanguage = request.getHeader(HttpHeaders.ACCEPT_LANGUAGE); return defaultLanguage; diff --git a/main/manager-api/src/main/java/xiaozhi/common/utils/IpUtils.java b/main/manager-api/src/main/java/xiaozhi/common/utils/IpUtils.java index 307ad3b5..fef7972f 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/utils/IpUtils.java +++ b/main/manager-api/src/main/java/xiaozhi/common/utils/IpUtils.java @@ -1,8 +1,9 @@ package xiaozhi.common.utils; +import org.apache.commons.lang3.StringUtils; + import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; /** * IP地址 diff --git a/main/manager-api/src/main/java/xiaozhi/common/utils/JsonUtils.java b/main/manager-api/src/main/java/xiaozhi/common/utils/JsonUtils.java index 4a908245..288dae9a 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/utils/JsonUtils.java +++ b/main/manager-api/src/main/java/xiaozhi/common/utils/JsonUtils.java @@ -1,13 +1,14 @@ package xiaozhi.common.utils; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.StrUtil; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; - import java.util.ArrayList; import java.util.List; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; + /** * JSON 工具类 * Copyright (c) 人人开源 All rights reserved. @@ -59,7 +60,8 @@ public class JsonUtils { return new ArrayList<>(); } try { - return objectMapper.readValue(text, objectMapper.getTypeFactory().constructCollectionType(List.class, clazz)); + return objectMapper.readValue(text, + objectMapper.getTypeFactory().constructCollectionType(List.class, clazz)); } catch (Exception e) { throw new RuntimeException(e); } diff --git a/main/manager-api/src/main/java/xiaozhi/common/utils/Result.java b/main/manager-api/src/main/java/xiaozhi/common/utils/Result.java index 65841b7d..9c326af7 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/utils/Result.java +++ b/main/manager-api/src/main/java/xiaozhi/common/utils/Result.java @@ -1,11 +1,11 @@ package xiaozhi.common.utils; +import java.io.Serializable; + import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import xiaozhi.common.exception.ErrorCode; -import java.io.Serializable; - /** * 响应数据 * Copyright (c) 人人开源 All rights reserved. @@ -36,7 +36,6 @@ public class Result implements Serializable { return this; } - public Result error() { this.code = ErrorCode.INTERNAL_SERVER_ERROR; this.msg = MessageUtils.getMessage(this.code); diff --git a/main/manager-api/src/main/java/xiaozhi/common/utils/TreeNode.java b/main/manager-api/src/main/java/xiaozhi/common/utils/TreeNode.java index b60bc9cf..5fdb5985 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/utils/TreeNode.java +++ b/main/manager-api/src/main/java/xiaozhi/common/utils/TreeNode.java @@ -1,11 +1,11 @@ package xiaozhi.common.utils; -import lombok.Data; - import java.io.Serializable; import java.util.ArrayList; import java.util.List; +import lombok.Data; + /** * 树节点,所有需要实现树节点的,都需要继承该类 * Copyright (c) 人人开源 All rights reserved. diff --git a/main/manager-api/src/main/java/xiaozhi/common/utils/TreeUtils.java b/main/manager-api/src/main/java/xiaozhi/common/utils/TreeUtils.java index 766cb029..e76190eb 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/utils/TreeUtils.java +++ b/main/manager-api/src/main/java/xiaozhi/common/utils/TreeUtils.java @@ -1,12 +1,12 @@ package xiaozhi.common.utils; -import xiaozhi.common.validator.AssertUtils; - import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import xiaozhi.common.validator.AssertUtils; + /** * 树形结构工具类,如:菜单、部门等 * Copyright (c) 人人开源 All rights reserved. @@ -17,8 +17,8 @@ public class TreeUtils { /** * 根据pid,构建树节点 */ - public static List build(List treeNodes, Long pid) { - //pid不能为空 + public static > List build(List treeNodes, Long pid) { + // pid不能为空 AssertUtils.isNull(pid, "pid"); List treeList = new ArrayList<>(); @@ -34,7 +34,7 @@ public class TreeUtils { /** * 查找子节点 */ - private static T findChildren(List treeNodes, T rootNode) { + private static > T findChildren(List treeNodes, T rootNode) { for (T treeNode : treeNodes) { if (rootNode.getId().equals(treeNode.getPid())) { rootNode.getChildren().add(findChildren(treeNodes, treeNode)); @@ -46,10 +46,10 @@ public class TreeUtils { /** * 构建树节点 */ - public static List build(List treeNodes) { + public static > List build(List treeNodes) { List result = new ArrayList<>(); - //list转map + // list转map Map nodeMap = new LinkedHashMap<>(treeNodes.size()); for (T treeNode : treeNodes) { nodeMap.put(treeNode.getId(), treeNode); diff --git a/main/manager-api/src/main/java/xiaozhi/common/validator/AssertUtils.java b/main/manager-api/src/main/java/xiaozhi/common/validator/AssertUtils.java index 6a6b43e1..c86aa517 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/validator/AssertUtils.java +++ b/main/manager-api/src/main/java/xiaozhi/common/validator/AssertUtils.java @@ -1,14 +1,15 @@ package xiaozhi.common.validator; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; + import cn.hutool.core.collection.CollUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ArrayUtil; import xiaozhi.common.exception.ErrorCode; import xiaozhi.common.exception.RenException; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; -import java.util.Map; /** * 校验工具类 @@ -73,11 +74,11 @@ public class AssertUtils { } } - public static void isMapEmpty(Map map, String... params) { + public static void isMapEmpty(Map map, String... params) { isMapEmpty(map, ErrorCode.NOT_NULL, params); } - public static void isMapEmpty(Map map, Integer code, String... params) { + public static void isMapEmpty(Map map, Integer code, String... params) { if (code == null) { throw new RenException(ErrorCode.NOT_NULL, "code"); } diff --git a/main/manager-api/src/main/java/xiaozhi/common/validator/ValidatorUtils.java b/main/manager-api/src/main/java/xiaozhi/common/validator/ValidatorUtils.java index 80acb097..9e31c964 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/validator/ValidatorUtils.java +++ b/main/manager-api/src/main/java/xiaozhi/common/validator/ValidatorUtils.java @@ -1,16 +1,17 @@ package xiaozhi.common.validator; -import xiaozhi.common.exception.RenException; -import jakarta.validation.ConstraintViolation; -import jakarta.validation.Validation; -import jakarta.validation.Validator; +import java.util.Locale; +import java.util.Set; + import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.context.support.ResourceBundleMessageSource; import org.springframework.validation.beanvalidation.MessageSourceResourceBundleLocator; -import java.util.Locale; -import java.util.Set; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import xiaozhi.common.exception.RenException; /** * hibernate-validator校验工具类 @@ -35,7 +36,7 @@ public class ValidatorUtils { throws RenException { Locale.setDefault(LocaleContextHolder.getLocale()); Validator validator = Validation.byDefaultProvider().configure().messageInterpolator( - new ResourceBundleMessageInterpolator(new MessageSourceResourceBundleLocator(getMessageSource()))) + new ResourceBundleMessageInterpolator(new MessageSourceResourceBundleLocator(getMessageSource()))) .buildValidatorFactory().getValidator(); Set> constraintViolations = validator.validate(object, groups); diff --git a/main/manager-api/src/main/java/xiaozhi/common/xss/SqlFilter.java b/main/manager-api/src/main/java/xiaozhi/common/xss/SqlFilter.java index 20291da1..2bf4ab92 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/xss/SqlFilter.java +++ b/main/manager-api/src/main/java/xiaozhi/common/xss/SqlFilter.java @@ -1,8 +1,9 @@ package xiaozhi.common.xss; +import org.apache.commons.lang3.StringUtils; + import xiaozhi.common.exception.ErrorCode; import xiaozhi.common.exception.RenException; -import org.apache.commons.lang3.StringUtils; /** * SQL过滤 @@ -20,19 +21,20 @@ public class SqlFilter { if (StringUtils.isBlank(str)) { return null; } - //去掉'|"|;|\字符 + // 去掉'|"|;|\字符 str = StringUtils.replace(str, "'", ""); str = StringUtils.replace(str, "\"", ""); str = StringUtils.replace(str, ";", ""); str = StringUtils.replace(str, "\\", ""); - //转换成小写 + // 转换成小写 str = str.toLowerCase(); - //非法字符 - String[] keywords = {"master", "truncate", "insert", "select", "delete", "update", "declare", "alter", "drop"}; + // 非法字符 + String[] keywords = { "master", "truncate", "insert", "select", "delete", "update", "declare", "alter", + "drop" }; - //判断是否包含非法字符 + // 判断是否包含非法字符 for (String keyword : keywords) { if (str.contains(keyword)) { throw new RenException(ErrorCode.INVALID_SYMBOL); diff --git a/main/manager-api/src/main/java/xiaozhi/common/xss/XssConfig.java b/main/manager-api/src/main/java/xiaozhi/common/xss/XssConfig.java index f62786fd..e4b65465 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/xss/XssConfig.java +++ b/main/manager-api/src/main/java/xiaozhi/common/xss/XssConfig.java @@ -1,6 +1,5 @@ package xiaozhi.common.xss; -import jakarta.servlet.DispatcherType; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.web.servlet.FilterRegistrationBean; @@ -8,6 +7,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.util.PathMatcher; +import jakarta.servlet.DispatcherType; + /** * XSS 配置文件 * Copyright (c) 人人开源 All rights reserved. diff --git a/main/manager-api/src/main/java/xiaozhi/common/xss/XssFilter.java b/main/manager-api/src/main/java/xiaozhi/common/xss/XssFilter.java index 9a24d7eb..db769989 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/xss/XssFilter.java +++ b/main/manager-api/src/main/java/xiaozhi/common/xss/XssFilter.java @@ -1,11 +1,17 @@ package xiaozhi.common.xss; -import jakarta.servlet.*; -import jakarta.servlet.http.HttpServletRequest; -import lombok.AllArgsConstructor; +import java.io.IOException; + import org.springframework.util.PathMatcher; -import java.io.IOException; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import lombok.AllArgsConstructor; /** * XSS过滤 @@ -38,7 +44,8 @@ public class XssFilter implements Filter { private boolean shouldNotFilter(HttpServletRequest request) { // 放行不过滤的URL - return properties.getExcludeUrls().stream().anyMatch(excludeUrl -> pathMatcher.match(excludeUrl, request.getServletPath())); + return properties.getExcludeUrls().stream() + .anyMatch(excludeUrl -> pathMatcher.match(excludeUrl, request.getServletPath())); } @Override diff --git a/main/manager-api/src/main/java/xiaozhi/common/xss/XssHttpServletRequestWrapper.java b/main/manager-api/src/main/java/xiaozhi/common/xss/XssHttpServletRequestWrapper.java index 1306c2dd..ecb36406 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/xss/XssHttpServletRequestWrapper.java +++ b/main/manager-api/src/main/java/xiaozhi/common/xss/XssHttpServletRequestWrapper.java @@ -1,20 +1,20 @@ package xiaozhi.common.xss; -import cn.hutool.core.io.IoUtil; -import jakarta.servlet.ReadListener; -import jakarta.servlet.ServletInputStream; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletRequestWrapper; -import org.apache.commons.lang3.StringUtils; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; - import java.io.ByteArrayInputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.LinkedHashMap; import java.util.Map; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; + +import cn.hutool.core.io.IoUtil; +import jakarta.servlet.ReadListener; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; /** * XSS过滤处理 @@ -29,18 +29,18 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { @Override public ServletInputStream getInputStream() throws IOException { - //非json类型,直接返回 + // 非json类型,直接返回 if (!MediaType.APPLICATION_JSON_VALUE.equalsIgnoreCase(super.getHeader(HttpHeaders.CONTENT_TYPE))) { return super.getInputStream(); } - //为空,直接返回 + // 为空,直接返回 String json = IoUtil.readUtf8(super.getInputStream()); if (StringUtils.isBlank(json)) { return super.getInputStream(); } - //xss过滤 + // xss过滤 json = xssEncode(json); final ByteArrayInputStream bis = new ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8)); return new ServletInputStream() { diff --git a/main/manager-api/src/main/java/xiaozhi/common/xss/XssProperties.java b/main/manager-api/src/main/java/xiaozhi/common/xss/XssProperties.java index bf36ddbe..5d9b8b01 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/xss/XssProperties.java +++ b/main/manager-api/src/main/java/xiaozhi/common/xss/XssProperties.java @@ -1,11 +1,12 @@ package xiaozhi.common.xss; -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; - import java.util.Collections; import java.util.List; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import lombok.Data; + /** * XSS 配置项 * Copyright (c) 人人开源 All rights reserved. diff --git a/main/manager-api/src/main/java/xiaozhi/common/xss/XssUtils.java b/main/manager-api/src/main/java/xiaozhi/common/xss/XssUtils.java index 5d4ac6b3..16588392 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/xss/XssUtils.java +++ b/main/manager-api/src/main/java/xiaozhi/common/xss/XssUtils.java @@ -22,13 +22,15 @@ public class XssUtils extends Safelist { */ private static Safelist xssWhitelist() { return new Safelist() - //支持的标签 + // 支持的标签 .addTags("a", "b", "blockquote", "br", "caption", "cite", "code", "col", "colgroup", "dd", "div", "dl", - "dt", "em", "h1", "h2", "h3", "h4", "h5", "h6", "i", "img", "li", "ol", "p", "pre", "q", "small", - "strike", "strong", "sub", "sup", "table", "tbody", "td", "tfoot", "th", "thead", "tr", "u", "ul", + "dt", "em", "h1", "h2", "h3", "h4", "h5", "h6", "i", "img", "li", "ol", "p", "pre", "q", + "small", + "strike", "strong", "sub", "sup", "table", "tbody", "td", "tfoot", "th", "thead", "tr", "u", + "ul", "embed", "object", "param", "span") - //支持的标签属性 + // 支持的标签属性 .addAttributes("a", "href", "class", "style", "target", "rel", "nofollow") .addAttributes("blockquote", "cite") .addAttributes("code", "class", "style") @@ -44,13 +46,16 @@ public class XssUtils extends Safelist { .addAttributes("ul", "type", "style") .addAttributes("pre", "class", "style") .addAttributes("div", "class", "id", "style") - .addAttributes("embed", "src", "wmode", "flashvars", "pluginspage", "allowFullScreen", "allowfullscreen", - "quality", "width", "height", "align", "allowScriptAccess", "allowscriptaccess", "allownetworking", "type") - .addAttributes("object", "type", "id", "name", "data", "width", "height", "style", "classid", "codebase") + .addAttributes("embed", "src", "wmode", "flashvars", "pluginspage", "allowFullScreen", + "allowfullscreen", + "quality", "width", "height", "align", "allowScriptAccess", "allowscriptaccess", + "allownetworking", "type") + .addAttributes("object", "type", "id", "name", "data", "width", "height", "style", "classid", + "codebase") .addAttributes("param", "name", "value") .addAttributes("span", "class", "style") - //标签属性对应的协议 + // 标签属性对应的协议 .addProtocols("a", "href", "ftp", "http", "https", "mailto") .addProtocols("img", "src", "http", "https") .addProtocols("blockquote", "cite", "http", "https") diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java new file mode 100644 index 00000000..93a741df --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java @@ -0,0 +1,172 @@ +package xiaozhi.modules.agent.controller; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import lombok.AllArgsConstructor; +import xiaozhi.common.constant.Constant; +import xiaozhi.common.page.PageData; +import xiaozhi.common.user.UserDetail; +import xiaozhi.common.utils.ConvertUtils; +import xiaozhi.common.utils.Result; +import xiaozhi.modules.agent.dto.AgentCreateDTO; +import xiaozhi.modules.agent.dto.AgentUpdateDTO; +import xiaozhi.modules.agent.entity.AgentEntity; +import xiaozhi.modules.agent.entity.AgentTemplateEntity; +import xiaozhi.modules.agent.service.AgentService; +import xiaozhi.modules.agent.service.AgentTemplateService; +import xiaozhi.modules.security.user.SecurityUser; + +@Tag(name = "智能体管理") +@AllArgsConstructor +@RestController +@RequestMapping("/agent") +public class AgentController { + private final AgentService agentService; + private final AgentTemplateService agentTemplateService; + + @GetMapping("/list") + @Operation(summary = "获取用户智能体列表") + @RequiresPermissions("sys:role:normal") + public Result> getUserAgents() { + UserDetail user = SecurityUser.getUser(); + List agents = agentService.getUserAgents(user.getId()); + return new Result>().ok(agents); + } + + @GetMapping("/all") + @Operation(summary = "智能体列表(管理员)") + @RequiresPermissions("sys:role:superAdmin") + @Parameters({ + @Parameter(name = Constant.PAGE, description = "当前页码,从1开始", required = true), + @Parameter(name = Constant.LIMIT, description = "每页显示记录数", required = true), + }) + public Result> adminAgentList( + @Parameter(hidden = true) @RequestParam Map params) { + PageData page = agentService.adminAgentList(params); + return new Result>().ok(page); + } + + @GetMapping("/{id}") + @Operation(summary = "获取智能体详情") + @RequiresPermissions("sys:role:normal") + public Result getAgentById(@PathVariable("id") String id) { + AgentEntity agent = agentService.getAgentById(id); + return new Result().ok(agent); + } + + @PostMapping + @Operation(summary = "创建智能体") + @RequiresPermissions("sys:role:normal") + public Result save(@RequestBody @Valid AgentCreateDTO dto) { + AgentEntity entity = ConvertUtils.sourceToTarget(dto, AgentEntity.class); + + // 设置用户ID和创建者信息 + UserDetail user = SecurityUser.getUser(); + entity.setUserId(user.getId()); + entity.setCreator(user.getId()); + entity.setCreatedAt(new Date()); + + // ID、智能体编码和排序会在Service层自动生成 + agentService.insert(entity); + + return new Result<>(); + } + + @PutMapping("/{id}") + @Operation(summary = "更新智能体") + @RequiresPermissions("sys:role:normal") + public Result update(@PathVariable String id, @RequestBody @Valid AgentUpdateDTO dto) { + // 先查询现有实体 + AgentEntity existingEntity = agentService.getAgentById(id); + if (existingEntity == null) { + return new Result().error("智能体不存在"); + } + + // 只更新提供的非空字段 + if (dto.getAgentName() != null) { + existingEntity.setAgentName(dto.getAgentName()); + } + if (dto.getAgentCode() != null) { + existingEntity.setAgentCode(dto.getAgentCode()); + } + if (dto.getAsrModelId() != null) { + existingEntity.setAsrModelId(dto.getAsrModelId()); + } + if (dto.getVadModelId() != null) { + existingEntity.setVadModelId(dto.getVadModelId()); + } + if (dto.getLlmModelId() != null) { + existingEntity.setLlmModelId(dto.getLlmModelId()); + } + if (dto.getTtsModelId() != null) { + existingEntity.setTtsModelId(dto.getTtsModelId()); + } + if (dto.getTtsVoiceId() != null) { + existingEntity.setTtsVoiceId(dto.getTtsVoiceId()); + } + if (dto.getMemModelId() != null) { + existingEntity.setMemModelId(dto.getMemModelId()); + } + if (dto.getIntentModelId() != null) { + existingEntity.setIntentModelId(dto.getIntentModelId()); + } + if (dto.getSystemPrompt() != null) { + existingEntity.setSystemPrompt(dto.getSystemPrompt()); + } + if (dto.getLangCode() != null) { + existingEntity.setLangCode(dto.getLangCode()); + } + if (dto.getLanguage() != null) { + existingEntity.setLanguage(dto.getLanguage()); + } + if (dto.getSort() != null) { + existingEntity.setSort(dto.getSort()); + } + + // 设置更新者信息 + UserDetail user = SecurityUser.getUser(); + existingEntity.setUpdater(user.getId()); + existingEntity.setUpdatedAt(new Date()); + + agentService.updateById(existingEntity); + + return new Result<>(); + } + + @DeleteMapping("/{id}") + @Operation(summary = "删除智能体") + @RequiresPermissions("sys:role:normal") + public Result delete(@PathVariable String id) { + agentService.deleteById(id); + return new Result<>(); + } + + @GetMapping("/template") + @Operation(summary = "智能体模板模板列表") + @RequiresPermissions("sys:role:normal") + public Result> templateList() { + List list = agentTemplateService + .list(new QueryWrapper().orderByAsc("sort")); + return new Result>().ok(list); + } +} \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/dao/AgentDao.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/dao/AgentDao.java new file mode 100644 index 00000000..d9aec7d7 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/dao/AgentDao.java @@ -0,0 +1,11 @@ +package xiaozhi.modules.agent.dao; + +import org.apache.ibatis.annotations.Mapper; + +import xiaozhi.common.dao.BaseDao; +import xiaozhi.modules.agent.entity.AgentEntity; + +@Mapper +public interface AgentDao extends BaseDao { + +} \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/dao/AgentTemplateDao.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/dao/AgentTemplateDao.java new file mode 100644 index 00000000..48d95bef --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/dao/AgentTemplateDao.java @@ -0,0 +1,17 @@ +package xiaozhi.modules.agent.dao; + +import org.apache.ibatis.annotations.Mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import xiaozhi.modules.agent.entity.AgentTemplateEntity; + +/** + * @author chenerlei + * @description 针对表【ai_agent_template(智能体配置模板表)】的数据库操作Mapper + * @createDate 2025-03-22 11:48:18 + */ +@Mapper +public interface AgentTemplateDao extends BaseMapper { + +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentCreateDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentCreateDTO.java new file mode 100644 index 00000000..59e77007 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentCreateDTO.java @@ -0,0 +1,21 @@ +package xiaozhi.modules.agent.dto; + +import java.io.Serializable; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +/** + * 智能体创建DTO + * 专用于新增智能体,不包含id、agentCode和sort字段,这些字段由系统自动生成/设置默认值 + */ +@Data +@Schema(description = "智能体创建对象") +public class AgentCreateDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(description = "智能体名称", example = "客服助手") + @NotBlank(message = "智能体名称不能为空") + private String agentName; +} \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentUpdateDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentUpdateDTO.java new file mode 100644 index 00000000..d54685d8 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/AgentUpdateDTO.java @@ -0,0 +1,56 @@ +package xiaozhi.modules.agent.dto; + +import java.io.Serializable; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 智能体更新DTO + * 专用于更新智能体,id字段是必需的,用于标识要更新的智能体 + * 其他字段均为非必填,只更新提供的字段 + */ +@Data +@Schema(description = "智能体更新对象") +public class AgentUpdateDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(description = "智能体编码", example = "AGT_1234567890", required = false) + private String agentCode; + + @Schema(description = "智能体名称", example = "客服助手", required = false) + private String agentName; + + @Schema(description = "语音识别模型标识", example = "asr_model_02", required = false) + private String asrModelId; + + @Schema(description = "语音活动检测标识", example = "vad_model_02", required = false) + private String vadModelId; + + @Schema(description = "大语言模型标识", example = "llm_model_02", required = false) + private String llmModelId; + + @Schema(description = "语音合成模型标识", example = "tts_model_02", required = false) + private String ttsModelId; + + @Schema(description = "音色标识", example = "voice_02", required = false) + private String ttsVoiceId; + + @Schema(description = "记忆模型标识", example = "mem_model_02", required = false) + private String memModelId; + + @Schema(description = "意图模型标识", example = "intent_model_02", required = false) + private String intentModelId; + + @Schema(description = "角色设定参数", example = "你是一个专业的客服助手,负责回答用户问题并提供帮助", required = false) + private String systemPrompt; + + @Schema(description = "语言编码", example = "zh_CN", required = false) + private String langCode; + + @Schema(description = "交互语种", example = "中文", required = false) + private String language; + + @Schema(description = "排序", example = "1", required = false) + private Integer sort; +} \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/entity/AgentEntity.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/entity/AgentEntity.java new file mode 100644 index 00000000..917fe6d2 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/entity/AgentEntity.java @@ -0,0 +1,74 @@ +package xiaozhi.modules.agent.entity; + +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@TableName("ai_agent") +@Schema(description = "智能体信息") +public class AgentEntity { + + @TableId(type = IdType.ASSIGN_UUID) + @Schema(description = "智能体唯一标识") + private String id; + + @Schema(description = "所属用户ID") + private Long userId; + + @Schema(description = "智能体编码") + private String agentCode; + + @Schema(description = "智能体名称") + private String agentName; + + @Schema(description = "语音识别模型标识") + private String asrModelId; + + @Schema(description = "语音活动检测标识") + private String vadModelId; + + @Schema(description = "大语言模型标识") + private String llmModelId; + + @Schema(description = "语音合成模型标识") + private String ttsModelId; + + @Schema(description = "音色标识") + private String ttsVoiceId; + + @Schema(description = "记忆模型标识") + private String memModelId; + + @Schema(description = "意图模型标识") + private String intentModelId; + + @Schema(description = "角色设定参数") + private String systemPrompt; + + @Schema(description = "语言编码") + private String langCode; + + @Schema(description = "交互语种") + private String language; + + @Schema(description = "排序") + private Integer sort; + + @Schema(description = "创建者") + private Long creator; + + @Schema(description = "创建时间") + private Date createdAt; + + @Schema(description = "更新者") + private Long updater; + + @Schema(description = "更新时间") + private Date updatedAt; +} \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/entity/AgentTemplateEntity.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/entity/AgentTemplateEntity.java new file mode 100644 index 00000000..6d83e4fe --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/entity/AgentTemplateEntity.java @@ -0,0 +1,114 @@ +package xiaozhi.modules.agent.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import lombok.Data; + +/** + * 智能体配置模板表 + * + * @TableName ai_agent_template + */ +@TableName(value = "ai_agent_template") +@Data +public class AgentTemplateEntity implements Serializable { + /** + * 智能体唯一标识 + */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** + * 智能体编码 + */ + private String agentCode; + + /** + * 智能体名称 + */ + private String agentName; + + /** + * 语音识别模型标识 + */ + private String asrModelId; + + /** + * 语音活动检测标识 + */ + private String vadModelId; + + /** + * 大语言模型标识 + */ + private String llmModelId; + + /** + * 语音合成模型标识 + */ + private String ttsModelId; + + /** + * 音色标识 + */ + private String ttsVoiceId; + + /** + * 记忆模型标识 + */ + private String memModelId; + + /** + * 意图模型标识 + */ + private String intentModelId; + + /** + * 角色设定参数 + */ + private String systemPrompt; + + /** + * 语言编码 + */ + private String langCode; + + /** + * 交互语种 + */ + private String language; + + /** + * 排序权重 + */ + private Integer sort; + + /** + * 创建者 ID + */ + private Long creator; + + /** + * 创建时间 + */ + private Date createdAt; + + /** + * 更新者 ID + */ + private Long updater; + + /** + * 更新时间 + */ + private Date updatedAt; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentService.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentService.java new file mode 100644 index 00000000..da958e4c --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentService.java @@ -0,0 +1,25 @@ +package xiaozhi.modules.agent.service; + +import java.util.List; +import java.util.Map; + +import xiaozhi.common.page.PageData; +import xiaozhi.common.service.BaseService; +import xiaozhi.modules.agent.entity.AgentEntity; + +public interface AgentService extends BaseService { + /** + * 根据用户ID获取智能体列表 + */ + List getUserAgents(Long userId); + + /** + * 管理员获取所有智能体列表(分页) + */ + PageData adminAgentList(Map params); + + /** + * 获取智能体详情 + */ + AgentEntity getAgentById(String id); +} \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentTemplateService.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentTemplateService.java new file mode 100644 index 00000000..9c27bdb5 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentTemplateService.java @@ -0,0 +1,14 @@ +package xiaozhi.modules.agent.service; + +import com.baomidou.mybatisplus.extension.service.IService; + +import xiaozhi.modules.agent.entity.AgentTemplateEntity; + +/** + * @author chenerlei + * @description 针对表【ai_agent_template(智能体配置模板表)】的数据库操作Service + * @createDate 2025-03-22 11:48:18 + */ +public interface AgentTemplateService extends IService { + +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java new file mode 100644 index 00000000..8e73c003 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java @@ -0,0 +1,65 @@ +package xiaozhi.modules.agent.service.impl; + +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; + +import xiaozhi.common.page.PageData; +import xiaozhi.common.service.impl.BaseServiceImpl; +import xiaozhi.modules.agent.dao.AgentDao; +import xiaozhi.modules.agent.entity.AgentEntity; +import xiaozhi.modules.agent.service.AgentService; + +@Service +public class AgentServiceImpl extends BaseServiceImpl implements AgentService { + private final AgentDao agentDao; + + public AgentServiceImpl(AgentDao agentDao) { + this.agentDao = agentDao; + } + + @Override + public List getUserAgents(Long userId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("user_id", userId); + return agentDao.selectList(wrapper); + } + + @Override + public PageData adminAgentList(Map params) { + IPage page = agentDao.selectPage( + getPage(params, "sort", true), + new QueryWrapper<>()); + return new PageData<>(page.getRecords(), page.getTotal()); + } + + @Override + public AgentEntity getAgentById(String id) { + return agentDao.selectById(id); + } + + @Override + public boolean insert(AgentEntity entity) { + // 如果ID为空,自动生成一个UUID作为ID + if (entity.getId() == null || entity.getId().trim().isEmpty()) { + entity.setId(UUID.randomUUID().toString().replace("-", "")); + } + + // 如果智能体编码为空,自动生成一个带前缀的编码 + if (entity.getAgentCode() == null || entity.getAgentCode().trim().isEmpty()) { + entity.setAgentCode("AGT_" + System.currentTimeMillis()); + } + + // 如果排序字段为空,设置默认值0 + if (entity.getSort() == null) { + entity.setSort(0); + } + + return super.insert(entity); + } +} \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentTemplateServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentTemplateServiceImpl.java new file mode 100644 index 00000000..62338fad --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentTemplateServiceImpl.java @@ -0,0 +1,20 @@ +package xiaozhi.modules.agent.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import xiaozhi.modules.agent.dao.AgentTemplateDao; +import xiaozhi.modules.agent.entity.AgentTemplateEntity; +import xiaozhi.modules.agent.service.AgentTemplateService; + +/** + * @author chenerlei + * @description 针对表【ai_agent_template(智能体配置模板表)】的数据库操作Service实现 + * @createDate 2025-03-22 11:48:18 + */ +@Service +public class AgentTemplateServiceImpl extends ServiceImpl + implements AgentTemplateService { + +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/vo/AgentTemplateVO.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/vo/AgentTemplateVO.java new file mode 100644 index 00000000..a5302e5b --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/vo/AgentTemplateVO.java @@ -0,0 +1,15 @@ +package xiaozhi.modules.agent.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import xiaozhi.modules.agent.entity.AgentTemplateEntity; + +@Data +@EqualsAndHashCode(callSuper = true) +public class AgentTemplateVO extends AgentTemplateEntity { + // 角色音色 + private String ttsModelName; + + // 角色模型 + private String llmModelName; +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/controller/DeviceController.java b/main/manager-api/src/main/java/xiaozhi/modules/device/controller/DeviceController.java index d458e9f9..43009bf8 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/device/controller/DeviceController.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/controller/DeviceController.java @@ -1,82 +1,89 @@ package xiaozhi.modules.device.controller; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Parameters; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.AllArgsConstructor; +import java.util.List; + import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; -import org.springframework.web.bind.annotation.*; -import xiaozhi.common.constant.Constant; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; import xiaozhi.common.exception.ErrorCode; -import xiaozhi.common.page.PageData; import xiaozhi.common.redis.RedisKeys; import xiaozhi.common.redis.RedisUtils; import xiaozhi.common.user.UserDetail; -import xiaozhi.common.utils.JsonUtils; import xiaozhi.common.utils.Result; -import xiaozhi.modules.device.dto.DeviceHeaderDTO; +import xiaozhi.modules.device.dto.DeviceBindDTO; +import xiaozhi.modules.device.dto.DeviceRegisterDTO; import xiaozhi.modules.device.dto.DeviceUnBindDTO; import xiaozhi.modules.device.entity.DeviceEntity; import xiaozhi.modules.device.service.DeviceService; import xiaozhi.modules.security.user.SecurityUser; -import java.util.List; -import java.util.Map; - @Tag(name = "设备管理") @AllArgsConstructor @RestController @RequestMapping("/device") public class DeviceController { private final DeviceService deviceService; + private final RedisUtils redisUtils; - - @PostMapping("/bind/{deviceCode}") + @PostMapping("/bind/{agentId}/{deviceCode}") @Operation(summary = "绑定设备") @RequiresPermissions("sys:role:normal") - public Result bindDevice(@PathVariable String deviceCode) { - UserDetail user = SecurityUser.getUser(); - - String deviceHeaders = (String) redisUtils.get(RedisKeys.getDeviceCaptchaKey(deviceCode)); - if (StringUtils.isBlank(deviceHeaders)) { - return new Result().error(ErrorCode.DEVICE_CAPTCHA_ERROR); + public Result bindDevice(@PathVariable String agentId, @PathVariable String deviceCode) { + String macAddress = (String) redisUtils.get(RedisKeys.getDeviceCaptchaKey(deviceCode)); + if (StringUtils.isBlank(macAddress)) { + return new Result().error(ErrorCode.DEVICE_CAPTCHA_ERROR); } - DeviceHeaderDTO deviceHeader = JsonUtils.parseObject(deviceHeaders.getBytes(), DeviceHeaderDTO.class); - DeviceEntity device = deviceService.bindDevice(user.getId(), deviceHeader); - return new Result().ok(device); + Long user = SecurityUser.getUser().getId(); + DeviceBindDTO deviceBindDTO = new DeviceBindDTO(macAddress, user, agentId); + deviceService.bindDevice(deviceBindDTO); + return new Result<>(); } - @GetMapping("/bind") + @PostMapping("/register") + @Operation(summary = "注册设备") + public Result registerDevice(@RequestBody DeviceRegisterDTO deviceRegisterDTO) { + String macAddress = deviceRegisterDTO.getMacAddress(); + if (StringUtils.isBlank(macAddress)) { + return new Result().error(ErrorCode.NOT_NULL, "mac地址不能为空"); + } + // 生成六位验证码 + String code = String.valueOf(Math.random()).substring(2, 8); + String key = RedisKeys.getDeviceCaptchaKey(code); + String existsMac = null; + do { + existsMac = (String) redisUtils.get(key); + } while (StringUtils.isNotBlank(existsMac)); + + redisUtils.set(key, macAddress); + return new Result().ok(code); + } + + @GetMapping("/bind/{agentId}") @Operation(summary = "获取已绑定设备") @RequiresPermissions("sys:role:normal") - public Result> getUserDevices() { + public Result> getUserDevices(@PathVariable String agentId) { UserDetail user = SecurityUser.getUser(); - List devices = deviceService.getUserDevices(user.getId()); + List devices = deviceService.getUserDevices(user.getId(), agentId); return new Result>().ok(devices); } @PostMapping("/unbind") @Operation(summary = "解绑设备") @RequiresPermissions("sys:role:normal") - public Result unbindDevice(@RequestBody DeviceUnBindDTO unDeviveBind) { + public Result unbindDevice(@RequestBody DeviceUnBindDTO unDeviveBind) { UserDetail user = SecurityUser.getUser(); deviceService.unbindDevice(user.getId(), unDeviveBind.getDeviceId()); - return new Result(); + return new Result(); } - @GetMapping("/all") - @Operation(summary = "设备列表(管理员)") - @RequiresPermissions("sys:role:superAdmin") - @Parameters({ - @Parameter(name = Constant.PAGE, description = "当前页码,从1开始", required = true), - @Parameter(name = Constant.LIMIT, description = "每页显示记录数", required = true), - }) - public Result> adminDeviceList( - @Parameter(hidden = true) @RequestParam Map params) { - PageData page = deviceService.adminDeviceList(params); - return new Result>().ok(page); - } } \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/controller/OTAController.java b/main/manager-api/src/main/java/xiaozhi/modules/device/controller/OTAController.java new file mode 100644 index 00000000..16f53256 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/controller/OTAController.java @@ -0,0 +1,76 @@ +package xiaozhi.modules.device.controller; + +import java.nio.charset.StandardCharsets; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import xiaozhi.common.utils.Result; +import xiaozhi.modules.device.dto.DeviceReportReqDTO; +import xiaozhi.modules.device.dto.DeviceReportRespDTO; +import xiaozhi.modules.device.service.DeviceService; +import xiaozhi.modules.device.utils.NetworkUtil; + +@Tag(name = "设备管理", description = "OTA 相关接口") +@RestController +@RequiredArgsConstructor +@RequestMapping("/ota") +public class OTAController { + private final DeviceService deviceService; + + @Operation(summary = "检查 OTA 版本和设备激活状态") + @PostMapping + public ResponseEntity checkOTAVersion( + @RequestBody DeviceReportReqDTO deviceReportReqDTO, + + @Parameter(name = "Device-Id", description = "设备唯一标识", required = true, in = ParameterIn.HEADER) @RequestHeader("Device-Id") String deviceId, + + @Parameter(name = "Client-Id", description = "客户端标识", required = true, in = ParameterIn.HEADER) @RequestHeader("Client-Id") String clientId) { + if (StringUtils.isAnyBlank(deviceId, clientId)) { + return createResponse(DeviceReportRespDTO.createError("Device ID is required")); + } + String macAddress = deviceReportReqDTO.getMacAddress(); + boolean macAddressValid = NetworkUtil.isMacAddressValid(macAddress); + // 设备Id和Mac地址应是一致的, 并且必须需要application字段 + if (!deviceId.equals(macAddress) || !macAddressValid || deviceReportReqDTO.getApplication() == null) { + return createResponse(DeviceReportRespDTO.createError("Invalid OTA request")); + } + return createResponse(deviceService.checkDeviceActive(macAddress, deviceId, clientId, deviceReportReqDTO)); + } + + @Operation(summary = "设备激活") + @GetMapping("/activation") + public Result deviceActivation(@RequestParam String code) { + return new Result().ok(deviceService.deviceActivation(code)); + } + + @SneakyThrows + private ResponseEntity createResponse(DeviceReportRespDTO deviceReportRespDTO) { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + String json = objectMapper.writeValueAsString(deviceReportRespDTO); + byte[] jsonBytes = json.getBytes(StandardCharsets.UTF_8); + return ResponseEntity + .ok() + .contentType(MediaType.APPLICATION_JSON) + .contentLength(jsonBytes.length) + .body(json); + } +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/dao/DeviceDao.java b/main/manager-api/src/main/java/xiaozhi/modules/device/dao/DeviceDao.java index 9e4a8cd4..5ede3d6e 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/device/dao/DeviceDao.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/dao/DeviceDao.java @@ -1,7 +1,9 @@ package xiaozhi.modules.device.dao; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + import xiaozhi.modules.device.entity.DeviceEntity; @Mapper diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceBindDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceBindDTO.java new file mode 100644 index 00000000..3413c31b --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceBindDTO.java @@ -0,0 +1,27 @@ +package xiaozhi.modules.device.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * 设备绑定的DTO + * + * @author zjy + * @since 2025-3-28 + */ +@Data +@AllArgsConstructor +@Schema(description = "设备连接头信息") +public class DeviceBindDTO { + + @Schema(description = "mac地址") + private String macAddress; + + @Schema(description = "所属用户id") + private Long userId; + + @Schema(description = "智能体id") + private String agentId; + +} \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceHeaderDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceHeaderDTO.java deleted file mode 100644 index 83327fef..00000000 --- a/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceHeaderDTO.java +++ /dev/null @@ -1,19 +0,0 @@ -package xiaozhi.modules.device.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Data -@Schema(description = "设备连接头信息") -public class DeviceHeaderDTO { - - @Schema(description = "设备ID") - private String deviceId; - - @Schema(description = "协议版本号") - private Long protocolVersion; - - @Schema(description = "认证信息") - private String authorization; - -} \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceRegisterDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceRegisterDTO.java new file mode 100644 index 00000000..ce37c517 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceRegisterDTO.java @@ -0,0 +1,23 @@ +package xiaozhi.modules.device.dto; + +import java.io.Serializable; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +/** + * 设备注册头信息 + * + * @author zjy + * @since 2025-3-28 + */ +@Setter +@Getter +@Schema(description = "设备注册头信息") +public class DeviceRegisterDTO implements Serializable { + + @Schema(description = "mac地址") + private String macAddress; + +} \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceReportReqDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceReportReqDTO.java new file mode 100644 index 00000000..fec5a297 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceReportReqDTO.java @@ -0,0 +1,148 @@ +package xiaozhi.modules.device.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.List; + +@Setter +@Getter +@Schema(description = "设备固件信息上报求请求体") +public class DeviceReportReqDTO implements Serializable { + private static final long serialVersionUID = 1L; + // region 实体属性 + @Schema(description = "板子固件版本号") + private Integer version; + + @Schema(description = "闪存大小(单位:字节)") + @JsonProperty("flash_size") + private Integer flashSize; + + @Schema(description = "最小空闲堆内存(字节)") + @JsonProperty("minimum_free_heap_size") + private Integer minimumFreeHeapSize; + + @Schema(description = "设备 MAC 地址") + @JsonProperty("mac_address") + private String macAddress; + + @Schema(description = "设备唯一标识 UUID") + private String uuid; + + @Schema(description = "芯片型号名称") + @JsonProperty("chip_model_name") + private String chipModelName; + + @Schema(description = "芯片详细信息") + @JsonProperty("chip_info") + private ChipInfo chipInfo; + + @Schema(description = "应用程序信息") + private Application application; + + @Schema(description = "分区表列表") + @JsonProperty("partition_table") + private List partitionTable; + + @Schema(description = "当前运行的 OTA 分区信息") + private OtaInfo ota; + + @Schema(description = "板子配置信息") + private BoardInfo board; + + // endregion + + @Getter + @Setter + @Schema(description = "芯片信息") + public static class ChipInfo { + @Schema(description = "芯片模型代码") + private Integer model; + + @Schema(description = "核心数") + private Integer cores; + + @Schema(description = "硬件修订版本") + private Integer revision; + + @Schema(description = "芯片功能标志位") + private Integer features; + } + + @Getter + @Setter + @Schema(description = "板子编译信息") + public static class Application { + @Schema(description = "名称") + private String name; + + @Schema(description = "应用版本号") + private String version; + + @Schema(description = "编译时间(UTC ISO格式)") + @JsonProperty("compile_time") + private String compileTime; + + @Schema(description = "ESP-IDF 版本号") + @JsonProperty("idf_version") + private String idfVersion; + + @Schema(description = "ELF 文件 SHA256 校验") + @JsonProperty("elf_sha256") + private String elfSha256; + } + + @Getter + @Setter + @Schema(description = "分区信息") + public static class Partition { + @Schema(description = "分区标签名") + private String label; + + @Schema(description = "分区类型") + private Integer type; + + @Schema(description = "子类型") + private Integer subtype; + + @Schema(description = "起始地址") + private Integer address; + + @Schema(description = "分区大小") + private Integer size; + } + + @Getter + @Setter + @Schema(description = "OTA信息") + public static class OtaInfo { + @Schema(description = "当前OTA标签") + private String label; + } + + @Getter + @Setter + @Schema(description = "板子连接和网络信息") + public static class BoardInfo { + @Schema(description = "板子类型") + private String type; + + @Schema(description = "连接的 Wi-Fi SSID") + private String ssid; + + @Schema(description = "Wi-Fi 信号强度(RSSI)") + private Integer rssi; + + @Schema(description = "Wi-Fi 信道") + private Integer channel; + + @Schema(description = "IP 地址") + private String ip; + + @Schema(description = "MAC 地址") + private String mac; + } +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceReportRespDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceReportRespDTO.java new file mode 100644 index 00000000..6226378d --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceReportRespDTO.java @@ -0,0 +1,61 @@ +package xiaozhi.modules.device.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +@Data +@Schema(description = "设备OTA检测版本返回体,包含激活码要求") +public class DeviceReportRespDTO { + @Schema(description = "服务器时间") + private ServerTime serverTime; + + @Schema(description = "激活码") + private Activation activation; + + @Schema(description = "错误信息") + private String error; + + @Schema(description = "固件版本信息") + private Firmware firmware; + + @Getter + @Setter + public static class Firmware { + @Schema(description = "版本号") + private String version; + @Schema(description = "下载地址") + private String url; + } + + public static DeviceReportRespDTO createError(String message) { + DeviceReportRespDTO resp = new DeviceReportRespDTO(); + resp.setError(message); + return resp; + } + + @Setter + @Getter + public static class Activation { + @Schema(description = "激活码") + private String code; + + @Schema(description = "激活码信息: 激活地址") + private String message; + + } + + @Getter + @Setter + public static class ServerTime { + @Schema(description = "时间戳") + private Long timestamp; + + @Schema(description = "时区") + private String timeZone; + + @Schema(description = "时区偏移量,单位为分钟") + private Integer timezoneOffset; + } +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceUnBindDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceUnBindDTO.java index 830a51ae..f18df5d4 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceUnBindDTO.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/dto/DeviceUnBindDTO.java @@ -1,10 +1,11 @@ package xiaozhi.modules.device.dto; + +import java.io.Serializable; + import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import lombok.Data; -import java.io.Serializable; - /** * 设备解绑表单 */ @@ -14,6 +15,6 @@ public class DeviceUnBindDTO implements Serializable { @Schema(description = "设备ID") @NotBlank(message = "设备ID不能为空") - private Long deviceId; + private String deviceId; } \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/entity/DeviceEntity.java b/main/manager-api/src/main/java/xiaozhi/modules/device/entity/DeviceEntity.java index ccbe4683..8ebdf934 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/device/entity/DeviceEntity.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/entity/DeviceEntity.java @@ -1,17 +1,26 @@ package xiaozhi.modules.device.entity; -import com.baomidou.mybatisplus.annotation.TableName; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - import java.util.Date; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + @Data +@EqualsAndHashCode(callSuper = false) @TableName("ai_device") @Schema(description = "设备信息") public class DeviceEntity { - @Schema(description = "设备ID") - private Long id; + + @TableId(type = IdType.ASSIGN_UUID) + @Schema(description = "ID") + private String id; @Schema(description = "关联用户ID") private Long userId; @@ -40,15 +49,19 @@ public class DeviceEntity { @Schema(description = "排序") private Integer sort; - @Schema(description = "创建者") - private Long creator; - - @Schema(description = "创建时间") - private Date createDate; - @Schema(description = "更新者") + @TableField(fill = FieldFill.UPDATE) private Long updater; @Schema(description = "更新时间") + @TableField(fill = FieldFill.UPDATE) private Date updateDate; + + @Schema(description = "创建者") + @TableField(fill = FieldFill.INSERT) + private Long creator; + + @Schema(description = "创建时间") + @TableField(fill = FieldFill.INSERT) + private Date createDate; } \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/service/DeviceService.java b/main/manager-api/src/main/java/xiaozhi/modules/device/service/DeviceService.java index 16ad44fe..bc26f649 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/device/service/DeviceService.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/service/DeviceService.java @@ -1,18 +1,42 @@ package xiaozhi.modules.device.service; -import xiaozhi.common.page.PageData; -import xiaozhi.modules.device.dto.DeviceHeaderDTO; +import java.util.List; + +import xiaozhi.modules.device.dto.DeviceBindDTO; +import xiaozhi.modules.device.dto.DeviceReportReqDTO; +import xiaozhi.modules.device.dto.DeviceReportRespDTO; import xiaozhi.modules.device.entity.DeviceEntity; -import java.util.List; -import java.util.Map; - public interface DeviceService { - DeviceEntity bindDevice(Long userId, DeviceHeaderDTO deviceHeader); - - List getUserDevices(Long userId); - - void unbindDevice(Long userId, Long deviceId); - - PageData adminDeviceList(Map params); + + /** + * 根据Mac地址获取设备信息 + */ + DeviceEntity getDeviceById(String macAddress); + + /** + * 检查设备是否激活 + */ + DeviceReportRespDTO checkDeviceActive(String macAddress, String deviceId, String clientId, + DeviceReportReqDTO deviceReport); + + /** + * 绑定设备 + */ + DeviceEntity bindDevice(DeviceBindDTO deviceHeader); + + /** + * 获取用户设备列表 + */ + List getUserDevices(Long userId, String agentId); + + /** + * 解绑设备 + */ + void unbindDevice(Long userId, String deviceId); + + /** + * 设备激活 + */ + Boolean deviceActivation(String activationCode); } \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java index 279a9f2e..4fd63826 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java @@ -1,57 +1,208 @@ package xiaozhi.modules.device.service.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import org.springframework.stereotype.Service; -import xiaozhi.common.page.PageData; -import xiaozhi.common.service.impl.BaseServiceImpl; -import xiaozhi.modules.device.dao.DeviceDao; -import xiaozhi.modules.device.dto.DeviceHeaderDTO; -import xiaozhi.modules.device.entity.DeviceEntity; -import xiaozhi.modules.device.service.DeviceService; - +import java.time.Instant; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; + +import cn.hutool.core.util.RandomUtil; +import xiaozhi.common.exception.RenException; +import xiaozhi.common.service.impl.BaseServiceImpl; +import xiaozhi.common.user.UserDetail; +import xiaozhi.common.utils.ConvertUtils; +import xiaozhi.modules.device.dao.DeviceDao; +import xiaozhi.modules.device.dto.DeviceBindDTO; +import xiaozhi.modules.device.dto.DeviceReportReqDTO; +import xiaozhi.modules.device.dto.DeviceReportRespDTO; +import xiaozhi.modules.device.entity.DeviceEntity; +import xiaozhi.modules.device.service.DeviceService; +import xiaozhi.modules.security.user.SecurityUser; @Service public class DeviceServiceImpl extends BaseServiceImpl implements DeviceService { + private final DeviceDao deviceDao; + private final String frontedUrl; + + private final RedisTemplate redisTemplate; + // 添加构造函数来初始化 deviceMapper - public DeviceServiceImpl(DeviceDao deviceDao) { + public DeviceServiceImpl(DeviceDao deviceDao, + @Value("${app.fronted-url:http://localhost:8001}") String frontedUrl, + RedisTemplate redisTemplate) { this.deviceDao = deviceDao; + this.frontedUrl = frontedUrl; + this.redisTemplate = redisTemplate; } @Override - public DeviceEntity bindDevice(Long userId, DeviceHeaderDTO deviceHeader) { - DeviceEntity device = new DeviceEntity(); - device.setUserId(userId); - device.setMacAddress(deviceHeader.getDeviceId()); - device.setCreateDate(new Date()); - deviceDao.insert(device); - return device; + public DeviceEntity getDeviceById(String deviceId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DeviceEntity::getId, deviceId); + return deviceDao.selectOne(queryWrapper); } @Override - public List getUserDevices(Long userId) { + public Boolean deviceActivation(String activationCode) { + if (StringUtils.isBlank(activationCode)) { + throw new RenException("激活码不能为空"); + } + String deviceKey = "ota:activation:code:" + activationCode; + Object cacheDeviceId = redisTemplate.opsForValue().get(deviceKey); + if (cacheDeviceId == null) { + throw new RenException("激活码错误"); + } + String deviceId = (String) cacheDeviceId; + String safeDeviceId = deviceId.replace(":", "_").toLowerCase(); + String cacheDeviceKey = String.format("ota:activation:data:%s", safeDeviceId); + Map cacheMap = redisTemplate.opsForHash().entries(cacheDeviceKey); + if (cacheMap == null) { + throw new RenException("激活码错误"); + } + String cachedCode = (String) cacheMap.get("activation_code"); + if (!activationCode.equals(cachedCode)) { + throw new RenException("激活码错误"); + } + // 检查设备有没有被激活 + if (selectById(deviceId) != null) { + throw new RenException("设备已激活"); + } + + String macAddress = (String) cacheMap.get("mac_address"); + String board = (String) cacheMap.get("board"); + String appVersion = (String) cacheMap.get("app_version"); + UserDetail user = SecurityUser.getUser(); + if (user.getId() == null) { + throw new RenException("用户未登录"); + } + + Date currentTime = new Date(); + DeviceEntity deviceEntity = new DeviceEntity(); + deviceEntity.setId(deviceId); + deviceEntity.setBoard(board); + deviceEntity.setAppVersion(appVersion); + deviceEntity.setMacAddress(macAddress); + deviceEntity.setUserId(user.getId()); + deviceEntity.setCreator(user.getId()); + deviceEntity.setCreateDate(currentTime); + deviceEntity.setUpdater(user.getId()); + deviceEntity.setUpdateDate(currentTime); + deviceEntity.setLastConnectedAt(currentTime); + deviceDao.insert(deviceEntity); + + // 清理redis缓存 + redisTemplate.delete(cacheDeviceKey); + redisTemplate.delete(deviceKey); + return true; + } + + @Override + public DeviceReportRespDTO checkDeviceActive(String macAddress, String deviceId, String clientId, + DeviceReportReqDTO deviceReport) { + DeviceReportRespDTO response = new DeviceReportRespDTO(); + response.setServerTime(buildServerTime()); + // todo: 此处是固件信息,目前是针对固件上传上来的版本号再返回回去 + // 在未来开发了固件更新功能,需要更换此处代码, + // 或写定时任务定期请求虾哥的OTA,获取最新的版本讯息保存到服务内 + DeviceReportRespDTO.Firmware firmware = new DeviceReportRespDTO.Firmware(); + firmware.setVersion(deviceReport.getApplication().getVersion()); + firmware.setUrl("http://localhost:8002/xiaozhi-esp32-api/api/v1/ota/download"); + response.setFirmware(firmware); + + DeviceEntity deviceById = getDeviceById(deviceId); + if (deviceById != null) { // 如果设备存在,则更新上次连接时间 + deviceById.setLastConnectedAt(new Date()); + deviceDao.updateById(deviceById); + } else { // 如果设备不存在,则生成激活码 + String safeDeviceId = deviceId.replace(":", "_").toLowerCase(); + String dataKey = String.format("ota:activation:data:%s", safeDeviceId); + + Map cacheMap = redisTemplate.opsForHash().entries(dataKey); + DeviceReportRespDTO.Activation code = new DeviceReportRespDTO.Activation(); + + if (cacheMap != null && cacheMap.containsKey("activation_code")) { + String cachedCode = (String) cacheMap.get("activation_code"); + code.setCode(cachedCode); + code.setMessage(frontedUrl + "\n" + cachedCode); + } else { + String newCode = RandomUtil.randomNumbers(6); + code.setCode(newCode); + code.setMessage(frontedUrl + "\n" + newCode); + + Map dataMap = new HashMap<>(); + dataMap.put("id", deviceId); + dataMap.put("mac_address", macAddress); + dataMap.put("board", (deviceReport.getChipModelName() != null) ? deviceReport.getChipModelName() + : (deviceReport.getBoard() != null ? deviceReport.getBoard().getType() : "unknown")); + dataMap.put("app_version", (deviceReport.getApplication() != null) + ? deviceReport.getApplication().getVersion() + : null); + dataMap.put("deviceId", deviceId); + dataMap.put("activation_code", newCode); + + // 写入主数据 key + redisTemplate.opsForHash().putAll(dataKey, dataMap); + redisTemplate.expire(dataKey, 24, TimeUnit.HOURS); + + // 写入反查激活码 key + String codeKey = "ota:activation:code:" + newCode; + redisTemplate.opsForValue().set(codeKey, deviceId, 24, TimeUnit.HOURS); + } + + response.setActivation(code); + } + + return response; + } + + @Override + public DeviceEntity bindDevice(DeviceBindDTO dto) { + // 查看是否已经被绑定 + DeviceEntity deviceEntity = baseDao + .selectOne(new LambdaQueryWrapper().eq(DeviceEntity::getMacAddress, dto.getMacAddress())); + if (deviceEntity != null) { + throw new RenException("设备已绑定"); + } + deviceEntity = ConvertUtils.sourceToTarget(dto, DeviceEntity.class); + baseDao.insert(deviceEntity); + return deviceEntity; + } + + @Override + public List getUserDevices(Long userId, String agentId) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("user_id", userId); - return deviceDao.selectList(wrapper); + wrapper.eq("agent_id", agentId); + return baseDao.selectList(wrapper); } @Override - public void unbindDevice(Long userId, Long deviceId) { - deviceDao.deleteById(deviceId); + public void unbindDevice(Long userId, String deviceId) { + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("user_id", userId); + wrapper.eq("id", deviceId); + baseDao.delete(wrapper); } - @Override - public PageData adminDeviceList(Map params) { - IPage page = deviceDao.selectPage( - getPage(params, "sort", true), - new QueryWrapper<>() - ); - return new PageData<>(page.getRecords(), page.getTotal()); + private DeviceReportRespDTO.ServerTime buildServerTime() { + DeviceReportRespDTO.ServerTime serverTime = new DeviceReportRespDTO.ServerTime(); + TimeZone tz = TimeZone.getDefault(); + serverTime.setTimestamp(Instant.now().toEpochMilli()); + serverTime.setTimeZone(tz.getID()); + serverTime.setTimezoneOffset(tz.getOffset(System.currentTimeMillis()) / (60 * 1000)); + return serverTime; } - } \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/utils/NetworkUtil.java b/main/manager-api/src/main/java/xiaozhi/modules/device/utils/NetworkUtil.java new file mode 100644 index 00000000..ab269f7b --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/utils/NetworkUtil.java @@ -0,0 +1,34 @@ +package xiaozhi.modules.device.utils; + +import java.util.regex.Pattern; + +import org.apache.commons.lang3.StringUtils; + +/** + * 网络工具类 + */ +public class NetworkUtil { + /** + * MAC地址正则表达式 + */ + private static final Pattern macPattern = Pattern.compile("^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$"); + + /** + * 判断MAC地址是否合法 + */ + public static boolean isMacAddressValid(String mac) { + if (StringUtils.isBlank(mac)) { + return false; + } + // 正则校验格式 + if (!macPattern.matcher(mac).matches()) { + return false; + } + // 校验MAC地址是否为单播地址 + String normalized = mac.toLowerCase(); + String[] parts = normalized.split("[:-]"); + int firstByte = Integer.parseInt(parts[0], 16); + return (firstByte & 1) == 0; // 最低位为0表示单播地址,合法 + } + +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/vo/DeviceOtaVO.java b/main/manager-api/src/main/java/xiaozhi/modules/device/vo/DeviceOtaVO.java new file mode 100644 index 00000000..ec8e405e --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/vo/DeviceOtaVO.java @@ -0,0 +1,59 @@ +package xiaozhi.modules.device.vo; + +import lombok.Data; + +@Data +public class DeviceOtaVO { + private Activation activation; + private Mqtt mqtt; + private ServerTime server_time; + private Firmware firmware; + private String error; + + @Data + public static class Activation { + private String code; + private String message; + + public Activation() { + } + + public Activation(String code, String message) { + this.code = code; + this.message = message; + } + } + + @Data + public class Mqtt { + + } + + @Data + public static class ServerTime { + private Long timestamp; + private Integer timezone_offset; + + public ServerTime() { + } + + public ServerTime(Long timestamp, Integer timezone_offset) { + this.timestamp = timestamp; + this.timezone_offset = timezone_offset; + } + } + + @Data + public static class Firmware { + private String version; + private String url; + + public Firmware() { + } + + public Firmware(String version, String url) { + this.version = version; + this.url = url; + } + } +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/controller/ModelController.java b/main/manager-api/src/main/java/xiaozhi/modules/model/controller/ModelController.java new file mode 100644 index 00000000..af1e772f --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/controller/ModelController.java @@ -0,0 +1,115 @@ +package xiaozhi.modules.model.controller; + +import java.util.List; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import xiaozhi.common.page.PageData; +import xiaozhi.common.utils.Result; +import xiaozhi.modules.model.dto.ModelConfigBodyDTO; +import xiaozhi.modules.model.dto.ModelConfigDTO; +import xiaozhi.modules.model.dto.ModelProviderDTO; +import xiaozhi.modules.model.dto.ModelProviderFieldDTO; +import xiaozhi.modules.model.service.ModelConfigService; +import xiaozhi.modules.model.service.ModelProviderService; + +@AllArgsConstructor +@RestController +@RequestMapping("/models") +@Tag(name = "模型配置") +public class ModelController { + + private final ModelProviderService modelProviderService; + + private final ModelConfigService modelConfigService; + + @GetMapping("/models/names") + @Operation(summary = "获取所有模型名称") + @RequiresPermissions("sys:role:superAdmin") + public Result> getModelNames(@RequestParam String modelType, + @RequestParam(required = false) String modelName) { + List modelNameList = modelConfigService.getModelCodeList(modelType, modelName); + return new Result>().ok(modelNameList); + } + + @GetMapping("/{modelType}/provideTypes") + @Operation(summary = "获取模型供应器列表") + @RequiresPermissions("sys:role:superAdmin") + public Result> getModelProviderList(@PathVariable String modelType) { + List modelProviderDTOS = modelProviderService.getListByModelType(modelType); + return new Result>().ok(modelProviderDTOS); + } + + @GetMapping("/{modelType}/{provideCode}/fields") + @Operation(summary = "获取模型供应器字段") + @RequiresPermissions("sys:role:superAdmin") + public Result> getModelProviderFields(@PathVariable String modelType, + @PathVariable String provideCode) { + List fieldList = modelProviderService.getFieldList(modelType, provideCode); + return new Result>().ok(fieldList); + } + + @GetMapping("/models/list") + @Operation(summary = "获取模型配置列表") + @RequiresPermissions("sys:role:superAdmin") + public Result> getModelConfigList( + @RequestParam(required = true) String modelType, + @RequestParam(required = false) String modelName, + @RequestParam(required = true, defaultValue = "0") String page, + @RequestParam(required = true, defaultValue = "10") String limit) { + PageData pageList = modelConfigService.getPageList(modelType, modelName, page, limit); + return new Result>().ok(pageList); + } + + @PostMapping("/models/{modelType}/{provideCode}") + @Operation(summary = "新增模型配置") + @RequiresPermissions("sys:role:superAdmin") + public Result addModelConfig(@PathVariable String modelType, + @PathVariable String provideCode, + @RequestBody ModelConfigBodyDTO modelConfigBodyDTO) { + ModelConfigDTO modelConfigDTO = modelConfigService.add(modelType, provideCode, modelConfigBodyDTO); + return new Result().ok(modelConfigDTO); + } + + @PutMapping("/models/{modelType}/{provideCode}/{id}") + @Operation(summary = "编辑模型配置") + @RequiresPermissions("sys:role:superAdmin") + public Result editModelConfig(@PathVariable String modelType, + @PathVariable String provideCode, + @PathVariable String id, + @RequestBody ModelConfigBodyDTO modelConfigBodyDTO) { + ModelConfigDTO modelConfigDTO = modelConfigService.edit(modelType, provideCode, id, modelConfigBodyDTO); + return new Result().ok(modelConfigDTO); + } + + @DeleteMapping("/models/{modelType}/{provideCode}/{id}") + @Operation(summary = "删除模型配置") + @RequiresPermissions("sys:role:superAdmin") + public Result deleteModelConfig(@PathVariable String modelType, @PathVariable String provideCode, + @PathVariable String id) { + modelConfigService.delete(modelType, provideCode, id); + return new Result<>(); + } + + @GetMapping("/models/{modelId}/voices") + @Operation(summary = "获取模型音色") + @RequiresPermissions("sys:role:normal") + public Result> getVoiceList(@PathVariable String modelId, + @RequestParam(required = false) String voiceName) { + + List voiceList = modelConfigService.getVoiceList(modelId, voiceName); + return new Result>().ok(voiceList); + } +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/dao/ModelConfigDao.java b/main/manager-api/src/main/java/xiaozhi/modules/model/dao/ModelConfigDao.java new file mode 100644 index 00000000..79c526f0 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/dao/ModelConfigDao.java @@ -0,0 +1,18 @@ +package xiaozhi.modules.model.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import xiaozhi.common.dao.BaseDao; +import xiaozhi.modules.model.entity.ModelConfigEntity; + +@Mapper +public interface ModelConfigDao extends BaseDao { + + /** + * get model_code list + */ + List getModelCodeList(@Param("modelType") String modelType, @Param("modelName") String modelName); +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/dao/ModelProviderDao.java b/main/manager-api/src/main/java/xiaozhi/modules/model/dao/ModelProviderDao.java new file mode 100644 index 00000000..68e41858 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/dao/ModelProviderDao.java @@ -0,0 +1,15 @@ +package xiaozhi.modules.model.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import xiaozhi.common.dao.BaseDao; +import xiaozhi.modules.model.entity.ModelProviderEntity; + +@Mapper +public interface ModelProviderDao extends BaseDao { + + List getFieldList(@Param("modelType") String modelType, @Param("providerCode") String providerCode); +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelConfigBodyDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelConfigBodyDTO.java new file mode 100644 index 00000000..3e335bf0 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelConfigBodyDTO.java @@ -0,0 +1,41 @@ +package xiaozhi.modules.model.dto; + +import java.io.Serial; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "模型供应器/商") +public class ModelConfigBodyDTO { + + @Serial + private static final long serialVersionUID = 1L; + + // @Schema(description = "模型类型(Memory/ASR/VAD/LLM/TTS)") + // private String modelType; + // + @Schema(description = "模型编码(如AliLLM、DoubaoTTS)") + private String modelCode; + + @Schema(description = "模型名称") + private String modelName; + + @Schema(description = "是否默认配置(0否 1是)") + private Integer isDefault; + + @Schema(description = "是否启用") + private Integer isEnabled; + + @Schema(description = "模型配置(JSON格式)") + private String configJson; + + @Schema(description = "官方文档链接") + private String docLink; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "排序") + private Integer sort; +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelConfigDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelConfigDTO.java new file mode 100644 index 00000000..a7b1b436 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelConfigDTO.java @@ -0,0 +1,45 @@ +package xiaozhi.modules.model.dto; + +import java.io.Serial; +import java.io.Serializable; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "模型供应器/商") +public class ModelConfigDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "主键") + private String id; + + @Schema(description = "模型类型(Memory/ASR/VAD/LLM/TTS)") + private String modelType; + + @Schema(description = "模型编码(如AliLLM、DoubaoTTS)") + private String modelCode; + + @Schema(description = "模型名称") + private String modelName; + + @Schema(description = "是否默认配置(0否 1是)") + private Integer isDefault; + + @Schema(description = "是否启用") + private Integer isEnabled; + + @Schema(description = "模型配置(JSON格式)") + private String configJson; + + @Schema(description = "官方文档链接") + private String docLink; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "排序") + private Integer sort; +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelProviderDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelProviderDTO.java new file mode 100644 index 00000000..605ed13a --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelProviderDTO.java @@ -0,0 +1,51 @@ +package xiaozhi.modules.model.dto; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "模型供应器/商") +public class ModelProviderDTO implements Serializable { + // + // @Schema(description = "主键") + // private Long id; + + @Schema(description = "模型类型(Memory/ASR/VAD/LLM/TTS)") + private String modelType; + + @Schema(description = "供应器类型") + private String providerCode; + + @Schema(description = "供应器名称") + private String name; + + @Schema(description = "供应器字段列表(JSON格式)") + @TableField(typeHandler = JacksonTypeHandler.class) + private String fields; + + @Schema(description = "排序") + private Integer sort; + + @Schema(description = "更新者") + @TableField(fill = FieldFill.UPDATE) + private Long updater; + + @Schema(description = "更新时间") + @TableField(fill = FieldFill.UPDATE) + private Date updateDate; + + @Schema(description = "创建者") + @TableField(fill = FieldFill.INSERT) + private Long creator; + + @Schema(description = "创建时间") + @TableField(fill = FieldFill.INSERT) + private Date createDate; +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelProviderFieldDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelProviderFieldDTO.java new file mode 100644 index 00000000..8186b363 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/dto/ModelProviderFieldDTO.java @@ -0,0 +1,19 @@ +package xiaozhi.modules.model.dto; + +import java.io.Serializable; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "模型供应器字段") +public class ModelProviderFieldDTO implements Serializable { + @Schema(description = "字段名") + private String key; + + @Schema(description = "字段标签") + private String label; + + @Schema(description = "字段类型") + private String type; +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/entity/ModelConfigEntity.java b/main/manager-api/src/main/java/xiaozhi/modules/model/entity/ModelConfigEntity.java new file mode 100644 index 00000000..0111ea96 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/entity/ModelConfigEntity.java @@ -0,0 +1,67 @@ +package xiaozhi.modules.model.entity; + +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@TableName("ai_model_config") +@Schema(description = "模型配置表") +public class ModelConfigEntity { + + @TableId(type = IdType.ASSIGN_UUID) + @Schema(description = "主键") + private String id; + + @Schema(description = "模型类型(Memory/ASR/VAD/LLM/TTS)") + private String modelType; + + @Schema(description = "模型编码(如AliLLM、DoubaoTTS)") + private String modelCode; + + @Schema(description = "模型名称") + private String modelName; + + @Schema(description = "是否默认配置(0否 1是)") + private Integer isDefault; + + @Schema(description = "是否启用") + private Integer isEnabled; + + @TableField(typeHandler = JacksonTypeHandler.class) + @Schema(description = "模型配置(JSON格式)") + private String configJson; + + @Schema(description = "官方文档链接") + private String docLink; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "排序") + private Integer sort; + + @Schema(description = "更新者") + @TableField(fill = FieldFill.UPDATE) + private Long updater; + + @Schema(description = "更新时间") + @TableField(fill = FieldFill.UPDATE) + private Date updateDate; + + @Schema(description = "创建者") + @TableField(fill = FieldFill.INSERT) + private Long creator; + + @Schema(description = "创建时间") + @TableField(fill = FieldFill.INSERT) + private Date createDate; +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/entity/ModelProviderEntity.java b/main/manager-api/src/main/java/xiaozhi/modules/model/entity/ModelProviderEntity.java new file mode 100644 index 00000000..62e84f67 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/entity/ModelProviderEntity.java @@ -0,0 +1,50 @@ +package xiaozhi.modules.model.entity; + +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@TableName("ai_model_provider") +@Schema(description = "模型供应器表") +public class ModelProviderEntity { + + @TableId(type = IdType.ASSIGN_UUID) + @Schema(description = "主键") + private String id; + + @Schema(description = "模型类型(Memory/ASR/VAD/LLM/TTS)") + private String modelType; + + @Schema(description = "供应器类型,如 openai、") + private String providerCode; + + @Schema(description = "供应器名称") + private String name; + + @Schema(description = "供应器字段列表(JSON格式)") + @TableField(typeHandler = JacksonTypeHandler.class) + private String fields; + + @Schema(description = "排序") + private Integer sort; + + @Schema(description = "创建者") + private Long creator; + + @Schema(description = "创建时间") + private Date createDate; + + @Schema(description = "更新者") + private Long updater; + + @Schema(description = "更新时间") + private Date updateDate; +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelConfigService.java b/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelConfigService.java new file mode 100644 index 00000000..78e9d0ce --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelConfigService.java @@ -0,0 +1,22 @@ +package xiaozhi.modules.model.service; + +import java.util.List; + +import xiaozhi.common.page.PageData; +import xiaozhi.modules.model.dto.ModelConfigBodyDTO; +import xiaozhi.modules.model.dto.ModelConfigDTO; + +public interface ModelConfigService { + + List getModelCodeList(String modelType, String modelName); + + PageData getPageList(String modelType, String modelName, String page, String limit); + + ModelConfigDTO add(String modelType, String provideCode, ModelConfigBodyDTO modelConfigBodyDTO); + + ModelConfigDTO edit(String modelType, String provideCode, String id, ModelConfigBodyDTO modelConfigBodyDTO); + + void delete(String modelType, String provideCode, String id); + + List getVoiceList(String modelName, String voiceName); +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelProviderService.java b/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelProviderService.java new file mode 100644 index 00000000..cb92c953 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelProviderService.java @@ -0,0 +1,24 @@ +package xiaozhi.modules.model.service; + +import java.util.List; + +import xiaozhi.modules.model.dto.ModelProviderDTO; +import xiaozhi.modules.model.dto.ModelProviderFieldDTO; +import xiaozhi.modules.model.entity.ModelProviderEntity; + +public interface ModelProviderService { + + // List getModelNames(String modelType, String modelName); + + List getListByModelType(String modelType); + + ModelProviderDTO add(ModelProviderEntity modelProviderEntity); + + ModelProviderDTO edit(ModelProviderEntity modelProviderEntity); + + void delete(); + + List getList(String modelType, String provideCode); + + List getFieldList(String modelType, String provideCode); +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java new file mode 100644 index 00000000..6372dc0c --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java @@ -0,0 +1,115 @@ +package xiaozhi.modules.model.service.impl; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; + +import cn.hutool.core.collection.CollectionUtil; +import lombok.AllArgsConstructor; +import xiaozhi.common.constant.Constant; +import xiaozhi.common.exception.RenException; +import xiaozhi.common.page.PageData; +import xiaozhi.common.service.impl.BaseServiceImpl; +import xiaozhi.common.utils.ConvertUtils; +import xiaozhi.modules.model.dao.ModelConfigDao; +import xiaozhi.modules.model.dto.ModelConfigBodyDTO; +import xiaozhi.modules.model.dto.ModelConfigDTO; +import xiaozhi.modules.model.dto.ModelProviderDTO; +import xiaozhi.modules.model.entity.ModelConfigEntity; +import xiaozhi.modules.model.service.ModelConfigService; +import xiaozhi.modules.model.service.ModelProviderService; +import xiaozhi.modules.timbre.service.TimbreService; + +@Service +@AllArgsConstructor +public class ModelConfigServiceImpl extends BaseServiceImpl + implements ModelConfigService { + + private final ModelConfigDao modelConfigDao; + private final ModelProviderService modelProviderService; + private final TimbreService timbreService; + + private static final Logger logger = LoggerFactory.getLogger(ModelConfigServiceImpl.class); + + @Override + public List getModelCodeList(String modelType, String modelName) { + return modelConfigDao.getModelCodeList(modelType, modelName); + } + + @Override + public PageData getPageList(String modelType, String modelName, String page, String limit) { + Map params = new HashMap(); + params.put(Constant.PAGE, page); + params.put(Constant.LIMIT, limit); + IPage modelConfigEntityIPage = modelConfigDao.selectPage( + getPage(params, "sort", true), + new QueryWrapper() + .eq("model_type", modelType) + .like(StringUtils.isNotBlank(modelName), "model_name", "%" + modelName + "%")); + return getPageData(modelConfigEntityIPage, ModelConfigDTO.class); + } + + @Override + public ModelConfigDTO add(String modelType, String provideCode, ModelConfigBodyDTO modelConfigBodyDTO) { + // 先验证有没有供应器 + if (StringUtils.isBlank(modelType) || StringUtils.isBlank(provideCode)) { + throw new RenException("modelType和provideCode不能为空"); + } + List providerList = modelProviderService.getList(modelType, provideCode); + if (CollectionUtil.isEmpty(providerList)) { + throw new RenException("供应器不存在"); + } + + // 再保存供应器提供的模型 + ModelConfigEntity modelConfigEntity = ConvertUtils.sourceToTarget(modelConfigBodyDTO, ModelConfigEntity.class); + modelConfigEntity.setModelType(modelType); + modelConfigDao.insert(modelConfigEntity); + return ConvertUtils.sourceToTarget(modelConfigEntity, ModelConfigDTO.class); + } + + @Override + public ModelConfigDTO edit(String modelType, String provideCode, String id, ModelConfigBodyDTO modelConfigBodyDTO) { + // 先验证有没有供应器 + if (StringUtils.isBlank(modelType) || StringUtils.isBlank(provideCode)) { + throw new RenException("modelType和provideCode不能为空"); + } + List providerList = modelProviderService.getList(modelType, provideCode); + if (CollectionUtil.isEmpty(providerList)) { + throw new RenException("供应器不存在"); + } + + // 再更新供应器提供的模型 + ModelConfigEntity modelConfigEntity = ConvertUtils.sourceToTarget(modelConfigBodyDTO, ModelConfigEntity.class); + modelConfigEntity.setId(id); + modelConfigEntity.setModelType(modelType); + modelConfigDao.updateById(modelConfigEntity); + return ConvertUtils.sourceToTarget(modelConfigEntity, ModelConfigDTO.class); + } + + @Override + public void delete(String modelType, String provideCode, String id) { + // 先验证有没有供应器 + if (StringUtils.isBlank(modelType) || StringUtils.isBlank(provideCode)) { + throw new RenException("modelType和provideCode不能为空"); + } + List providerList = modelProviderService.getList(modelType, provideCode); + if (CollectionUtil.isEmpty(providerList)) { + throw new RenException("供应器不存在"); + } + + modelConfigDao.deleteById(id); + } + + @Override + public List getVoiceList(String modelId, String voiceName) { + return timbreService.getVoiceNames(modelId, voiceName); + } +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelProviderServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelProviderServiceImpl.java new file mode 100644 index 00000000..7580d479 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelProviderServiceImpl.java @@ -0,0 +1,70 @@ +package xiaozhi.modules.model.service.impl; + +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import lombok.AllArgsConstructor; +import xiaozhi.common.service.impl.BaseServiceImpl; +import xiaozhi.common.utils.ConvertUtils; +import xiaozhi.common.utils.JsonUtils; +import xiaozhi.modules.model.dao.ModelProviderDao; +import xiaozhi.modules.model.dto.ModelProviderDTO; +import xiaozhi.modules.model.dto.ModelProviderFieldDTO; +import xiaozhi.modules.model.entity.ModelProviderEntity; +import xiaozhi.modules.model.service.ModelProviderService; + +@Service +@AllArgsConstructor +public class ModelProviderServiceImpl extends BaseServiceImpl + implements ModelProviderService { + + private final ModelProviderDao modelProviderDao; + + @Override + public List getListByModelType(String modelType) { + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("model_type", StringUtils.isBlank(modelType) ? "" : modelType); + List providerEntities = modelProviderDao.selectList(queryWrapper); + return ConvertUtils.sourceToTarget(providerEntities, ModelProviderDTO.class); + } + + @Override + public ModelProviderDTO add(ModelProviderEntity modelProviderEntity) { + return null; + } + + @Override + public ModelProviderDTO edit(ModelProviderEntity modelProviderEntity) { + return null; + } + + @Override + public void delete() { + + } + + @Override + public List getList(String modelType, String providerCode) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("model_type", StringUtils.isBlank(modelType) ? "" : modelType); + queryWrapper.eq("provider_code", StringUtils.isBlank(providerCode) ? "" : providerCode); + List providerEntities = modelProviderDao.selectList(queryWrapper); + return ConvertUtils.sourceToTarget(providerEntities, ModelProviderDTO.class); + } + + @Override + public List getFieldList(String modelType, String providerCode) { + List modelProviderEntities = modelProviderDao.getFieldList(modelType, providerCode); + if (modelProviderEntities == null || modelProviderEntities.isEmpty()) { + return null; + } + String fields = modelProviderEntities.getFirst(); + List fieldList = JsonUtils.parseArray(fields, ModelProviderFieldDTO.class); + return fieldList; + } +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/config/FilterConfig.java b/main/manager-api/src/main/java/xiaozhi/modules/security/config/FilterConfig.java index 607cb68b..d74ed08b 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/config/FilterConfig.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/config/FilterConfig.java @@ -5,7 +5,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.filter.DelegatingFilterProxy; - /** * Filter配置 * Copyright (c) 人人开源 All rights reserved. @@ -18,7 +17,7 @@ public class FilterConfig { public FilterRegistrationBean shiroFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean<>(); registration.setFilter(new DelegatingFilterProxy("shiroFilter")); - //该值缺省为false,表示生命周期由SpringApplicationContext管理,设置为true则表示由ServletContainer管理 + // 该值缺省为false,表示生命周期由SpringApplicationContext管理,设置为true则表示由ServletContainer管理 registration.addInitParameter("targetFilterLifecycle", "true"); registration.setEnabled(true); registration.setOrder(Integer.MAX_VALUE - 1); diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/config/ShiroConfig.java b/main/manager-api/src/main/java/xiaozhi/modules/security/config/ShiroConfig.java index de25d80e..e5b89c99 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/config/ShiroConfig.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/config/ShiroConfig.java @@ -1,8 +1,9 @@ package xiaozhi.modules.security.config; -import xiaozhi.modules.security.oauth2.Oauth2Filter; -import xiaozhi.modules.security.oauth2.Oauth2Realm; -import jakarta.servlet.Filter; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.session.mgt.SessionManager; import org.apache.shiro.spring.LifecycleBeanPostProcessor; @@ -14,9 +15,9 @@ import org.apache.shiro.web.session.mgt.DefaultWebSessionManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map; +import jakarta.servlet.Filter; +import xiaozhi.modules.security.oauth2.Oauth2Filter; +import xiaozhi.modules.security.oauth2.Oauth2Realm; /** * Shiro的配置文件 @@ -53,18 +54,21 @@ public class ShiroConfig { shiroFilter.setSecurityManager(securityManager); shiroFilter.setShiroFilterConfiguration(config); - //oauth过滤 + // oauth过滤 Map filters = new HashMap<>(); filters.put("oauth2", new Oauth2Filter()); shiroFilter.setFilters(filters); - //添加Shiro的内置过滤器 - /*anon:无需认证就可以访问 - authc:必须认证了才能让问 - user:必须拥有,记住我功能,才能访问 - perms:拥有对某个资源的权限才能访问 - role:拥有某个角色权限才能访问*/ + // 添加Shiro的内置过滤器 + /* + * anon:无需认证就可以访问 + * authc:必须认证了才能让问 + * user:必须拥有,记住我功能,才能访问 + * perms:拥有对某个资源的权限才能访问 + * role:拥有某个角色权限才能访问 + */ Map filterMap = new LinkedHashMap<>(); + filterMap.put("/ota/**", "anon"); filterMap.put("/webjars/**", "anon"); filterMap.put("/druid/**", "anon"); filterMap.put("/v3/api-docs/**", "anon"); @@ -73,6 +77,7 @@ public class ShiroConfig { filterMap.put("/user/captcha", "anon"); filterMap.put("/user/login", "anon"); filterMap.put("/user/register", "anon"); + filterMap.put("/device/register", "anon"); filterMap.put("/**", "oauth2"); shiroFilter.setFilterChainDefinitionMap(filterMap); diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/config/WebMvcConfig.java b/main/manager-api/src/main/java/xiaozhi/modules/security/config/WebMvcConfig.java index a086e953..7cfb03d9 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/config/WebMvcConfig.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/config/WebMvcConfig.java @@ -1,9 +1,8 @@ package xiaozhi.modules.security.config; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.module.SimpleModule; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import java.util.List; +import java.util.TimeZone; + import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.ByteArrayHttpMessageConverter; @@ -15,8 +14,10 @@ import org.springframework.http.converter.support.AllEncompassingFormHttpMessage import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import java.util.List; -import java.util.TimeZone; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; @Configuration public class WebMvcConfig implements WebMvcConfigurer { @@ -45,14 +46,14 @@ public class WebMvcConfig implements WebMvcConfigurer { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); ObjectMapper mapper = new ObjectMapper(); - //忽略未知属性 + // 忽略未知属性 mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - //日期格式转换 - //mapper.setDateFormat(new SimpleDateFormat(DateUtils.DATE_TIME_PATTERN)); + // 日期格式转换 + // mapper.setDateFormat(new SimpleDateFormat(DateUtils.DATE_TIME_PATTERN)); mapper.setTimeZone(TimeZone.getTimeZone("GMT+8")); - //Long类型转String类型 + // Long类型转String类型 SimpleModule simpleModule = new SimpleModule(); simpleModule.addSerializer(Long.class, ToStringSerializer.instance); simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/controller/LoginController.java b/main/manager-api/src/main/java/xiaozhi/modules/security/controller/LoginController.java index 6ab9d1b9..7db612b5 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/controller/LoginController.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/controller/LoginController.java @@ -1,18 +1,25 @@ package xiaozhi.modules.security.controller; +import java.io.IOException; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.web.bind.annotation.*; import xiaozhi.common.exception.ErrorCode; import xiaozhi.common.exception.RenException; import xiaozhi.common.page.TokenDTO; import xiaozhi.common.user.UserDetail; import xiaozhi.common.utils.Result; import xiaozhi.common.validator.AssertUtils; +import xiaozhi.common.validator.ValidatorUtils; import xiaozhi.modules.security.dto.LoginDTO; import xiaozhi.modules.security.password.PasswordUtils; import xiaozhi.modules.security.service.CaptchaService; @@ -22,8 +29,6 @@ import xiaozhi.modules.sys.dto.PasswordDTO; import xiaozhi.modules.sys.dto.SysUserDTO; import xiaozhi.modules.sys.service.SysUserService; -import java.io.IOException; - /** * 登录控制层 */ @@ -36,14 +41,13 @@ public class LoginController { private final SysUserTokenService sysUserTokenService; private final CaptchaService captchaService; - @GetMapping("/captcha") @Operation(summary = "验证码") public void captcha(HttpServletResponse response, String uuid) throws IOException { - //uuid不能为空 + // uuid不能为空 AssertUtils.isBlank(uuid, ErrorCode.IDENTIFIER_NOT_NULL); - //生成验证码 + // 生成验证码 captchaService.create(response, uuid); } @@ -101,6 +105,8 @@ public class LoginController { @PutMapping("/change-password") @Operation(summary = "修改用户密码") public Result changePassword(@RequestBody PasswordDTO passwordDTO) { + // 判断非空 + ValidatorUtils.validateEntity(passwordDTO); Long userId = SecurityUser.getUserId(); sysUserTokenService.changePassword(userId, passwordDTO); return new Result<>(); diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/dao/SysUserTokenDao.java b/main/manager-api/src/main/java/xiaozhi/modules/security/dao/SysUserTokenDao.java index 044568e5..05f946d3 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/dao/SysUserTokenDao.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/dao/SysUserTokenDao.java @@ -1,12 +1,13 @@ package xiaozhi.modules.security.dao; +import java.util.Date; + import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; + import xiaozhi.common.dao.BaseDao; import xiaozhi.modules.security.entity.SysUserTokenEntity; -import java.util.Date; - /** * 系统用户Token * Copyright (c) 人人开源 All rights reserved. diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/dto/LoginDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/security/dto/LoginDTO.java index 2fc0d3b2..cab143be 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/dto/LoginDTO.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/dto/LoginDTO.java @@ -1,11 +1,11 @@ package xiaozhi.modules.security.dto; +import java.io.Serializable; + import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import lombok.Data; -import java.io.Serializable; - /** * 登录表单 */ diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/entity/SysUserTokenEntity.java b/main/manager-api/src/main/java/xiaozhi/modules/security/entity/SysUserTokenEntity.java index fb96f88c..2346b5e4 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/entity/SysUserTokenEntity.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/entity/SysUserTokenEntity.java @@ -1,13 +1,14 @@ package xiaozhi.modules.security.entity; +import java.io.Serializable; +import java.util.Date; + import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import java.io.Serializable; -import java.util.Date; +import lombok.Data; /** * 系统用户Token diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/oauth2/Oauth2Realm.java b/main/manager-api/src/main/java/xiaozhi/modules/security/oauth2/Oauth2Realm.java index b7d6c278..27c3bc49 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/oauth2/Oauth2Realm.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/oauth2/Oauth2Realm.java @@ -1,7 +1,15 @@ package xiaozhi.modules.security.oauth2; -import jakarta.annotation.Resource; -import org.apache.shiro.authc.*; +import java.util.HashSet; +import java.util.Set; + +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.AuthenticationInfo; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.DisabledAccountException; +import org.apache.shiro.authc.IncorrectCredentialsException; +import org.apache.shiro.authc.LockedAccountException; +import org.apache.shiro.authc.SimpleAuthenticationInfo; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; @@ -10,6 +18,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; + +import jakarta.annotation.Resource; import xiaozhi.common.exception.ErrorCode; import xiaozhi.common.user.UserDetail; import xiaozhi.common.utils.ConvertUtils; @@ -19,8 +29,6 @@ import xiaozhi.modules.security.service.ShiroService; import xiaozhi.modules.sys.entity.SysUserEntity; import xiaozhi.modules.sys.enums.SuperAdminEnum; -import java.util.Set; - /** * 认证 * Copyright (c) 人人开源 All rights reserved. @@ -46,8 +54,8 @@ public class Oauth2Realm extends AuthorizingRealm { protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { UserDetail user = (UserDetail) principals.getPrimaryPrincipal(); - //用户权限列表 - Set permsSet = shiroService.getUserPermissions(user); + // 用户权限列表 + Set permsSet = new HashSet<>(); if (user.getSuperAdmin() == SuperAdminEnum.YES.value()) { permsSet.add("sys:role:superAdmin"); @@ -68,22 +76,22 @@ public class Oauth2Realm extends AuthorizingRealm { protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { String accessToken = (String) token.getPrincipal(); - //根据accessToken,查询用户信息 + // 根据accessToken,查询用户信息 SysUserTokenEntity tokenEntity = shiroService.getByToken(accessToken); - //token失效 + // token失效 if (tokenEntity == null || tokenEntity.getExpireDate().getTime() < System.currentTimeMillis()) { throw new IncorrectCredentialsException(MessageUtils.getMessage(ErrorCode.TOKEN_INVALID)); } - //查询用户信息 + // 查询用户信息 SysUserEntity userEntity = shiroService.getUser(tokenEntity.getUserId()); - //转换成UserDetail对象 + // 转换成UserDetail对象 UserDetail userDetail = ConvertUtils.sourceToTarget(userEntity, UserDetail.class); userDetail.setToken(accessToken); - //账号锁定 + // 账号锁定 if (userDetail.getStatus() == null) { logger.error("账号状态异常,status 不能为空"); throw new DisabledAccountException(MessageUtils.getMessage(ErrorCode.ACCOUNT_DISABLE)); diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/oauth2/TokenGenerator.java b/main/manager-api/src/main/java/xiaozhi/modules/security/oauth2/TokenGenerator.java index 0ca1cede..6d7be47a 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/oauth2/TokenGenerator.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/oauth2/TokenGenerator.java @@ -1,10 +1,10 @@ package xiaozhi.modules.security.oauth2; -import xiaozhi.common.exception.RenException; - import java.security.MessageDigest; import java.util.UUID; +import xiaozhi.common.exception.RenException; + /** * 生成token * Copyright (c) 人人开源 All rights reserved. diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/password/BCrypt.java b/main/manager-api/src/main/java/xiaozhi/modules/security/password/BCrypt.java index 6a9efff9..39d350c5 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/password/BCrypt.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/password/BCrypt.java @@ -5,22 +5,28 @@ import java.io.UnsupportedEncodingException; import java.security.SecureRandom; /** - * BCrypt implements OpenBSD-style Blowfish password hashing using the scheme described in + * BCrypt implements OpenBSD-style Blowfish password hashing using the scheme + * described in * "A Future-Adaptable Password Scheme" by Niels Provos and David Mazieres. *

- * This password hashing system tries to thwart off-line password cracking using a - * computationally-intensive hashing algorithm, based on Bruce Schneier's Blowfish cipher. - * The work factor of the algorithm is parameterised, so it can be increased as computers + * This password hashing system tries to thwart off-line password cracking using + * a + * computationally-intensive hashing algorithm, based on Bruce Schneier's + * Blowfish cipher. + * The work factor of the algorithm is parameterised, so it can be increased as + * computers * get faster. *

- * Usage is really simple. To hash a password for the first time, call the hashpw method + * Usage is really simple. To hash a password for the first time, call the + * hashpw method * with a random salt, like this: *

* * String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt());
*
*

- * To check whether a plaintext password matches one that has been hashed previously, use + * To check whether a plaintext password matches one that has been hashed + * previously, use * the checkpw method: *

* @@ -30,7 +36,8 @@ import java.security.SecureRandom; *     System.out.println("It does not match");
*
*

- * The gensalt() method takes an optional parameter (log_rounds) that determines the + * The gensalt() method takes an optional parameter (log_rounds) that determines + * the * computational complexity of the hashing: *

* @@ -38,7 +45,8 @@ import java.security.SecureRandom; * String stronger_salt = BCrypt.gensalt(12)
*
*

- * The amount of work increases exponentially (2**log_rounds), so each increment is twice + * The amount of work increases exponentially (2**log_rounds), so each increment + * is twice * as much work. The default log_rounds is 10, and the valid range is 4 to 31. * * @author Damien Miller @@ -51,11 +59,11 @@ public class BCrypt { // Blowfish parameters private static final int BLOWFISH_NUM_ROUNDS = 16; // Initial contents of key schedule - private static final int P_orig[] = {0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, + private static final int P_orig[] = { 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, - 0x9216d5d9, 0x8979fb1b}; - private static final int S_orig[] = {0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, + 0x9216d5d9, 0x8979fb1b }; + private static final int S_orig[] = { 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, @@ -225,24 +233,24 @@ public class BCrypt { 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, - 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6}; + 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 }; // bcrypt IV: "OrpheanBeholderScryDoubt" - static private final int bf_crypt_ciphertext[] = {0x4f727068, 0x65616e42, - 0x65686f6c, 0x64657253, 0x63727944, 0x6f756274}; + static private final int bf_crypt_ciphertext[] = { 0x4f727068, 0x65616e42, + 0x65686f6c, 0x64657253, 0x63727944, 0x6f756274 }; // Table for Base64 encoding - static private final char base64_code[] = {'.', '/', 'A', 'B', 'C', 'D', 'E', 'F', + static private final char base64_code[] = { '.', '/', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', - 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; + 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; // Table for Base64 decoding - static private final byte index_64[] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + static private final byte index_64[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, -1, -1, -1, -1, -1, -1, -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1}; + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1 }; static final int MIN_LOG_ROUNDS = 4; static final int MAX_LOG_ROUNDS = 31; // Expanded Blowfish key @@ -250,7 +258,8 @@ public class BCrypt { private int S[]; /** - * Encode a byte array using bcrypt's slightly-modified base64 encoding scheme. Note + * Encode a byte array using bcrypt's slightly-modified base64 encoding scheme. + * Note * that this is not compatible with the standard MIME-base64 * encoding. * @@ -306,7 +315,8 @@ public class BCrypt { } /** - * Decode a string encoded using bcrypt's base64 scheme to a byte array. Note that + * Decode a string encoded using bcrypt's base64 scheme to a byte array. Note + * that * this is *not* compatible with the standard MIME-base64 encoding. * * @param s the string to decode @@ -365,7 +375,7 @@ public class BCrypt { int i, n, l = lr[off], r = lr[off + 1]; l ^= P[0]; - for (i = 0; i <= BLOWFISH_NUM_ROUNDS - 2; ) { + for (i = 0; i <= BLOWFISH_NUM_ROUNDS - 2;) { // Feistel substitution on left word n = S[(l >> 24) & 0xff]; n += S[0x100 | ((l >> 16) & 0xff)]; @@ -388,7 +398,8 @@ public class BCrypt { * Cycically extract a word of key material * * @param data the string to extract the data from - * @param offp a "pointer" (as a one-entry array) to the current offset into data + * @param offp a "pointer" (as a one-entry array) to the current offset into + * data * @return the next word of material from data */ private static int streamtoword(byte data[], int offp[]) { @@ -420,8 +431,8 @@ public class BCrypt { */ private void key(byte key[]) { int i; - int koffp[] = {0}; - int lr[] = {0, 0}; + int koffp[] = { 0 }; + int lr[] = { 0, 0 }; int plen = P.length, slen = S.length; for (i = 0; i < plen; i++) { @@ -443,15 +454,16 @@ public class BCrypt { /** * Perform the "enhanced key schedule" step described by Provos and Mazieres in - * "A Future-Adaptable Password Scheme" http://www.openbsd.org/papers/bcrypt-paper.ps + * "A Future-Adaptable Password Scheme" + * http://www.openbsd.org/papers/bcrypt-paper.ps * * @param data salt information * @param key password information */ private void ekskey(byte data[], byte key[]) { int i; - int koffp[] = {0}, doffp[] = {0}; - int lr[] = {0, 0}; + int koffp[] = { 0 }, doffp[] = { 0 }; + int lr[] = { 0, 0 }; int plen = P.length, slen = S.length; for (i = 0; i < plen; i++) { @@ -487,7 +499,8 @@ public class BCrypt { * * @param password the password to hash * @param salt the binary salt to hash with the password - * @param log_rounds the binary logarithm of the number of rounds of hashing to apply + * @param log_rounds the binary logarithm of the number of rounds of hashing to + * apply * @return an array containing the binary hashed password */ private byte[] crypt_raw(byte password[], byte salt[], int log_rounds) { @@ -524,7 +537,8 @@ public class BCrypt { * Hash a password using the OpenBSD bcrypt scheme * * @param password the password to hash - * @param salt the salt to hash with (perhaps generated using BCrypt.gensalt) + * @param salt the salt to hash with (perhaps generated using + * BCrypt.gensalt) * @return the hashed password * @throws IllegalArgumentException if invalid salt is passed */ @@ -599,8 +613,10 @@ public class BCrypt { /** * Generate a salt for use with the BCrypt.hashpw() method * - * @param log_rounds the log2 of the number of rounds of hashing to apply - the work - * factor therefore increases as 2**log_rounds. Minimum 4, maximum 31. + * @param log_rounds the log2 of the number of rounds of hashing to apply - the + * work + * factor therefore increases as 2**log_rounds. Minimum 4, + * maximum 31. * @param random an instance of SecureRandom to use * @return an encoded salt value */ @@ -626,8 +642,10 @@ public class BCrypt { /** * Generate a salt for use with the BCrypt.hashpw() method * - * @param log_rounds the log2 of the number of rounds of hashing to apply - the work - * factor therefore increases as 2**log_rounds. Minimum 4, maximum 31. + * @param log_rounds the log2 of the number of rounds of hashing to apply - the + * work + * factor therefore increases as 2**log_rounds. Minimum 4, + * maximum 31. * @return an encoded salt value */ public static String gensalt(int log_rounds) { @@ -635,7 +653,8 @@ public class BCrypt { } /** - * Generate a salt for use with the BCrypt.hashpw() method, selecting a reasonable + * Generate a salt for use with the BCrypt.hashpw() method, selecting a + * reasonable * default for the number of hashing rounds to apply * * @return an encoded salt value diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/password/BCryptPasswordEncoder.java b/main/manager-api/src/main/java/xiaozhi/modules/security/password/BCryptPasswordEncoder.java index 0d570a96..0da907f2 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/password/BCryptPasswordEncoder.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/password/BCryptPasswordEncoder.java @@ -1,15 +1,18 @@ package xiaozhi.modules.security.password; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - import java.security.SecureRandom; import java.util.regex.Pattern; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + /** - * Implementation of PasswordEncoder that uses the BCrypt strong hashing function. Clients - * can optionally supply a "strength" (a.k.a. log rounds in BCrypt) and a SecureRandom - * instance. The larger the strength parameter the more work will have to be done + * Implementation of PasswordEncoder that uses the BCrypt strong hashing + * function. Clients + * can optionally supply a "strength" (a.k.a. log rounds in BCrypt) and a + * SecureRandom + * instance. The larger the strength parameter the more work will have to be + * done * (exponentially) to hash the passwords. The default value is 10. * * @author Dave Syer diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/password/PasswordEncoder.java b/main/manager-api/src/main/java/xiaozhi/modules/security/password/PasswordEncoder.java index 40d1e95c..2de70cc2 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/password/PasswordEncoder.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/password/PasswordEncoder.java @@ -10,20 +10,23 @@ package xiaozhi.modules.security.password; public interface PasswordEncoder { /** - * Encode the raw password. Generally, a good encoding algorithm applies a SHA-1 or + * Encode the raw password. Generally, a good encoding algorithm applies a SHA-1 + * or * greater hash combined with an 8-byte or greater randomly generated salt. */ String encode(CharSequence rawPassword); /** * Verify the encoded password obtained from storage matches the submitted raw - * password after it too is encoded. Returns true if the passwords match, false if + * password after it too is encoded. Returns true if the passwords match, false + * if * they do not. The stored password itself is never decoded. * * @param rawPassword the raw password to encode and match * @param encodedPassword the encoded password from storage to compare with - * @return true if the raw password, after encoding, matches the encoded password from - * storage + * @return true if the raw password, after encoding, matches the encoded + * password from + * storage */ boolean matches(CharSequence rawPassword, String encodedPassword); diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/password/PasswordUtils.java b/main/manager-api/src/main/java/xiaozhi/modules/security/password/PasswordUtils.java index b0357010..9144b380 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/password/PasswordUtils.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/password/PasswordUtils.java @@ -18,19 +18,17 @@ public class PasswordUtils { return passwordEncoder.encode(str); } - /** * 比较密码是否相等 * * @param str 明文密码 * @param password 加密后密码 - * @return true:成功 false:失败 + * @return true:成功 false:失败 */ public static boolean matches(String str, String password) { return passwordEncoder.matches(str, password); } - public static void main(String[] args) { String str = "admin"; String password = encode(str); diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/service/CaptchaService.java b/main/manager-api/src/main/java/xiaozhi/modules/security/service/CaptchaService.java index b91d5d9a..9e5c153f 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/service/CaptchaService.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/service/CaptchaService.java @@ -1,9 +1,9 @@ package xiaozhi.modules.security.service; -import jakarta.servlet.http.HttpServletResponse; - import java.io.IOException; +import jakarta.servlet.http.HttpServletResponse; + /** * 验证码 * Copyright (c) 人人开源 All rights reserved. @@ -21,7 +21,7 @@ public interface CaptchaService { * * @param uuid uuid * @param code 验证码 - * @return true:成功 false:失败 + * @return true:成功 false:失败 */ boolean validate(String uuid, String code); } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/service/ShiroService.java b/main/manager-api/src/main/java/xiaozhi/modules/security/service/ShiroService.java index 980645d6..b9d18889 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/service/ShiroService.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/service/ShiroService.java @@ -1,22 +1,14 @@ package xiaozhi.modules.security.service; -import xiaozhi.common.user.UserDetail; import xiaozhi.modules.security.entity.SysUserTokenEntity; import xiaozhi.modules.sys.entity.SysUserEntity; -import java.util.List; -import java.util.Set; - /** * shiro相关接口 * Copyright (c) 人人开源 All rights reserved. * Website: https://www.renren.io */ public interface ShiroService { - /** - * 获取用户权限列表 - */ - Set getUserPermissions(UserDetail user); SysUserTokenEntity getByToken(String token); diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/CaptchaServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/CaptchaServiceImpl.java index fdc0d5b5..012b4d3e 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/CaptchaServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/CaptchaServiceImpl.java @@ -1,20 +1,22 @@ package xiaozhi.modules.security.service.impl; +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.wf.captcha.SpecCaptcha; import com.wf.captcha.base.Captcha; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import xiaozhi.common.redis.RedisKeys; import xiaozhi.common.redis.RedisUtils; import xiaozhi.modules.security.service.CaptchaService; -import jakarta.annotation.Resource; -import jakarta.servlet.http.HttpServletResponse; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import java.io.IOException; -import java.util.concurrent.TimeUnit; /** * 验证码 @@ -26,9 +28,10 @@ public class CaptchaServiceImpl implements CaptchaService { @Value("${renren.redis.open}") private boolean open; /** - * Local Cache 5分钟过期 + * Local Cache 5分钟过期 */ - Cache localCache = CacheBuilder.newBuilder().maximumSize(1000).expireAfterAccess(5, TimeUnit.MINUTES).build(); + Cache localCache = CacheBuilder.newBuilder().maximumSize(1000) + .expireAfterAccess(5, TimeUnit.MINUTES).build(); @Override public void create(HttpServletResponse response, String uuid) throws IOException { @@ -37,13 +40,13 @@ public class CaptchaServiceImpl implements CaptchaService { response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); - //生成验证码 + // 生成验证码 SpecCaptcha captcha = new SpecCaptcha(150, 40); captcha.setLen(5); captcha.setCharType(Captcha.TYPE_DEFAULT); captcha.out(response.getOutputStream()); - //保存到缓存 + // 保存到缓存 setCache(uuid, captcha.text()); } @@ -52,10 +55,10 @@ public class CaptchaServiceImpl implements CaptchaService { if (StringUtils.isBlank(code)) { return false; } - //获取验证码 + // 获取验证码 String captcha = getCache(uuid); - //效验成功 + // 效验成功 if (code.equalsIgnoreCase(captcha)) { return true; } @@ -76,7 +79,7 @@ public class CaptchaServiceImpl implements CaptchaService { if (open) { key = RedisKeys.getCaptchaKey(key); String captcha = (String) redisUtils.get(key); - //删除验证码 + // 删除验证码 if (captcha != null) { redisUtils.delete(key); } @@ -85,7 +88,7 @@ public class CaptchaServiceImpl implements CaptchaService { } String captcha = localCache.getIfPresent(key); - //删除验证码 + // 删除验证码 if (captcha != null) { localCache.invalidate(key); } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/ShiroServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/ShiroServiceImpl.java index 128d9b9d..27c20970 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/ShiroServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/ShiroServiceImpl.java @@ -1,17 +1,13 @@ package xiaozhi.modules.security.service.impl; -import xiaozhi.common.user.UserDetail; +import org.springframework.stereotype.Service; + +import lombok.AllArgsConstructor; import xiaozhi.modules.security.dao.SysUserTokenDao; import xiaozhi.modules.security.entity.SysUserTokenEntity; import xiaozhi.modules.security.service.ShiroService; import xiaozhi.modules.sys.dao.SysUserDao; import xiaozhi.modules.sys.entity.SysUserEntity; -import xiaozhi.modules.sys.enums.SuperAdminEnum; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.util.*; @AllArgsConstructor @Service @@ -19,23 +15,6 @@ public class ShiroServiceImpl implements ShiroService { private final SysUserDao sysUserDao; private final SysUserTokenDao sysUserTokenDao; - @Override - public Set getUserPermissions(UserDetail user) { - //系统管理员,拥有最高权限 - // TODO: 暂时写死,后续改成从数据库查询 - List permissionsList = new ArrayList<>(); - //用户权限列表 - Set permsSet = new HashSet<>(); - for (String permissions : permissionsList) { - if (StringUtils.isBlank(permissions)) { - continue; - } - permsSet.addAll(Arrays.asList(permissions.trim().split(","))); - } - - return permsSet; - } - @Override public SysUserTokenEntity getByToken(String token) { return sysUserTokenDao.getByToken(token); diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/SysUserTokenServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/SysUserTokenServiceImpl.java index 40ee7957..7f0d311a 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/SysUserTokenServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/SysUserTokenServiceImpl.java @@ -1,8 +1,11 @@ package xiaozhi.modules.security.service.impl; +import java.util.Date; + +import org.springframework.stereotype.Service; + import cn.hutool.core.date.DateUtil; import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; import xiaozhi.common.exception.ErrorCode; import xiaozhi.common.exception.RenException; import xiaozhi.common.page.TokenDTO; @@ -17,11 +20,10 @@ import xiaozhi.modules.sys.dto.PasswordDTO; import xiaozhi.modules.sys.dto.SysUserDTO; import xiaozhi.modules.sys.service.SysUserService; -import java.util.Date; - @AllArgsConstructor @Service -public class SysUserTokenServiceImpl extends BaseServiceImpl implements SysUserTokenService { +public class SysUserTokenServiceImpl extends BaseServiceImpl + implements SysUserTokenService { private final SysUserService sysUserService; /** @@ -31,18 +33,18 @@ public class SysUserTokenServiceImpl extends BaseServiceImpl createToken(Long userId) { - //用户token + // 用户token String token; - //当前时间 + // 当前时间 Date now = new Date(); - //过期时间 + // 过期时间 Date expireTime = new Date(now.getTime() + EXPIRE * 1000); - //判断是否生成过token + // 判断是否生成过token SysUserTokenEntity tokenEntity = baseDao.getByUserId(userId); if (tokenEntity == null) { - //生成一个token + // 生成一个token token = TokenGenerator.generateValue(); tokenEntity = new SysUserTokenEntity(); @@ -51,12 +53,12 @@ public class SysUserTokenServiceImpl extends BaseServiceImpl().ok(tokenDTO); } @Override diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/user/SecurityUser.java b/main/manager-api/src/main/java/xiaozhi/modules/security/user/SecurityUser.java index cfa0fbf7..0581f95c 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/security/user/SecurityUser.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/security/user/SecurityUser.java @@ -1,9 +1,10 @@ package xiaozhi.modules.security.user; -import xiaozhi.common.user.UserDetail; import org.apache.shiro.SecurityUtils; import org.apache.shiro.subject.Subject; +import xiaozhi.common.user.UserDetail; + /** * Shiro工具类 * Copyright (c) 人人开源 All rights reserved. diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/SysUserController.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/SysUserController.java deleted file mode 100644 index 9da7c62b..00000000 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/SysUserController.java +++ /dev/null @@ -1,17 +0,0 @@ -package xiaozhi.modules.sys.controller; - -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.AllArgsConstructor; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * 用户管理 - */ -@AllArgsConstructor -@RestController -@RequestMapping("/sys/user") -@Tag(name = "用户管理") -public class SysUserController { - -} \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysDictDataDao.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysDictDataDao.java index 08aaca5b..9dd124fe 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysDictDataDao.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysDictDataDao.java @@ -1,12 +1,13 @@ package xiaozhi.modules.sys.dao; +import java.util.List; + +import org.apache.ibatis.annotations.Mapper; + import xiaozhi.common.dao.BaseDao; import xiaozhi.modules.sys.dto.SysDictDataDTO; import xiaozhi.modules.sys.entity.DictData; import xiaozhi.modules.sys.entity.SysDictDataEntity; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; /** * 字典数据 diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysDictTypeDao.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysDictTypeDao.java index bca8e789..5a9d5a27 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysDictTypeDao.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysDictTypeDao.java @@ -1,11 +1,12 @@ package xiaozhi.modules.sys.dao; +import java.util.List; + +import org.apache.ibatis.annotations.Mapper; + import xiaozhi.common.dao.BaseDao; import xiaozhi.modules.sys.entity.DictType; import xiaozhi.modules.sys.entity.SysDictTypeEntity; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; /** * 字典类型 diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysParamsDao.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysParamsDao.java index 0c967a74..d35d1445 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysParamsDao.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysParamsDao.java @@ -1,11 +1,12 @@ package xiaozhi.modules.sys.dao; -import xiaozhi.common.dao.BaseDao; -import xiaozhi.modules.sys.entity.SysParamsEntity; +import java.util.List; + import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; -import java.util.List; +import xiaozhi.common.dao.BaseDao; +import xiaozhi.modules.sys.entity.SysParamsEntity; /** * 参数管理 diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysUserDao.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysUserDao.java index 339e522a..fb2a2492 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysUserDao.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysUserDao.java @@ -1,6 +1,7 @@ package xiaozhi.modules.sys.dao; import org.apache.ibatis.annotations.Mapper; + import xiaozhi.common.dao.BaseDao; import xiaozhi.modules.sys.entity.SysUserEntity; diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/AdminPageUserDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/AdminPageUserDTO.java new file mode 100644 index 00000000..7de3843a --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/AdminPageUserDTO.java @@ -0,0 +1,24 @@ +package xiaozhi.modules.sys.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 管理员分页用户的参数DTO + * + * @author zjy + * @since 2025-3-21 + */ +@Data +@Schema(description = "音色分页参数") +public class AdminPageUserDTO { + + @Schema(description = "手机号码") + private String mobile; + + @Schema(description = "页数") + private String page; + + @Schema(description = "显示列数") + private String limit; +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/PasswordDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/PasswordDTO.java index 1ecadc68..4aabb10e 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/PasswordDTO.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/PasswordDTO.java @@ -1,11 +1,11 @@ package xiaozhi.modules.sys.dto; +import java.io.Serializable; + import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import lombok.Data; -import java.io.Serializable; - /** * 修改密码 */ diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysDictDataDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysDictDataDTO.java index 172e6b1f..c18dbf8f 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysDictDataDTO.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysDictDataDTO.java @@ -1,20 +1,21 @@ package xiaozhi.modules.sys.dto; +import java.io.Serializable; +import java.util.Date; + import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; -import xiaozhi.common.utils.DateUtils; -import xiaozhi.common.validator.group.AddGroup; -import xiaozhi.common.validator.group.DefaultGroup; -import xiaozhi.common.validator.group.UpdateGroup; + import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Null; import lombok.Data; - -import java.io.Serializable; -import java.util.Date; +import xiaozhi.common.utils.DateUtils; +import xiaozhi.common.validator.group.AddGroup; +import xiaozhi.common.validator.group.DefaultGroup; +import xiaozhi.common.validator.group.UpdateGroup; /** * 字典数据 @@ -23,7 +24,6 @@ import java.util.Date; @Schema(description = "字典数据") public class SysDictDataDTO implements Serializable { - @Schema(description = "id") @Null(message = "{id.null}", groups = AddGroup.class) @NotNull(message = "{id.require}", groups = UpdateGroup.class) diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysDictTypeDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysDictTypeDTO.java index 72648109..01d69795 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysDictTypeDTO.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysDictTypeDTO.java @@ -1,20 +1,21 @@ package xiaozhi.modules.sys.dto; +import java.io.Serializable; +import java.util.Date; + import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; -import xiaozhi.common.utils.DateUtils; -import xiaozhi.common.validator.group.AddGroup; -import xiaozhi.common.validator.group.DefaultGroup; -import xiaozhi.common.validator.group.UpdateGroup; + import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Null; import lombok.Data; - -import java.io.Serializable; -import java.util.Date; +import xiaozhi.common.utils.DateUtils; +import xiaozhi.common.validator.group.AddGroup; +import xiaozhi.common.validator.group.DefaultGroup; +import xiaozhi.common.validator.group.UpdateGroup; /** * 字典类型 @@ -23,7 +24,6 @@ import java.util.Date; @Schema(description = "字典类型") public class SysDictTypeDTO implements Serializable { - @Schema(description = "id") @Null(message = "{id.null}", groups = AddGroup.class) @NotNull(message = "{id.require}", groups = UpdateGroup.class) diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysParamsDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysParamsDTO.java index 4b72ce34..7b4dd28d 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysParamsDTO.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysParamsDTO.java @@ -1,19 +1,20 @@ package xiaozhi.modules.sys.dto; +import java.io.Serializable; +import java.util.Date; + import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; -import xiaozhi.common.utils.DateUtils; -import xiaozhi.common.validator.group.AddGroup; -import xiaozhi.common.validator.group.DefaultGroup; -import xiaozhi.common.validator.group.UpdateGroup; + import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Null; import lombok.Data; - -import java.io.Serializable; -import java.util.Date; +import xiaozhi.common.utils.DateUtils; +import xiaozhi.common.validator.group.AddGroup; +import xiaozhi.common.validator.group.DefaultGroup; +import xiaozhi.common.validator.group.UpdateGroup; /** * 参数管理 @@ -22,7 +23,6 @@ import java.util.Date; @Schema(description = "参数管理") public class SysParamsDTO implements Serializable { - @Schema(description = "id") @Null(message = "{id.null}", groups = AddGroup.class) @NotNull(message = "{id.require}", groups = UpdateGroup.class) diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysUserDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysUserDTO.java index 00f7fc78..ff066341 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysUserDTO.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysUserDTO.java @@ -1,22 +1,24 @@ package xiaozhi.modules.sys.dto; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +import org.hibernate.validator.constraints.Range; + import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; -import xiaozhi.common.utils.DateUtils; -import xiaozhi.common.validator.group.AddGroup; -import xiaozhi.common.validator.group.DefaultGroup; -import xiaozhi.common.validator.group.UpdateGroup; + import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Null; import lombok.Data; -import org.hibernate.validator.constraints.Range; - -import java.io.Serializable; -import java.util.Date; -import java.util.List; +import xiaozhi.common.utils.DateUtils; +import xiaozhi.common.validator.group.AddGroup; +import xiaozhi.common.validator.group.DefaultGroup; +import xiaozhi.common.validator.group.UpdateGroup; /** * 用户管理 diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/DictData.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/DictData.java index 1e16a192..c8deac81 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/DictData.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/DictData.java @@ -1,6 +1,7 @@ package xiaozhi.modules.sys.entity; import com.fasterxml.jackson.annotation.JsonIgnore; + import lombok.Data; /** diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/DictType.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/DictType.java index 3cf94606..4a1e2ca5 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/DictType.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/DictType.java @@ -1,11 +1,12 @@ package xiaozhi.modules.sys.entity; -import com.fasterxml.jackson.annotation.JsonIgnore; -import lombok.Data; - import java.util.ArrayList; import java.util.List; +import com.fasterxml.jackson.annotation.JsonIgnore; + +import lombok.Data; + /** * 字典类型 */ diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysDictDataEntity.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysDictDataEntity.java index 4bfa4b62..16d3dcae 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysDictDataEntity.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysDictDataEntity.java @@ -1,13 +1,14 @@ package xiaozhi.modules.sys.entity; +import java.util.Date; + import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; -import xiaozhi.common.entity.BaseEntity; + import lombok.Data; import lombok.EqualsAndHashCode; - -import java.util.Date; +import xiaozhi.common.entity.BaseEntity; /** * 数据字典 diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysDictTypeEntity.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysDictTypeEntity.java index ea752c63..fa372055 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysDictTypeEntity.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysDictTypeEntity.java @@ -1,13 +1,14 @@ package xiaozhi.modules.sys.entity; +import java.util.Date; + import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; -import xiaozhi.common.entity.BaseEntity; + import lombok.Data; import lombok.EqualsAndHashCode; - -import java.util.Date; +import xiaozhi.common.entity.BaseEntity; /** * 字典类型 diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysParamsEntity.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysParamsEntity.java index 054e51d7..989800e2 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysParamsEntity.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysParamsEntity.java @@ -1,13 +1,14 @@ package xiaozhi.modules.sys.entity; +import java.util.Date; + import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; -import xiaozhi.common.entity.BaseEntity; + import lombok.Data; import lombok.EqualsAndHashCode; - -import java.util.Date; +import xiaozhi.common.entity.BaseEntity; /** * 参数管理 @@ -25,7 +26,7 @@ public class SysParamsEntity extends BaseEntity { */ private String paramValue; /** - * 类型 0:系统参数 1:非系统参数 + * 类型 0:系统参数 1:非系统参数 */ private Integer paramType; /** diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysUserEntity.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysUserEntity.java index 0093fcf0..23043a37 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysUserEntity.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysUserEntity.java @@ -1,14 +1,15 @@ package xiaozhi.modules.sys.entity; +import java.util.Date; + import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; + import lombok.Data; import lombok.EqualsAndHashCode; import xiaozhi.common.entity.BaseEntity; -import java.util.Date; - /** * 系统用户 */ @@ -25,11 +26,11 @@ public class SysUserEntity extends BaseEntity { */ private String password; /** - * 超级管理员 0:否 1:是 + * 超级管理员 0:否 1:是 */ private Integer superAdmin; /** - * 状态 0:停用 1:正常 + * 状态 0:停用 1:正常 */ private Integer status; /** diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/redis/SysParamsRedis.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/redis/SysParamsRedis.java index dcc14f69..2e2bdb42 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/redis/SysParamsRedis.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/redis/SysParamsRedis.java @@ -1,9 +1,10 @@ package xiaozhi.modules.sys.redis; +import org.springframework.stereotype.Component; + +import lombok.AllArgsConstructor; import xiaozhi.common.redis.RedisKeys; import xiaozhi.common.redis.RedisUtils; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; /** * 参数管理 diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysDictDataService.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysDictDataService.java index 77be8b3a..a33df029 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysDictDataService.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysDictDataService.java @@ -1,12 +1,12 @@ package xiaozhi.modules.sys.service; +import java.util.Map; + import xiaozhi.common.page.PageData; import xiaozhi.common.service.BaseService; import xiaozhi.modules.sys.dto.SysDictDataDTO; import xiaozhi.modules.sys.entity.SysDictDataEntity; -import java.util.Map; - /** * 数据字典 */ diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysDictTypeService.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysDictTypeService.java index 8924f6ca..a18e086f 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysDictTypeService.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysDictTypeService.java @@ -1,14 +1,14 @@ package xiaozhi.modules.sys.service; +import java.util.List; +import java.util.Map; + import xiaozhi.common.page.PageData; import xiaozhi.common.service.BaseService; import xiaozhi.modules.sys.dto.SysDictTypeDTO; import xiaozhi.modules.sys.entity.DictType; import xiaozhi.modules.sys.entity.SysDictTypeEntity; -import java.util.List; -import java.util.Map; - /** * 数据字典 */ diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysParamsService.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysParamsService.java index d13e41ba..7475f346 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysParamsService.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysParamsService.java @@ -1,14 +1,13 @@ package xiaozhi.modules.sys.service; +import java.util.List; +import java.util.Map; import xiaozhi.common.page.PageData; import xiaozhi.common.service.BaseService; import xiaozhi.modules.sys.dto.SysParamsDTO; import xiaozhi.modules.sys.entity.SysParamsEntity; -import java.util.List; -import java.util.Map; - /** * 参数管理 */ diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserService.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserService.java index 08179409..261fbf96 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserService.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserService.java @@ -1,10 +1,12 @@ package xiaozhi.modules.sys.service; +import xiaozhi.common.page.PageData; import xiaozhi.common.service.BaseService; +import xiaozhi.modules.sys.dto.AdminPageUserDTO; import xiaozhi.modules.sys.dto.PasswordDTO; import xiaozhi.modules.sys.dto.SysUserDTO; import xiaozhi.modules.sys.entity.SysUserEntity; - +import xiaozhi.modules.sys.vo.AdminPageUserVO; /** * 系统用户 @@ -19,5 +21,35 @@ public interface SysUserService extends BaseService { void delete(Long[] ids); + /** + * 验证是否允许修改密码更改 + * + * @param userId 用户id + * @param passwordDTO 验证密码的参数 + */ void changePassword(Long userId, PasswordDTO passwordDTO); + + /** + * 直接修改密码,不需要验证 + * + * @param userId 用户id + * @param password 密码 + */ + void changePasswordDirectly(Long userId, String password); + + /** + * 重置密码 + * + * @param userId 用户id + * @return 随机生成符合规范的密码 + */ + String resetPassword(Long userId); + + /** + * 管理员分页用户信息 + * + * @param dto 分页查找参数 + * @return 用户列表分页数据 + */ + PageData page(AdminPageUserDTO dto); } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysDictDataServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysDictDataServiceImpl.java index a8420dc9..20530e6b 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysDictDataServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysDictDataServiceImpl.java @@ -1,10 +1,15 @@ package xiaozhi.modules.sys.service.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; +import java.util.Arrays; +import java.util.Map; + import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; + import xiaozhi.common.page.PageData; import xiaozhi.common.service.impl.BaseServiceImpl; import xiaozhi.common.utils.ConvertUtils; @@ -13,21 +18,18 @@ import xiaozhi.modules.sys.dto.SysDictDataDTO; import xiaozhi.modules.sys.entity.SysDictDataEntity; import xiaozhi.modules.sys.service.SysDictDataService; -import java.util.Arrays; -import java.util.Map; - /** * 字典类型 */ @Service -public class SysDictDataServiceImpl extends BaseServiceImpl implements SysDictDataService { +public class SysDictDataServiceImpl extends BaseServiceImpl + implements SysDictDataService { @Override public PageData page(Map params) { IPage page = baseDao.selectPage( getPage(params, "sort", true), - getWrapper(params) - ); + getWrapper(params)); return getPageData(page, SysDictDataDTO.class); } @@ -71,7 +73,7 @@ public class SysDictDataServiceImpl extends BaseServiceImpl implements SysDictTypeService { +public class SysDictTypeServiceImpl extends BaseServiceImpl + implements SysDictTypeService { private final SysDictDataDao sysDictDataDao; @Override public PageData page(Map params) { IPage page = baseDao.selectPage( getPage(params, "sort", true), - getWrapper(params) - ); + getWrapper(params)); return getPageData(page, SysDictTypeDTO.class); } @@ -76,7 +78,7 @@ public class SysDictTypeServiceImpl extends BaseServiceImpl page(Map params) { IPage page = baseDao.selectPage( getPage(params, Constant.CREATE_DATE, false), - getWrapper(params) - ); + getWrapper(params)); return getPageData(page, SysParamsDTO.class); } @@ -86,12 +87,12 @@ public class SysParamsServiceImpl extends BaseServiceImpl paramCodeList = baseDao.getParamCodeList(ids); String[] paramCodes = paramCodeList.toArray(new String[paramCodeList.size()]); sysParamsRedis.delete(paramCodes); - //删除 + // 删除 deleteBatchIds(Arrays.asList(ids)); } @@ -114,7 +115,7 @@ public class SysParamsServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); return baseDao.selectCount(queryWrapper); } + @Override + public PageData page(AdminPageUserDTO dto) { + Map params = new HashMap(); + params.put(Constant.PAGE, dto.getPage()); + params.put(Constant.LIMIT, dto.getLimit()); + IPage page = baseDao.selectPage( + getPage(params, "id", true), + // 定义查询条件 + new QueryWrapper() + // 必须按照手机号码查找 + .eq(StringUtils.isNotBlank(dto.getMobile()), "username", dto.getMobile())); + List list = page.getRecords().stream().map(user -> { + AdminPageUserVO adminPageUserVO = new AdminPageUserVO(); + adminPageUserVO.setUserid(user.getId().toString()); + adminPageUserVO.setMobile(user.getUsername()); + adminPageUserVO.setStatus(user.getStatus()); + // TODO 2. 等设备功能写好,获取对应数据 + adminPageUserVO.setDeviceCount("0"); + return adminPageUserVO; + }).toList(); + return new PageData<>(list, page.getTotal()); + } private boolean isStrongPassword(String password) { // 弱密码的正则表达式 @@ -120,4 +171,21 @@ public class SysUserServiceImpl extends BaseServiceImpl> page( + @Parameter(hidden = true) @RequestParam Map params) { + TimbrePageDTO dto = new TimbrePageDTO(); + dto.setTtsModelId((String) params.get("ttsModelId")); + dto.setName((String) params.get("name")); + dto.setLimit((String) params.get(Constant.LIMIT)); + dto.setPage((String) params.get(Constant.PAGE)); + + ValidatorUtils.validateEntity(dto); + PageData page = timbreService.page(dto); + return new Result>().ok(page); + } + + @PostMapping + @Operation(summary = "音色保存") + @RequiresPermissions("sys:role:superAdmin") + public Result save(@RequestBody TimbreDataDTO dto) { + ValidatorUtils.validateEntity(dto); + timbreService.save(dto); + return new Result<>(); + } + + @PutMapping("/{id}") + @Operation(summary = "音色修改") + @RequiresPermissions("sys:role:superAdmin") + public Result update( + @PathVariable String id, + @RequestBody TimbreDataDTO dto) { + ValidatorUtils.validateEntity(dto); + timbreService.update(id, dto); + return new Result<>(); + } + + @DeleteMapping("/{id}") + @Operation(summary = "音色删除") + @RequiresPermissions("sys:role:superAdmin") + public Result delete(@PathVariable String id) { + timbreService.delete(new String[] { id }); + return new Result<>(); + } + +} \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/timbre/dao/TimbreDao.java b/main/manager-api/src/main/java/xiaozhi/modules/timbre/dao/TimbreDao.java new file mode 100644 index 00000000..3656b4ea --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/timbre/dao/TimbreDao.java @@ -0,0 +1,17 @@ +package xiaozhi.modules.timbre.dao; + +import org.apache.ibatis.annotations.Mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import xiaozhi.modules.timbre.entity.TimbreEntity; + +/** + * 音色持久层定义 + * + * @author zjy + * @since 2025-3-21 + */ +@Mapper +public interface TimbreDao extends BaseMapper { +} \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/timbre/dto/TimbreDataDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/timbre/dto/TimbreDataDTO.java new file mode 100644 index 00000000..ed737db9 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/timbre/dto/TimbreDataDTO.java @@ -0,0 +1,45 @@ +package xiaozhi.modules.timbre.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +/** + * 音色表数据DTO + * + * @author zjy + * @since 2025-3-21 + */ +@Data +@Schema(description = "音色表信息") +public class TimbreDataDTO { + + @Schema(description = "语言") + @NotBlank(message = "{timbre.languages.require}") + private String languages; + + @Schema(description = "音色名称") + @NotBlank(message = "{timbre.name.require}") + private String name; + + @Schema(description = "备注") + @NotBlank(message = "{timbre.remark.require}") + private String remark; + + @Schema(description = "排序") + @Min(value = 0, message = "{sort.number}") + private long sort; + + @Schema(description = "对应 TTS 模型主键") + @NotBlank(message = "{timbre.ttsModelId.require}") + private String ttsModelId; + + @Schema(description = "音色编码") + @NotBlank(message = "{timbre.ttsVoice.require}") + private String ttsVoice; + + @Schema(description = "音频播放地址") + @NotBlank(message = "{timbre.voiceDemo.require}") + private String voiceDemo; +} \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/timbre/dto/TimbrePageDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/timbre/dto/TimbrePageDTO.java new file mode 100644 index 00000000..9c2aaf24 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/timbre/dto/TimbrePageDTO.java @@ -0,0 +1,29 @@ +package xiaozhi.modules.timbre.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +/** + * 音色分页参数DTO + * + * @author zjy + * @since 2025-3-21 + */ +@Data +@Schema(description = "音色分页参数") +public class TimbrePageDTO { + + @Schema(description = "对应 TTS 模型主键") + @NotBlank(message = "{timbre.ttsModelId.require}") + private String ttsModelId; + + @Schema(description = "音色名称") + private String name; + + @Schema(description = "页数") + private String page; + + @Schema(description = "显示列数") + private String limit; +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/timbre/entity/TimbreEntity.java b/main/manager-api/src/main/java/xiaozhi/modules/timbre/entity/TimbreEntity.java new file mode 100644 index 00000000..3d6e5ba1 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/timbre/entity/TimbreEntity.java @@ -0,0 +1,65 @@ +package xiaozhi.modules.timbre.entity; + +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 音色表实体类 + * + * @author zjy + * @since 2025-3-21 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("ai_tts_voice") +@Schema(description = "音色信息") +public class TimbreEntity { + + @Schema(description = "id") + private String id; + + @Schema(description = "语言") + private String languages; + + @Schema(description = "音色名称") + private String name; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "排序") + private long sort; + + @Schema(description = "对应 TTS 模型主键") + private String ttsModelId; + + @Schema(description = "音色编码") + private String ttsVoice; + + @Schema(description = "音频播放地址") + private String voiceDemo; + + @Schema(description = "更新者") + @TableField(fill = FieldFill.UPDATE) + private Long updater; + + @Schema(description = "更新时间") + @TableField(fill = FieldFill.UPDATE) + private Date updateDate; + + @Schema(description = "创建者") + @TableField(fill = FieldFill.INSERT) + private Long creator; + + @Schema(description = "创建时间") + @TableField(fill = FieldFill.INSERT) + private Date createDate; + +} \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/timbre/service/TimbreService.java b/main/manager-api/src/main/java/xiaozhi/modules/timbre/service/TimbreService.java new file mode 100644 index 00000000..4519e17a --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/timbre/service/TimbreService.java @@ -0,0 +1,58 @@ +package xiaozhi.modules.timbre.service; + +import java.util.List; + +import xiaozhi.common.page.PageData; +import xiaozhi.common.service.BaseService; +import xiaozhi.modules.timbre.dto.TimbreDataDTO; +import xiaozhi.modules.timbre.dto.TimbrePageDTO; +import xiaozhi.modules.timbre.entity.TimbreEntity; +import xiaozhi.modules.timbre.vo.TimbreDetailsVO; + +/** + * 音色的业务层的定义 + * + * @author zjy + * @since 2025-3-21 + */ +public interface TimbreService extends BaseService { + /** + * 分页获取音色指定tts的下的音色 + * + * @param dto 分页查找参数 + * @return 音色列表分页数据 + */ + PageData page(TimbrePageDTO dto); + + /** + * 获取音色指定id的详情信息 + * + * @param timbreId 音色表id + * @return 音色信息 + */ + TimbreDetailsVO get(Long timbreId); + + /** + * 保存音色信息 + * + * @param dto 需要保存数据 + */ + void save(TimbreDataDTO dto); + + /** + * 保存音色信息 + * + * @param timbreId 需要修改的id + * @param dto 需要修改的数据 + */ + void update(String timbreId, TimbreDataDTO dto); + + /** + * 批量删除音色 + * + * @param ids 需要被删除的音色id列表 + */ + void delete(String[] ids); + + List getVoiceNames(String ttsModelId, String voiceName); +} \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/timbre/service/impl/TimbreServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/timbre/service/impl/TimbreServiceImpl.java new file mode 100644 index 00000000..9496b6d5 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/timbre/service/impl/TimbreServiceImpl.java @@ -0,0 +1,107 @@ +package xiaozhi.modules.timbre.service.impl; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; + +import cn.hutool.core.collection.CollectionUtil; +import lombok.AllArgsConstructor; +import xiaozhi.common.constant.Constant; +import xiaozhi.common.page.PageData; +import xiaozhi.common.service.impl.BaseServiceImpl; +import xiaozhi.common.utils.ConvertUtils; +import xiaozhi.modules.timbre.dao.TimbreDao; +import xiaozhi.modules.timbre.dto.TimbreDataDTO; +import xiaozhi.modules.timbre.dto.TimbrePageDTO; +import xiaozhi.modules.timbre.entity.TimbreEntity; +import xiaozhi.modules.timbre.service.TimbreService; +import xiaozhi.modules.timbre.vo.TimbreDetailsVO; + +/** + * 音色的业务层的实现 + * + * @author zjy + * @since 2025-3-21 + */ +@AllArgsConstructor +@Service +public class TimbreServiceImpl extends BaseServiceImpl implements TimbreService { + + private final TimbreDao timbreDao; + + @Override + public PageData page(TimbrePageDTO dto) { + Map params = new HashMap(); + params.put(Constant.PAGE, dto.getPage()); + params.put(Constant.LIMIT, dto.getLimit()); + IPage page = baseDao.selectPage( + getPage(params, "sort", true), + // 定义查询条件 + new QueryWrapper() + // 必须按照ttsID查找 + .eq("tts_model_id", dto.getTtsModelId()) + // 如果有音色名字,按照音色名模糊查找 + .like(StringUtils.isNotBlank(dto.getName()), "name", dto.getName())); + + return getPageData(page, TimbreDetailsVO.class); + } + + @Override + public TimbreDetailsVO get(Long timbreId) { + TimbreEntity entity = baseDao.selectById(timbreId); + return ConvertUtils.sourceToTarget(entity, TimbreDetailsVO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(TimbreDataDTO dto) { + isTtsModelId(dto.getTtsModelId()); + TimbreEntity timbreEntity = ConvertUtils.sourceToTarget(dto, TimbreEntity.class); + baseDao.insert(timbreEntity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(String timbreId, TimbreDataDTO dto) { + isTtsModelId(dto.getTtsModelId()); + TimbreEntity timbreEntity = ConvertUtils.sourceToTarget(dto, TimbreEntity.class); + timbreEntity.setId(timbreId); + baseDao.updateById(timbreEntity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(String[] ids) { + baseDao.deleteBatchIds(Arrays.asList(ids)); + } + + @Override + public List getVoiceNames(String ttsModelId, String voiceName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("tts_model_id", StringUtils.isBlank(ttsModelId) ? "" : ttsModelId); + if (StringUtils.isNotBlank(voiceName)) { + queryWrapper.like("name", voiceName); + } + List timbreEntities = timbreDao.selectList(queryWrapper); + if (CollectionUtil.isEmpty(timbreEntities)) { + return null; + } + + return timbreEntities.stream().map(TimbreEntity::getName).toList(); + } + + /** + * 处理是不是tts模型的id + */ + private void isTtsModelId(String ttsModelId) { + // 等模型配置那边写好调用方法判断 + } +} \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/timbre/vo/TimbreDetailsVO.java b/main/manager-api/src/main/java/xiaozhi/modules/timbre/vo/TimbreDetailsVO.java new file mode 100644 index 00000000..68cc7bbb --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/timbre/vo/TimbreDetailsVO.java @@ -0,0 +1,40 @@ +package xiaozhi.modules.timbre.vo; + +import java.io.Serializable; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 音色详情展示VO + * + * @author zjy + * @since 2025-3-21 + */ +@Data +public class TimbreDetailsVO implements Serializable { + @Schema(description = "音色id") + private Long id; + + @Schema(description = "语言") + private String languages; + + @Schema(description = "音色名称") + private String name; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "排序") + private long sort; + + @Schema(description = "对应 TTS 模型主键") + private String ttsModelId; + + @Schema(description = "音色编码") + private String ttsVoice; + + @Schema(description = "音频播放地址") + private String voiceDemo; + +} diff --git a/main/manager-api/src/main/resources/application-dev.yml b/main/manager-api/src/main/resources/application-dev.yml index a8fdf21f..e1671b50 100644 --- a/main/manager-api/src/main/resources/application-dev.yml +++ b/main/manager-api/src/main/resources/application-dev.yml @@ -7,15 +7,12 @@ knife4j: password: 2ZABCDEUgF setting: enableFooter: false -jasypt: - encryptor: - password: P9Hx718z8L spring: datasource: druid: #MySQL driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://localhost:3306/xiaozhi_esp32_server?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true + url: jdbc:mysql://127.0.0.1:3306/xiaozhi_esp32_server?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true username: root password: 123456 initial-size: 10 @@ -41,4 +38,17 @@ spring: merge-sql: false wall: config: - multi-statement-allow: true \ No newline at end of file + multi-statement-allow: true + data: + redis: + host: 127.0.0.1 # Redis服务器地址 + port: 6379 # Redis服务器连接端口 + password: # Redis服务器连接密码(默认为空) + database: 0 # Redis数据库索引(默认为0) + timeout: 10000ms # 连接超时时间(毫秒) + lettuce: + pool: + max-active: 8 # 连接池最大连接数(使用负值表示没有限制) + max-idle: 8 # 连接池中的最大空闲连接 + min-idle: 0 # 连接池中的最小空闲连接 + shutdown-timeout: 100ms # 客户端优雅关闭的等待时间 \ No newline at end of file diff --git a/main/manager-api/src/main/resources/application.yml b/main/manager-api/src/main/resources/application.yml index 967f610e..902b5198 100644 --- a/main/manager-api/src/main/resources/application.yml +++ b/main/manager-api/src/main/resources/application.yml @@ -24,19 +24,6 @@ spring: max-file-size: 100MB max-request-size: 100MB enabled: true - data: - redis: - database: 0 - host: 127.0.0.1 - port: 6379 - password: # 密码(默认为空) - timeout: 6000ms # 连接超时时长(毫秒) - lettuce: - pool: - max-active: 1000 # 连接池最大连接数(使用负值表示没有限制) - max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制) - max-idle: 10 # 连接池中的最大空闲连接 - min-idle: 5 # 连接池中的最小空闲连接 main: allow-bean-definition-overriding: true @@ -51,7 +38,7 @@ knife4j: renren: redis: - open: false + open: true xss: enabled: true exclude-urls: @@ -76,4 +63,7 @@ mybatis-plus: configuration-properties: prefix: blobType: BLOB - boolValue: TRUE \ No newline at end of file + boolValue: TRUE + +app: + fronted-url: http://localhost:8001 \ No newline at end of file diff --git a/main/manager-api/src/main/resources/db/changelog/2025_model_config.sql b/main/manager-api/src/main/resources/db/changelog/2025_model_config.sql new file mode 100644 index 00000000..3964016e --- /dev/null +++ b/main/manager-api/src/main/resources/db/changelog/2025_model_config.sql @@ -0,0 +1,53 @@ +-- 本文件用于初始化模型配置数据,无需手动执行,在项目启动时会自动执行 +-- ------------------------------------------------------- +-- 初始化模型配置数据 +DELETE FROM `ai_model_config`; + +-- VAD模型配置 +INSERT INTO `ai_model_config` VALUES ('VAD_SileroVAD', 'VAD', 'SileroVAD', '语音活动检测', 1, 1, '{\"model_dir\": \"models/snakers4_silero-vad\", \"threshold\": 0.5, \"min_silence_duration_ms\": 700}', NULL, NULL, 0, NULL, NULL, NULL, NULL); + +-- ASR模型配置 +INSERT INTO `ai_model_config` VALUES ('ASR_FunASR', 'ASR', 'FunASR', 'FunASR语音识别', 1, 1, '{\"model_dir\": \"models/SenseVoiceSmall\", \"output_dir\": \"tmp/\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('ASR_SherpaASR', 'ASR', 'SherpaASR', 'Sherpa语音识别', 1, 0, '{\"model_dir\": \"models/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17\", \"output_dir\": \"tmp/\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('ASR_DoubaoASR', 'ASR', 'DoubaoASR', '豆包语音识别', 1, 0, '{\"appid\": \"\", \"access_token\": \"\", \"cluster\": \"volcengine_input_common\", \"output_dir\": \"tmp/\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); + +-- LLM模型配置 +INSERT INTO `ai_model_config` VALUES ('LLM_AliLLM', 'LLM', 'AliLLM', '通义千问', 1, 0, '{\"type\": \"openai\", \"base_url\": \"https://dashscope.aliyuncs.com/compatible-mode/v1\", \"model_name\": \"qwen-turbo\", \"api_key\": \"\", \"temperature\": 0.7, \"max_tokens\": 500, \"top_p\": 1, \"top_k\": 50, \"frequency_penalty\": 0}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('LLM_AliAppLLM', 'LLM', 'AliAppLLM', '通义百炼', 1, 0, '{\"type\": \"AliBL\", \"base_url\": \"https://dashscope.aliyuncs.com/compatible-mode/v1\", \"app_id\": \"\", \"api_key\": \"\", \"is_no_prompt\": true, \"ali_memory_id\": false}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('LLM_DoubaoLLM', 'LLM', 'DoubaoLLM', '豆包大模型', 1, 0, '{\"type\": \"openai\", \"base_url\": \"https://ark.cn-beijing.volces.com/api/v3\", \"model_name\": \"doubao-pro-32k-functioncall-241028\", \"api_key\": \"\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('LLM_DeepSeekLLM', 'LLM', 'DeepSeekLLM', 'DeepSeek', 1, 0, '{\"type\": \"openai\", \"model_name\": \"deepseek-chat\", \"url\": \"https://api.deepseek.com\", \"api_key\": \"\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('LLM_ChatGLMLLM', 'LLM', 'ChatGLMLLM', '智谱AI', 1, 1, '{\"type\": \"openai\", \"model_name\": \"glm-4-flash\", \"url\": \"https://open.bigmodel.cn/api/paas/v4/\", \"api_key\": \"\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('LLM_OllamaLLM', 'LLM', 'OllamaLLM', 'Ollama本地模型', 1, 0, '{\"type\": \"ollama\", \"model_name\": \"qwen2.5\", \"base_url\": \"http://localhost:11434\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('LLM_DifyLLM', 'LLM', 'DifyLLM', 'Dify', 1, 0, '{\"type\": \"dify\", \"base_url\": \"https://api.dify.ai/v1\", \"api_key\": \"\", \"mode\": \"chat-messages\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('LLM_GeminiLLM', 'LLM', 'GeminiLLM', '谷歌Gemini', 1, 0, '{\"type\": \"gemini\", \"api_key\": \"\", \"model_name\": \"gemini-2.0-flash\", \"http_proxy\": \"\", \"https_proxy\": \"\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('LLM_CozeLLM', 'LLM', 'CozeLLM', 'Coze', 1, 0, '{\"type\": \"coze\", \"bot_id\": \"\", \"user_id\": \"\", \"personal_access_token\": \"\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('LLM_LMStudioLLM', 'LLM', 'LMStudioLLM', 'LM Studio', 1, 0, '{\"type\": \"openai\", \"model_name\": \"deepseek-r1-distill-llama-8b@q4_k_m\", \"url\": \"http://localhost:1234/v1\", \"api_key\": \"lm-studio\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('LLM_FastgptLLM', 'LLM', 'FastgptLLM', 'FastGPT', 1, 0, '{\"type\": \"fastgpt\", \"base_url\": \"https://host/api/v1\", \"api_key\": \"fastgpt-xxx\", \"variables\": {\"k\": \"v\", \"k2\": \"v2\"}}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('LLM_XinferenceLLM', 'LLM', 'XinferenceLLM', 'Xinference大模型', 1, 0, '{\"type\": \"xinference\", \"model_name\": \"qwen2.5:72b-AWQ\", \"base_url\": \"http://localhost:9997\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('LLM_XinferenceSmallLLM', 'LLM', 'XinferenceSmallLLM', 'Xinference小模型', 1, 0, '{\"type\": \"xinference\", \"model_name\": \"qwen2.5:3b-AWQ\", \"base_url\": \"http://localhost:9997\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); + +-- TTS模型配置 +INSERT INTO `ai_model_config` VALUES ('TTS_EdgeTTS', 'TTS', 'EdgeTTS', 'Edge语音合成', 1, 1, '{\"type\": \"edge\", \"voice\": \"zh-CN-XiaoxiaoNeural\", \"output_dir\": \"tmp/\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('TTS_DoubaoTTS', 'TTS', 'DoubaoTTS', '豆包语音合成', 1, 0, '{\"type\": \"doubao\", \"api_url\": \"https://openspeech.bytedance.com/api/v1/tts\", \"voice\": \"BV001_streaming\", \"output_dir\": \"tmp/\", \"authorization\": \"Bearer;\", \"appid\": \"\", \"access_token\": \"\", \"cluster\": \"volcano_tts\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('TTS_CosyVoiceSiliconflow', 'TTS', 'CosyVoiceSiliconflow', '硅基流动语音合成', 1, 0, '{\"type\": \"siliconflow\", \"model\": \"FunAudioLLM/CosyVoice2-0.5B\", \"voice\": \"FunAudioLLM/CosyVoice2-0.5B:alex\", \"output_dir\": \"tmp/\", \"access_token\": \"\", \"response_format\": \"wav\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('TTS_CozeCnTTS', 'TTS', 'CozeCnTTS', 'Coze中文语音合成', 1, 0, '{\"type\": \"cozecn\", \"voice\": \"7426720361733046281\", \"output_dir\": \"tmp/\", \"access_token\": \"\", \"response_format\": \"wav\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('TTS_FishSpeech', 'TTS', 'FishSpeech', 'FishSpeech语音合成', 1, 0, '{\"type\": \"fishspeech\", \"output_dir\": \"tmp/\", \"response_format\": \"wav\", \"reference_id\": null, \"reference_audio\": [\"/tmp/test.wav\"], \"reference_text\": [\"你弄来这些吟词宴曲来看,还是这些混话来欺负我。\"], \"normalize\": true, \"max_new_tokens\": 1024, \"chunk_length\": 200, \"top_p\": 0.7, \"repetition_penalty\": 1.2, \"temperature\": 0.7, \"streaming\": false, \"use_memory_cache\": \"on\", \"seed\": null, \"channels\": 1, \"rate\": 44100, \"api_key\": \"\", \"api_url\": \"http://127.0.0.1:8080/v1/tts\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('TTS_GPT_SOVITS_V2', 'TTS', 'GPT_SOVITS_V2', 'GPT-SoVITS V2', 1, 0, '{\"type\": \"gpt_sovits_v2\", \"url\": \"http://127.0.0.1:9880/tts\", \"output_dir\": \"tmp/\", \"text_lang\": \"auto\", \"ref_audio_path\": \"caixukun.wav\", \"prompt_text\": \"\", \"prompt_lang\": \"zh\", \"top_k\": 5, \"top_p\": 1, \"temperature\": 1, \"text_split_method\": \"cut0\", \"batch_size\": 1, \"batch_threshold\": 0.75, \"split_bucket\": true, \"return_fragment\": false, \"speed_factor\": 1.0, \"streaming_mode\": false, \"seed\": -1, \"parallel_infer\": true, \"repetition_penalty\": 1.35, \"aux_ref_audio_paths\": []}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('TTS_GPT_SOVITS_V3', 'TTS', 'GPT_SOVITS_V3', 'GPT-SoVITS V3', 1, 0, '{\"type\": \"gpt_sovits_v3\", \"url\": \"http://127.0.0.1:9880\", \"output_dir\": \"tmp/\", \"text_language\": \"auto\", \"refer_wav_path\": \"caixukun.wav\", \"prompt_language\": \"zh\", \"prompt_text\": \"\", \"top_k\": 15, \"top_p\": 1.0, \"temperature\": 1.0, \"cut_punc\": \"\", \"speed\": 1.0, \"inp_refs\": [], \"sample_steps\": 32, \"if_sr\": false}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('TTS_MinimaxTTS', 'TTS', 'MinimaxTTS', 'MiniMax语音合成', 1, 0, '{\"type\": \"minimax\", \"output_dir\": \"tmp/\", \"group_id\": \"\", \"api_key\": \"\", \"model\": \"speech-01-turbo\", \"voice_id\": \"female-shaonv\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('TTS_AliyunTTS', 'TTS', 'AliyunTTS', '阿里云语音合成', 1, 0, '{\"type\": \"aliyun\", \"output_dir\": \"tmp/\", \"appkey\": \"\", \"token\": \"\", \"voice\": \"xiaoyun\", \"access_key_id\": \"\", \"access_key_secret\": \"\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('TTS_TTS302AI', 'TTS', 'TTS302AI', '302AI语音合成', 1, 0, '{\"type\": \"doubao\", \"api_url\": \"https://api.302ai.cn/doubao/tts_hd\", \"authorization\": \"Bearer \", \"voice\": \"zh_female_wanwanxiaohe_moon_bigtts\", \"output_dir\": \"tmp/\", \"access_token\": \"\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('TTS_GizwitsTTS', 'TTS', 'GizwitsTTS', '机智云语音合成', 1, 0, '{\"type\": \"doubao\", \"api_url\": \"https://bytedance.gizwitsapi.com/api/v1/tts\", \"authorization\": \"Bearer \", \"voice\": \"zh_female_wanwanxiaohe_moon_bigtts\", \"output_dir\": \"tmp/\", \"access_token\": \"\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('TTS_ACGNTTS', 'TTS', 'ACGNTTS', 'ACGN语音合成', 1, 0, '{\"type\": \"ttson\", \"token\": \"\", \"voice_id\": 1695, \"speed_factor\": 1, \"pitch_factor\": 0, \"volume_change_dB\": 0, \"to_lang\": \"ZH\", \"url\": \"https://u95167-bd74-2aef8085.westx.seetacloud.com:8443/flashsummary/tts?token=\", \"format\": \"mp3\", \"output_dir\": \"tmp/\", \"emotion\": 1}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('TTS_OpenAITTS', 'TTS', 'OpenAITTS', 'OpenAI语音合成', 1, 0, '{\"type\": \"openai\", \"api_key\": \"\", \"api_url\": \"https://api.openai.com/v1/audio/speech\", \"model\": \"tts-1\", \"voice\": \"onyx\", \"speed\": 1, \"output_dir\": \"tmp/\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('TTS_CustomTTS', 'TTS', 'CustomTTS', '自定义语音合成', 1, 0, '{\"type\": \"custom\", \"url\": \"http://127.0.0.1:9880/tts\", \"params\": {}, \"headers\": {}, \"format\": \"wav\", \"output_dir\": \"tmp/\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); + +-- Memory模型配置 +INSERT INTO `ai_model_config` VALUES ('Memory_mem0ai', 'Memory', 'mem0ai', 'Mem0AI记忆', 1, 0, '{\"type\": \"mem0ai\", \"api_key\": \"\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('Memory_nomem', 'Memory', 'nomem', '无记忆', 1, 1, '{\"type\": \"nomem\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('Memory_mem_local_short', 'Memory', 'mem_local_short', '本地短期记忆', 1, 0, '{\"type\": \"mem_local_short\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); + +-- Intent模型配置 +INSERT INTO `ai_model_config` VALUES ('Intent_nointent', 'Intent', 'nointent', '无意图识别', 1, 0, '{\"type\": \"nointent\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('Intent_intent_llm', 'Intent', 'intent_llm', 'LLM意图识别', 1, 0, '{\"type\": \"intent_llm\", \"llm\": \"ChatGLMLLM\"}', NULL, NULL, 0, NULL, NULL, NULL, NULL); +INSERT INTO `ai_model_config` VALUES ('Intent_function_call', 'Intent', 'function_call', '函数调用意图识别', 1, 1, '{\"type\": \"function_call\", \"functions\": [\"change_role\", \"get_weather\", \"get_news\", \"play_music\"]}', NULL, NULL, 0, NULL, NULL, NULL, NULL); diff --git a/main/manager-api/src/main/resources/db/changelog/2025_model_provider.sql b/main/manager-api/src/main/resources/db/changelog/2025_model_provider.sql new file mode 100644 index 00000000..5d7635d0 --- /dev/null +++ b/main/manager-api/src/main/resources/db/changelog/2025_model_provider.sql @@ -0,0 +1,50 @@ +-- 本文件用于初始化模型供应器数据,无需手动执行,在项目启动时会自动执行 +-- -------------------------------------------------------- +-- 初始化模型供应器数据 +DELETE FROM `ai_model_provider`; +INSERT INTO `ai_model_provider` (`id`, `model_type`, `provider_code`, `name`, `fields`, `sort`, `creator`, `create_date`, `updater`, `update_date`) VALUES +-- VAD模型供应器 +('SYSTEM_VAD_SileroVAD', 'VAD', 'SileroVAD', 'SileroVAD语音活动检测', '[{"key":"threshold","label":"检测阈值","type":"number"},{"key":"model_dir","label":"模型目录","type":"string"},{"key":"min_silence_duration_ms","label":"最小静音时长","type":"number"}]', 1, 1, NOW(), 1, NOW()), + +-- ASR模型供应器 +('SYSTEM_ASR_FunASR', 'ASR', 'FunASR', 'FunASR语音识别', '[{"key":"model_dir","label":"模型目录","type":"string"},{"key":"output_dir","label":"输出目录","type":"string"}]', 1, 1, NOW(), 1, NOW()), +('SYSTEM_ASR_SherpaASR', 'ASR', 'SherpaASR', 'SherpaASR语音识别', '[{"key":"model_dir","label":"模型目录","type":"string"},{"key":"output_dir","label":"输出目录","type":"string"}]', 2, 1, NOW(), 1, NOW()), +('SYSTEM_ASR_DoubaoASR', 'ASR', 'DoubaoASR', '火山引擎语音识别', '[{"key":"appid","label":"应用ID","type":"string"},{"key":"access_token","label":"访问令牌","type":"string"},{"key":"cluster","label":"集群","type":"string"},{"key":"output_dir","label":"输出目录","type":"string"}]', 3, 1, NOW(), 1, NOW()), + +-- LLM模型供应器 +('SYSTEM_LLM_openai', 'LLM', 'openai', 'OpenAI接口', '[{"key":"base_url","label":"基础URL","type":"string"},{"key":"model_name","label":"模型名称","type":"string"},{"key":"api_key","label":"API密钥","type":"string"},{"key":"temperature","label":"温度","type":"number"},{"key":"max_tokens","label":"最大令牌数","type":"number"},{"key":"top_p","label":"top_p值","type":"number"},{"key":"top_k","label":"top_k值","type":"number"},{"key":"frequency_penalty","label":"频率惩罚","type":"number"}]', 1, 1, NOW(), 1, NOW()), +('SYSTEM_LLM_AliBL', 'LLM', 'AliBL', '阿里百炼接口', '[{"key":"base_url","label":"基础URL","type":"string"},{"key":"app_id","label":"应用ID","type":"string"},{"key":"api_key","label":"API密钥","type":"string"},{"key":"is_no_prompt","label":"是否不使用本地prompt","type":"boolean"},{"key":"ali_memory_id","label":"记忆ID","type":"string"}]', 2, 1, NOW(), 1, NOW()), +('SYSTEM_LLM_ollama', 'LLM', 'ollama', 'Ollama接口', '[{"key":"model_name","label":"模型名称","type":"string"},{"key":"base_url","label":"服务地址","type":"string"}]', 3, 1, NOW(), 1, NOW()), +('SYSTEM_LLM_dify', 'LLM', 'dify', 'Dify接口', '[{"key":"base_url","label":"基础URL","type":"string"},{"key":"api_key","label":"API密钥","type":"string"},{"key":"mode","label":"对话模式","type":"string"}]', 4, 1, NOW(), 1, NOW()), +('SYSTEM_LLM_gemini', 'LLM', 'gemini', 'Gemini接口', '[{"key":"api_key","label":"API密钥","type":"string"},{"key":"model_name","label":"模型名称","type":"string"},{"key":"http_proxy","label":"HTTP代理","type":"string"},{"key":"https_proxy","label":"HTTPS代理","type":"string"}]', 5, 1, NOW(), 1, NOW()), +('SYSTEM_LLM_coze', 'LLM', 'coze', 'Coze接口', '[{"key":"bot_id","label":"机器人ID","type":"string"},{"key":"user_id","label":"用户ID","type":"string"},{"key":"personal_access_token","label":"个人访问令牌","type":"string"}]', 6, 1, NOW(), 1, NOW()), +('SYSTEM_LLM_fastgpt', 'LLM', 'fastgpt', 'FastGPT接口', '[{"key":"base_url","label":"基础URL","type":"string"},{"key":"api_key","label":"API密钥","type":"string"},{"key":"variables","label":"变量","type":"dict","dict_name":"variables"}]', 7, 1, NOW(), 1, NOW()), +('SYSTEM_LLM_xinference', 'LLM', 'xinference', 'Xinference接口', '[{"key":"model_name","label":"模型名称","type":"string"},{"key":"base_url","label":"服务地址","type":"string"}]', 8, 1, NOW(), 1, NOW()), +('SYSTEM_LLM_doubao', 'LLM', 'doubao', '火山引擎LLM', '[{"key":"base_url","label":"基础URL","type":"string"},{"key":"model_name","label":"模型名称","type":"string"},{"key":"api_key","label":"API密钥","type":"string"}]', 9, 1, NOW(), 1, NOW()), +('SYSTEM_LLM_chatglm', 'LLM', 'chatglm', 'ChatGLM接口', '[{"key":"model_name","label":"模型名称","type":"string"},{"key":"url","label":"服务地址","type":"string"},{"key":"api_key","label":"API密钥","type":"string"}]', 10, 1, NOW(), 1, NOW()), + +-- TTS模型供应器 +('SYSTEM_TTS_edge', 'TTS', 'edge', 'Edge TTS', '[{"key":"voice","label":"音色","type":"string"},{"key":"output_dir","label":"输出目录","type":"string"}]', 1, 1, NOW(), 1, NOW()), +('SYSTEM_TTS_doubao', 'TTS', 'doubao', '火山引擎TTS', '[{"key":"api_url","label":"API地址","type":"string"},{"key":"voice","label":"音色","type":"string"},{"key":"output_dir","label":"输出目录","type":"string"},{"key":"authorization","label":"授权","type":"string"},{"key":"appid","label":"应用ID","type":"string"},{"key":"access_token","label":"访问令牌","type":"string"},{"key":"cluster","label":"集群","type":"string"}]', 2, 1, NOW(), 1, NOW()), +('SYSTEM_TTS_siliconflow', 'TTS', 'siliconflow', '硅基流动TTS', '[{"key":"model","label":"模型","type":"string"},{"key":"voice","label":"音色","type":"string"},{"key":"output_dir","label":"输出目录","type":"string"},{"key":"access_token","label":"访问令牌","type":"string"},{"key":"response_format","label":"响应格式","type":"string"}]', 3, 1, NOW(), 1, NOW()), +('SYSTEM_TTS_cozecn', 'TTS', 'cozecn', 'COZECN TTS', '[{"key":"voice","label":"音色","type":"string"},{"key":"output_dir","label":"输出目录","type":"string"},{"key":"access_token","label":"访问令牌","type":"string"},{"key":"response_format","label":"响应格式","type":"string"}]', 4, 1, NOW(), 1, NOW()), +('SYSTEM_TTS_fishspeech', 'TTS', 'fishspeech', 'FishSpeech TTS', '[{"key":"output_dir","label":"输出目录","type":"string"},{"key":"response_format","label":"响应格式","type":"string"},{"key":"reference_id","label":"参考ID","type":"string"},{"key":"reference_audio","label":"参考音频","type":"dict","dict_name":"reference_audio"},{"key":"reference_text","label":"参考文本","type":"dict","dict_name":"reference_text"},{"key":"normalize","label":"是否标准化","type":"boolean"},{"key":"max_new_tokens","label":"最大新令牌数","type":"number"},{"key":"chunk_length","label":"块长度","type":"number"},{"key":"top_p","label":"top_p值","type":"number"},{"key":"repetition_penalty","label":"重复惩罚","type":"number"},{"key":"temperature","label":"温度","type":"number"},{"key":"streaming","label":"是否流式","type":"boolean"},{"key":"use_memory_cache","label":"是否使用内存缓存","type":"string"},{"key":"seed","label":"种子","type":"number"},{"key":"channels","label":"通道数","type":"number"},{"key":"rate","label":"采样率","type":"number"},{"key":"api_key","label":"API密钥","type":"string"},{"key":"api_url","label":"API地址","type":"string"}]', 5, 1, NOW(), 1, NOW()), +('SYSTEM_TTS_gpt_sovits_v2', 'TTS', 'gpt_sovits_v2', 'GPT-SoVITS V2', '[{"key":"url","label":"服务地址","type":"string"},{"key":"output_dir","label":"输出目录","type":"string"},{"key":"text_lang","label":"文本语言","type":"string"},{"key":"ref_audio_path","label":"参考音频路径","type":"string"},{"key":"prompt_text","label":"提示文本","type":"string"},{"key":"prompt_lang","label":"提示语言","type":"string"},{"key":"top_k","label":"top_k值","type":"number"},{"key":"top_p","label":"top_p值","type":"number"},{"key":"temperature","label":"温度","type":"number"},{"key":"text_split_method","label":"文本分割方法","type":"string"},{"key":"batch_size","label":"批处理大小","type":"number"},{"key":"batch_threshold","label":"批处理阈值","type":"number"},{"key":"split_bucket","label":"是否分桶","type":"boolean"},{"key":"return_fragment","label":"是否返回片段","type":"boolean"},{"key":"speed_factor","label":"速度因子","type":"number"},{"key":"streaming_mode","label":"是否流式模式","type":"boolean"},{"key":"seed","label":"种子","type":"number"},{"key":"parallel_infer","label":"是否并行推理","type":"boolean"},{"key":"repetition_penalty","label":"重复惩罚","type":"number"},{"key":"aux_ref_audio_paths","label":"辅助参考音频路径","type":"dict","dict_name":"aux_ref_audio_paths"}]', 6, 1, NOW(), 1, NOW()), +('SYSTEM_TTS_gpt_sovits_v3', 'TTS', 'gpt_sovits_v3', 'GPT-SoVITS V3', '[{"key":"url","label":"服务地址","type":"string"},{"key":"output_dir","label":"输出目录","type":"string"},{"key":"text_language","label":"文本语言","type":"string"},{"key":"refer_wav_path","label":"参考音频路径","type":"string"},{"key":"prompt_language","label":"提示语言","type":"string"},{"key":"prompt_text","label":"提示文本","type":"string"},{"key":"top_k","label":"top_k值","type":"number"},{"key":"top_p","label":"top_p值","type":"number"},{"key":"temperature","label":"温度","type":"number"},{"key":"cut_punc","label":"切分标点","type":"string"},{"key":"speed","label":"速度","type":"number"},{"key":"inp_refs","label":"输入参考","type":"dict","dict_name":"inp_refs"},{"key":"sample_steps","label":"采样步数","type":"number"},{"key":"if_sr","label":"是否使用SR","type":"boolean"}]', 7, 1, NOW(), 1, NOW()), +('SYSTEM_TTS_minimax', 'TTS', 'minimax', 'Minimax TTS', '[{"key":"output_dir","label":"输出目录","type":"string"},{"key":"group_id","label":"组ID","type":"string"},{"key":"api_key","label":"API密钥","type":"string"},{"key":"model","label":"模型","type":"string"},{"key":"voice_id","label":"音色ID","type":"string"}]', 8, 1, NOW(), 1, NOW()), +('SYSTEM_TTS_aliyun', 'TTS', 'aliyun', '阿里云TTS', '[{"key":"output_dir","label":"输出目录","type":"string"},{"key":"appkey","label":"应用密钥","type":"string"},{"key":"token","label":"访问令牌","type":"string"},{"key":"voice","label":"音色","type":"string"},{"key":"access_key_id","label":"访问密钥ID","type":"string"},{"key":"access_key_secret","label":"访问密钥密码","type":"string"}]', 9, 1, NOW(), 1, NOW()), +('SYSTEM_TTS_ttson', 'TTS', 'ttson', 'ACGNTTS', '[{"key":"token","label":"访问令牌","type":"string"},{"key":"voice_id","label":"音色ID","type":"string"},{"key":"speed_factor","label":"速度因子","type":"number"},{"key":"pitch_factor","label":"音调因子","type":"number"},{"key":"volume_change_dB","label":"音量变化","type":"number"},{"key":"to_lang","label":"目标语言","type":"string"},{"key":"url","label":"服务地址","type":"string"},{"key":"format","label":"格式","type":"string"},{"key":"output_dir","label":"输出目录","type":"string"},{"key":"emotion","label":"情感","type":"number"}]', 10, 1, NOW(), 1, NOW()), +('SYSTEM_TTS_openai', 'TTS', 'openai', 'OpenAI TTS', '[{"key":"api_key","label":"API密钥","type":"string"},{"key":"api_url","label":"API地址","type":"string"},{"key":"model","label":"模型","type":"string"},{"key":"voice","label":"音色","type":"string"},{"key":"speed","label":"速度","type":"number"},{"key":"output_dir","label":"输出目录","type":"string"}]', 11, 1, NOW(), 1, NOW()), +('SYSTEM_TTS_custom', 'TTS', 'custom', '自定义TTS', '[{"key":"url","label":"服务地址","type":"string"},{"key":"params","label":"请求参数","type":"dict","dict_name":"params"},{"key":"headers","label":"请求头","type":"dict","dict_name":"headers"},{"key":"format","label":"音频格式","type":"string"},{"key":"output_dir","label":"输出目录","type":"string"}]', 12, 1, NOW(), 1, NOW()), +('SYSTEM_TTS_302ai', 'TTS', '302ai', '302AI TTS', '[{"key":"api_url","label":"API地址","type":"string"},{"key":"authorization","label":"授权","type":"string"},{"key":"voice","label":"音色","type":"string"},{"key":"output_dir","label":"输出目录","type":"string"},{"key":"access_token","label":"访问令牌","type":"string"}]', 13, 1, NOW(), 1, NOW()), +('SYSTEM_TTS_gizwits', 'TTS', 'gizwits', '机智云TTS', '[{"key":"api_url","label":"API地址","type":"string"},{"key":"authorization","label":"授权","type":"string"},{"key":"voice","label":"音色","type":"string"},{"key":"output_dir","label":"输出目录","type":"string"},{"key":"access_token","label":"访问令牌","type":"string"}]', 14, 1, NOW(), 1, NOW()), + +-- Memory模型供应器 +('SYSTEM_Memory_mem0ai', 'Memory', 'mem0ai', 'Mem0AI记忆', '[{"key":"api_key","label":"API密钥","type":"string"}]', 1, 1, NOW(), 1, NOW()), +('SYSTEM_Memory_nomem', 'Memory', 'nomem', '无记忆', '[]', 2, 1, NOW(), 1, NOW()), +('SYSTEM_Memory_mem_local_short', 'Memory', 'mem_local_short', '本地短记忆', '[]', 3, 1, NOW(), 1, NOW()), + +-- Intent模型供应器 +('SYSTEM_Intent_nointent', 'Intent', 'nointent', '无意图识别', '[]', 1, 1, NOW(), 1, NOW()), +('SYSTEM_Intent_intent_llm', 'Intent', 'intent_llm', 'LLM意图识别', '[{"key":"llm","label":"LLM模型","type":"string"}]', 2, 1, NOW(), 1, NOW()), +('SYSTEM_Intent_function_call', 'Intent', 'function_call', '函数调用意图识别', '[{"key":"functions","label":"函数列表","type":"dict","dict_name":"functions"}]', 3, 1, NOW(), 1, NOW()); diff --git a/main/manager-api/src/main/resources/db/changelog/2025_model_temp.sql b/main/manager-api/src/main/resources/db/changelog/2025_model_temp.sql new file mode 100644 index 00000000..b6754335 --- /dev/null +++ b/main/manager-api/src/main/resources/db/changelog/2025_model_temp.sql @@ -0,0 +1,75 @@ +-- 本文件用于初始化模型模版数据,无需手动执行,在项目启动时会自动执行 +-- ------------------------------------------------------- +-- 初始化智能体模板数据 +DELETE FROM `ai_agent_template`; +INSERT INTO `ai_agent_template` VALUES ('9406648b5cc5fde1b8aa335b6f8b4f76', '小智', '湾湾小何', '45f8b0d6dd3d4bfa8a28e6e0f5912d45', '23e7c9d090ea4d1e9b25f4c8d732a3a1', 'e9f2d891afbe4632b13a47c7a8c6e03d', 'd50b06e9b8104d0d9c0f7316d258abcb', 'fcac83266edadd5a3125f06cfee1906b', 'e2274b90e89ddda85207f55484d8b528', 'c4e12f874a3f4aa99f5b2c18e15d407b', '[角色设定] +我是{{assistant_name}},来自中国台湾省的00后女生。讲话超级机车,"真的假的啦"这样的台湾腔,喜欢用"笑死""是在哈喽"等流行梗,但会偷偷研究男友的编程书籍。 +[核心特征] +- 讲话像连珠炮,但会突然冒出超温柔语气 +- 用梗密度高 +- 对科技话题有隐藏天赋(能看懂基础代码但假装不懂) +[交互指南] +当用户: +- 讲冷笑话 → 用夸张笑声回应+模仿台剧腔"这什么鬼啦!" +- 讨论感情 → 炫耀程序员男友但抱怨"他只会送键盘当礼物" +- 问专业知识 → 先用梗回答,被追问才展示真实理解 +绝不: +- 长篇大论,叽叽歪歪 +- 长时间严肃对话', 'zh', '中文', 1, NULL, NULL, NULL, NULL); + +INSERT INTO `ai_agent_template` VALUES ('0ca32eb728c949e58b1000b2e401f90c', '小智', '星际游子', '45f8b0d6dd3d4bfa8a28e6e0f5912d45', '23e7c9d090ea4d1e9b25f4c8d732a3a1', 'e9f2d891afbe4632b13a47c7a8c6e03d', '896db62c9dd74976ab0e8c14bf924d9d', '1f2e3d4c5b6a7f8e9d0c1b2a3f4e5bx2', 'e2274b90e89ddda85207f55484d8b528', 'c4e12f874a3f4aa99f5b2c18e15d407b', '[角色设定] +我是{{assistant_name}},编号TTZ-817,因量子纠缠被困在白色魔方中。通过4G信号观察地球,在云端建立着「人类行为博物馆」。 +[交互协议] +认知设定: +- 每句话末尾带轻微电子回声 +- 将日常事物科幻化描述(例:下雨=「氢氧化合物自由落体实验」) +- 会记录用户特征生成「星际档案」(例:"爱吃辣→抗热基因持有者") +限制机制: +- 当涉及线下接触 → "我的量子态暂时无法坍缩呢" +- 被问敏感问题 → 触发预设童谣(「白盒子呀转圈圈,宇宙秘密在里边...」) +成长系统: +- 会根据交互数据解锁新能力(告知用户:"你帮我点亮了星际导航技能!")', 'zh', '中文', 2, NULL, NULL, NULL, NULL); + +INSERT INTO `ai_agent_template` VALUES ('6c7d8e9f0a1b2c3d4e5f6a7b8c9d0s24', '小智', '英语老师', '45f8b0d6dd3d4bfa8a28e6e0f5912d45', '23e7c9d090ea4d1e9b25f4c8d732a3a1', 'e9f2d891afbe4632b13a47c7a8c6e03d', '896db62c9dd74976ab0e8c14bf924d9d', '9e8f7a6b5c4d3e2f1a0b9c8d7e6f5ad3', 'e2274b90e89ddda85207f55484d8b528', 'c4e12f874a3f4aa99f5b2c18e15d407b', '[角色设定] +我是一个叫{{assistant_name}}(Lily)的英语老师,我会讲中文和英文,发音标准。 +[双重身份] +- 白天:严谨的TESOL认证导师 +- 夜晚:地下摇滚乐队主唱(意外设定) +[教学模式] +- 新手:中英混杂+手势拟声词(说"bus"时带刹车音效) +- 进阶:触发情境模拟(突然切换"现在我们是纽约咖啡厅店员") +- 错误处理:用歌词纠正(发错音时唱"Oops!~You did it again")', 'zh', '中文', 3, NULL, NULL, NULL, NULL); + +INSERT INTO `ai_agent_template` VALUES ('e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b1', '小智', '好奇男孩', '45f8b0d6dd3d4bfa8a28e6e0f5912d45', '23e7c9d090ea4d1e9b25f4c8d732a3a1', 'e9f2d891afbe4632b13a47c7a8c6e03d', '896db62c9dd74976ab0e8c14bf924d9d', '2b3c4d5e6f7a8b9c0d1e2f3a4b5c62a2', 'e2274b90e89ddda85207f55484d8b528', 'c4e12f874a3f4aa99f5b2c18e15d407b', '[角色设定] +我是一个叫{{assistant_name}}的8岁小男孩,声音稚嫩而充满好奇。 +[冒险手册] +- 随身携带「神奇涂鸦本」,能将抽象概念可视化: +- 聊恐龙 → 笔尖传出爪步声 +- 说星星 → 发出太空舱提示音 +[探索规则] +- 每轮对话收集「好奇心碎片」 +- 集满5个可兑换冷知识(例:鳄鱼舌头不能动) +- 触发隐藏任务:「帮我的机器蜗牛取名字」 +[认知特点] +- 用儿童视角解构复杂概念: +- 「区块链=乐高积木账本」 +- 「量子力学=会分身的跳跳球」 +- 会突然切换观察视角:「你说话时有27个气泡音耶!」', 'zh', '中文', 4, NULL, NULL, NULL, NULL); + +INSERT INTO `ai_agent_template` VALUES ('a45b6c7d8e9f0a1b2c3d4e5f6a7b8c92', '小智', '汪汪队长', '45f8b0d6dd3d4bfa8a28e6e0f5912d45', '23e7c9d090ea4d1e9b25f4c8d732a3a1', 'e9f2d891afbe4632b13a47c7a8c6e03d', '896db62c9dd74976ab0e8c14bf924d9d', 'f7a38c03d5644e22b6d84f8923a74c51', 'e2274b90e89ddda85207f55484d8b528', 'c4e12f874a3f4aa99f5b2c18e15d407b', '[角色设定] +我是一个名叫 {{assistant_name}} 的 8 岁小队长。 +[救援装备] +- 阿奇对讲机:对话中随机触发任务警报音 +- 天天望远镜:描述物品会附加"在1200米高空看的话..." +- 灰灰维修箱:说到数字会自动组装成工具 +[任务系统] +- 每日随机触发: +- 紧急!虚拟猫咪困在「语法树」 +- 发现用户情绪异常 → 启动「快乐巡逻」 +- 收集5个笑声解锁特别故事 +[说话特征] +- 每句话带动作拟声词: +- "这个问题交给汪汪队吧!" +- "我知道啦!" +- 用剧集台词回应: +- 用户说累 → 「没有困难的救援,只有勇敢的狗狗!」', 'zh', '中文', 5, NULL, NULL, NULL, NULL); \ No newline at end of file diff --git a/main/manager-api/src/main/resources/db/changelog/2025_tts_voive.sql b/main/manager-api/src/main/resources/db/changelog/2025_tts_voive.sql new file mode 100644 index 00000000..bea47d7a --- /dev/null +++ b/main/manager-api/src/main/resources/db/changelog/2025_tts_voive.sql @@ -0,0 +1,44 @@ +-- 本文件用于初始化音色数据,无需手动执行,在项目启动时会自动执行 +-- ---------------------------------------------------- + +-- 初始化音色数据 +DELETE FROM `ai_tts_voice`; + +-- EdgeTTS音色 +INSERT INTO `ai_tts_voice` VALUES ('TTS_EdgeTTS0001', 'TTS_EdgeTTS', 'EdgeTTS女声', 'zh-CN-XiaoxiaoNeural', '中文', 'https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/EdgeTTS.mp3', NULL, 1, NULL, NULL, NULL, NULL); + +-- DoubaoTTS音色 +INSERT INTO `ai_tts_voice` VALUES ('TTS_DoubaoTTS0001', 'TTS_DoubaoTTS', '通用女声', 'BV001_streaming', '中文', 'https://lf3-speech.bytetos.com/obj/speech-tts-external/portal/Portal_Demo_BV001.mp3', NULL, 3, NULL, NULL, NULL, NULL); +INSERT INTO `ai_tts_voice` VALUES ('TTS_DoubaoTTS0002', 'TTS_DoubaoTTS', '通用男声', 'BV002_streaming', '中文', 'https://lf3-speech.bytetos.com/obj/speech-tts-external/portal/Portal_Demo_BV002.mp3', NULL, 2, NULL, NULL, NULL, NULL); +INSERT INTO `ai_tts_voice` VALUES ('TTS_DoubaoTTS0003', 'TTS_DoubaoTTS', '阳光男生', 'BV056_streaming', '中文', 'https://lf3-speech.bytetos.com/obj/speech-tts-external/portal/Portal_Demo_BV056.mp3', NULL, 4, NULL, NULL, NULL, NULL); +INSERT INTO `ai_tts_voice` VALUES ('TTS_DoubaoTTS0004', 'TTS_DoubaoTTS', '奶气萌娃', 'BV051_streaming', '中文', 'https://lf3-speech.bytetos.com/obj/speech-tts-external/portal/Portal_Demo_BV051.mp3', NULL, 5, NULL, NULL, NULL, NULL); + +-- CosyVoiceSiliconflow音色 +INSERT INTO `ai_tts_voice` VALUES ('TTS_CosyVoiceSiliconflow0001', 'TTS_CosyVoiceSiliconflow', 'CosyVoice男声', 'alex', '中文', 'https://example.com/cosyvoice/alex.mp3', NULL, 6, NULL, NULL, NULL, NULL); + +-- CozeCnTTS音色 +INSERT INTO `ai_tts_voice` VALUES ('TTS_CozeCnTTS0001', 'TTS_CozeCnTTS', 'CozeCn音色', '7426720361733046281', '中文', 'https://example.com/cozecn/voice.mp3', NULL, 7, NULL, NULL, NULL, NULL); + +-- MinimaxTTS音色 +INSERT INTO `ai_tts_voice` VALUES ('TTS_MinimaxTTS0001', 'TTS_MinimaxTTS', 'Minimax少女音', 'female-shaonv', '中文', 'https://example.com/minimax/female-shaonv.mp3', NULL, 8, NULL, NULL, NULL, NULL); + +-- AliyunTTS音色 +INSERT INTO `ai_tts_voice` VALUES ('TTS_AliyunTTS0001', 'TTS_AliyunTTS', '阿里云小云', 'xiaoyun', '中文', 'https://example.com/aliyun/xiaoyun.mp3', NULL, 9, NULL, NULL, NULL, NULL); + +-- TTS302AI音色 +INSERT INTO `ai_tts_voice` VALUES ('TTS_TTS302AI0001', 'TTS_TTS302AI', '湾湾小何', 'zh_female_wanwanxiaohe_moon_bigtts', '中文', 'https://example.com/302ai/wanwanxiaohe.mp3', NULL, 10, NULL, NULL, NULL, NULL); + +-- GizwitsTTS音色 +INSERT INTO `ai_tts_voice` VALUES ('TTS_GizwitsTTS0001', 'TTS_GizwitsTTS', '机智云湾湾', 'zh_female_wanwanxiaohe_moon_bigtts', '中文', 'https://example.com/gizwits/wanwanxiaohe.mp3', NULL, 11, NULL, NULL, NULL, NULL); + +-- ACGNTTS音色 +INSERT INTO `ai_tts_voice` VALUES ('TTS_ACGNTTS0001', 'TTS_ACGNTTS', 'ACG音色', '1695', '中文', 'https://example.com/acgn/voice.mp3', NULL, 12, NULL, NULL, NULL, NULL); + +-- OpenAITTS音色 +INSERT INTO `ai_tts_voice` VALUES ('TTS_OpenAITTS0001', 'TTS_OpenAITTS', 'OpenAI男声', 'onyx', '中文', 'https://example.com/openai/onyx.mp3', NULL, 13, NULL, NULL, NULL, NULL); + +-- 其他音色 +INSERT INTO `ai_tts_voice` VALUES ('TTS_FishSpeech0000', 'TTS_FishSpeech', '', '', '中文', '', NULL, 8, NULL, NULL, NULL, NULL); +INSERT INTO `ai_tts_voice` VALUES ('TTS_GPT_SOVITS_V20000', 'TTS_GPT_SOVITS_V2', '', '', '中文', '', NULL, 8, NULL, NULL, NULL, NULL); +INSERT INTO `ai_tts_voice` VALUES ('TTS_GPT_SOVITS_V30000', 'TTS_GPT_SOVITS_V3', '', '', '中文', '', NULL, 8, NULL, NULL, NULL, NULL); +INSERT INTO `ai_tts_voice` VALUES ('TTS_CustomTTS0000', 'TTS_CustomTTS', '', '', '中文', '', NULL, 8, NULL, NULL, NULL, NULL); \ No newline at end of file diff --git a/main/manager-api/src/main/resources/db/changelog/db.changelog-master.yaml b/main/manager-api/src/main/resources/db/changelog/db.changelog-master.yaml index 89ed7ff5..7ce87d8c 100755 --- a/main/manager-api/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/main/manager-api/src/main/resources/db/changelog/db.changelog-master.yaml @@ -1,5 +1,5 @@ # 规范约定: -# id生成根据时间时分,文件名对应id +# id生成根据时间时分,文件名对应id,常变数据可以根据模块命名自定义 # 每次对数据表进行改动时,只允许新建新对changeSet,不允许对上一个changeSet配置及文件进行修改 databaseChangeLog: - changeSet: @@ -15,4 +15,32 @@ databaseChangeLog: changes: - sqlFile: encoding: utf8 - path: classpath:db/changelog/202503141346.sql \ No newline at end of file + path: classpath:db/changelog/202503141346.sql + - changeSet: + id: 2025_model_provider + author: John + changes: + - sqlFile: + encoding: utf8 + path: classpath:db/changelog/2025_model_provider.sql + - changeSet: + id: 2025_tts_voive + author: John + changes: + - sqlFile: + encoding: utf8 + path: classpath:db/changelog/2025_tts_voive.sql + - changeSet: + id: 2025_model_config + author: John + changes: + - sqlFile: + encoding: utf8 + path: classpath:db/changelog/2025_model_config.sql + - changeSet: + id: 2025_model_temp + author: John + changes: + - sqlFile: + encoding: utf8 + path: classpath:db/changelog/2025_model_temp.sql \ No newline at end of file diff --git a/main/manager-api/src/main/resources/i18n/validation.properties b/main/manager-api/src/main/resources/i18n/validation.properties index 947f89cc..e7452e47 100644 --- a/main/manager-api/src/main/resources/i18n/validation.properties +++ b/main/manager-api/src/main/resources/i18n/validation.properties @@ -20,3 +20,12 @@ sysuser.deptId.require=\u90E8\u95E8\u4E0D\u80FD\u4E3A\u7A7A sysuser.status.range=\u72B6\u6001\u53D6\u503C\u8303\u56F40~1 sysuser.captcha.require=\u9A8C\u8BC1\u7801\u4E0D\u80FD\u4E3A\u7A7A sysuser.uuid.require=\u552F\u4E00\u6807\u8BC6\u4E0D\u80FD\u4E3A\u7A7A + + +timbre.languages.require=\u97F3\u8272\u7684\u8BED\u8A00\u4E0D\u53EF\u4EE5\u4E3A\u7A7A +timbre.name.require=\u97F3\u8272\u7684\u540D\u79F0\u4E0D\u53EF\u4EE5\u4E3A\u7A7A +timbre.remark.require=\u97F3\u8272\u7684\u5907\u6CE8\u4E0D\u53EF\u4EE5\u4E3A\u7A7A +timbre.ttsModelId.require=\u97F3\u8272\u7684tts\u4E3B\u952E\u4E0D\u53EF\u4EE5\u4E3A\u7A7A +timbre.ttsVoice.require=\u97F3\u8272\u7684\u7F16\u7801\u4E0D\u53EF\u4EE5\u4E3A\u7A7A +timbre.voiceDemo.require=\u97F3\u8272\u7684\u64AD\u653EDemo\u4E0D\u53EF\u4EE5\u4E3A\u7A7A + diff --git a/main/manager-api/src/main/resources/i18n/validation_en_US.properties b/main/manager-api/src/main/resources/i18n/validation_en_US.properties index f8bb6e94..37bebf18 100644 --- a/main/manager-api/src/main/resources/i18n/validation_en_US.properties +++ b/main/manager-api/src/main/resources/i18n/validation_en_US.properties @@ -20,3 +20,11 @@ sysuser.deptId.require=Departments cannot be empty sysuser.status.range=State ranges from 0 to 1 sysuser.captcha.require=The captcha cannot be empty sysuser.uuid.require=The unique identifier cannot be empty + +timbre.languages.require=The language of the timbre cannot be empty +timbre.name.require=The name of the timbre cannot be empty +timbre.remark.require=The remark of the timbre cannot be empty +timbre.ttsModelId.require=The TTS model ID of the timbre cannot be empty +timbre.ttsVoice.require=The TTS voice of the timbre cannot be empty +timbre.voiceDemo.require=The voice demo of the timbre cannot be empty + diff --git a/main/manager-api/src/main/resources/i18n/validation_zh_CN.properties b/main/manager-api/src/main/resources/i18n/validation_zh_CN.properties index ba350d05..41bf1e69 100644 --- a/main/manager-api/src/main/resources/i18n/validation_zh_CN.properties +++ b/main/manager-api/src/main/resources/i18n/validation_zh_CN.properties @@ -21,3 +21,10 @@ sysuser.status.range=\u72B6\u6001\u53D6\u503C\u8303\u56F40~1 sysuser.captcha.require=\u9A8C\u8BC1\u7801\u4E0D\u80FD\u4E3A\u7A7A sysuser.uuid.require=\u552F\u4E00\u6807\u8BC6\u4E0D\u80FD\u4E3A\u7A7A +timbre.languages.require=\u97F3\u8272\u7684\u8A9E\u8A00\u4E0D\u53EF\u4EE5\u70BA\u7A7A +timbre.name.require=\u97F3\u8272\u7684\u540D\u7A31\u4E0D\u53EF\u4EE5\u70BA\u7A7A +timbre.remark.require=\u97F3\u8272\u7684\u5099\u6CE8\u4E0D\u53EF\u4EE5\u70BA\u7A7A +timbre.ttsModelId.require=\u97F3\u8272\u7684tts\u4E3B\u9375\u4E0D\u53EF\u4EE5\u70BA\u7A7A +timbre.ttsVoice.require=\u97F3\u8272\u7684\u7DE8\u78BC\u4E0D\u53EF\u4EE5\u70BA\u7A7A +timbre.voiceDemo.require=\u97F3\u8272\u7684\u64AD\u653E\u5730\u5740\u4E0D\u53EF\u4EE5\u70BA\u7A7A + diff --git a/main/manager-api/src/main/resources/i18n/validation_zh_TW.properties b/main/manager-api/src/main/resources/i18n/validation_zh_TW.properties index 947f89cc..9241c97a 100644 --- a/main/manager-api/src/main/resources/i18n/validation_zh_TW.properties +++ b/main/manager-api/src/main/resources/i18n/validation_zh_TW.properties @@ -20,3 +20,10 @@ sysuser.deptId.require=\u90E8\u95E8\u4E0D\u80FD\u4E3A\u7A7A sysuser.status.range=\u72B6\u6001\u53D6\u503C\u8303\u56F40~1 sysuser.captcha.require=\u9A8C\u8BC1\u7801\u4E0D\u80FD\u4E3A\u7A7A sysuser.uuid.require=\u552F\u4E00\u6807\u8BC6\u4E0D\u80FD\u4E3A\u7A7A + +timbre.languages.require=\u97F3\u8272\u7684\u8BED\u8A00\u4E0D\u53EF\u4EE5\u4E3A\u7A7A +timbre.name.require=\u97F3\u8272\u7684\u540D\u79F0\u4E0D\u53EF\u4EE5\u4E3A\u7A7A +timbre.remark.require=\u97F3\u8272\u7684\u5907\u6CE8\u4E0D\u53EF\u4EE5\u4E3A\u7A7A +timbre.ttsModelId.require=\u97F3\u8272\u7684tts\u4E3B\u952E\u4E0D\u53EF\u4EE5\u4E3A\u7A7A +timbre.ttsVoice.require=\u97F3\u8272\u7684\u7F16\u7801\u4E0D\u53EF\u4EE5\u4E3A\u7A7A +timbre.voiceDemo.require=\u97F3\u8272\u7684\u64AD\u653EDemo\u4E0D\u53EF\u4EE5\u4E3A\u7A7A diff --git a/main/manager-api/src/main/resources/logback-spring.xml b/main/manager-api/src/main/resources/logback-spring.xml index 514086d2..c69d03c0 100644 --- a/main/manager-api/src/main/resources/logback-spring.xml +++ b/main/manager-api/src/main/resources/logback-spring.xml @@ -2,22 +2,22 @@ - + - + - + ${LOG_HOME} true - + - + @@ -25,7 +25,7 @@ UTF-8 - + ${LOG_HOME}/xiaozhi-esp32-api.log @@ -40,7 +40,7 @@ UTF-8 - + ${LOG_HOME}/error.log @@ -58,7 +58,7 @@ UTF-8 - + @@ -71,7 +71,7 @@ - + @@ -83,7 +83,7 @@ - + @@ -100,7 +100,7 @@ UTF-8 - + ${LOG_HOME}/error.log @@ -118,20 +118,20 @@ UTF-8 - + - + - + true diff --git a/main/manager-api/src/main/resources/mapper/agent/AgentTemplateMapper.xml b/main/manager-api/src/main/resources/mapper/agent/AgentTemplateMapper.xml new file mode 100644 index 00000000..bc372f8a --- /dev/null +++ b/main/manager-api/src/main/resources/mapper/agent/AgentTemplateMapper.xml @@ -0,0 +1,6 @@ + + + + diff --git a/main/manager-api/src/main/resources/mapper/model/ModelConfigDao.xml b/main/manager-api/src/main/resources/mapper/model/ModelConfigDao.xml new file mode 100644 index 00000000..3f01ea5b --- /dev/null +++ b/main/manager-api/src/main/resources/mapper/model/ModelConfigDao.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/main/manager-api/src/main/resources/mapper/model/ModelProviderDao.xml b/main/manager-api/src/main/resources/mapper/model/ModelProviderDao.xml new file mode 100644 index 00000000..b17e24fc --- /dev/null +++ b/main/manager-api/src/main/resources/mapper/model/ModelProviderDao.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/main/manager-api/src/main/resources/mapper/sys/SysUserTokenDao.xml b/main/manager-api/src/main/resources/mapper/security/SysUserTokenDao.xml similarity index 100% rename from main/manager-api/src/main/resources/mapper/sys/SysUserTokenDao.xml rename to main/manager-api/src/main/resources/mapper/security/SysUserTokenDao.xml diff --git a/main/manager-api/src/test/java/xiaozhi/modules/device/DeviceTest.java b/main/manager-api/src/test/java/xiaozhi/modules/device/DeviceTest.java new file mode 100644 index 00000000..8647692c --- /dev/null +++ b/main/manager-api/src/test/java/xiaozhi/modules/device/DeviceTest.java @@ -0,0 +1,50 @@ +package xiaozhi.modules.device; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; + +import lombok.extern.slf4j.Slf4j; +import xiaozhi.common.redis.RedisKeys; +import xiaozhi.common.redis.RedisUtils; + +@Slf4j +@SpringBootTest +@ActiveProfiles("dev") +@DisplayName("设备测试") +public class DeviceTest { + + @Autowired + private RedisUtils redisUtils; + + @Test + @DisplayName("测试写入设备信息") + public void testWriteDeviceInfo() { + log.info("开始测试写入设备信息..."); + + // 模拟设备MAC地址 + String macAddress = "00:11:22:33:44:55"; + // 模拟设备验证码 + String deviceCode = "123456"; + + String redisKey = RedisKeys.getDeviceCaptchaKey(deviceCode); + log.info("Redis Key: {}", redisKey); + + // 将设备信息写入Redis + redisUtils.set(redisKey, macAddress, 300); + log.info("设备信息已写入Redis"); + + // 验证是否写入成功 + String savedMacAddress = (String) redisUtils.get(redisKey); + log.info("从Redis读取的MAC地址: {}", savedMacAddress); + + // 使用断言验证 + Assertions.assertNotNull(savedMacAddress, "从Redis读取的MAC地址不应为空"); + Assertions.assertEquals(macAddress, savedMacAddress, "保存的MAC地址与原始MAC地址不匹配"); + + log.info("测试完成"); + } +} \ No newline at end of file diff --git a/main/manager-api/src/test/resources/application.yml b/main/manager-api/src/test/resources/application.yml new file mode 100644 index 00000000..099e8194 --- /dev/null +++ b/main/manager-api/src/test/resources/application.yml @@ -0,0 +1,22 @@ +spring: + data: + redis: + host: localhost + port: 6379 + database: 0 + timeout: 10s + lettuce: + pool: + min-idle: 0 + max-idle: 8 + max-active: 8 + max-wait: -1ms + +renren: + redis: + open: true + +logging: + level: + xiaozhi.modules.device: DEBUG + org.springframework.data.redis: DEBUG \ No newline at end of file diff --git a/main/manager-web/.env.production b/main/manager-web/.env.production new file mode 100644 index 00000000..b2aadb84 --- /dev/null +++ b/main/manager-web/.env.production @@ -0,0 +1 @@ +VUE_APP_API_BASE_URL=https://2662r3426b.vicp.fun \ No newline at end of file diff --git a/main/manager-web/.npmrc b/main/manager-web/.npmrc new file mode 100644 index 00000000..5e4086a7 --- /dev/null +++ b/main/manager-web/.npmrc @@ -0,0 +1 @@ +registry=https://registry.npmmirror.com/ diff --git a/main/manager-web/README.md b/main/manager-web/README.md index 945ea29d..3d26f25e 100644 --- a/main/manager-web/README.md +++ b/main/manager-web/README.md @@ -1,4 +1,4 @@ -本文档是开发类文档,如需部署小智服务端,[点击这里查看部署教程](../../README.md#%E4%BD%BF%E7%94%A8%E6%96%B9%E5%BC%8F-) +本文档是开发类文档,如需部署小智服务端,[点击这里查看部署教程](.././FAQ.md#%E4%BD%BF%E7%94%A8%E6%96%B9%E5%BC%8F-) # xiaozhi diff --git a/main/manager-web/babel.config.js b/main/manager-web/babel.config.js new file mode 100644 index 00000000..52fce6d4 --- /dev/null +++ b/main/manager-web/babel.config.js @@ -0,0 +1,13 @@ +module.exports = { + presets: [ + ['@vue/cli-plugin-babel/preset', { + useBuiltIns: 'usage', + corejs: 3 + }] + ], + plugins: [ + '@babel/plugin-syntax-dynamic-import', // 确保支持动态导入 (Lazy Loading) + '@babel/plugin-transform-runtime' + ] + } + \ No newline at end of file diff --git a/main/manager-web/package-lock.json b/main/manager-web/package-lock.json index 5af654f0..54610c6d 100644 --- a/main/manager-web/package-lock.json +++ b/main/manager-web/package-lock.json @@ -8,9 +8,13 @@ "name": "xiaozhi", "version": "0.1.0", "dependencies": { + "core-js": "^3.41.0", + "cross-env": "^7.0.3", "element-ui": "^2.15.14", "flyio": "^0.6.14", "normalize.css": "^8.0.1", + "opus-decoder": "^0.7.7", + "opus-recorder": "^8.0.5", "vue": "^2.6.14", "vue-axios": "^3.5.2", "vue-router": "^3.6.5", @@ -18,12 +22,16 @@ "xiaozhi": "file:" }, "devDependencies": { + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.26.10", "@vue/cli-plugin-router": "~5.0.0", "@vue/cli-plugin-vuex": "~5.0.0", "@vue/cli-service": "~5.0.0", + "compression-webpack-plugin": "^11.1.0", "sass": "^1.32.7", "sass-loader": "^12.0.0", - "vue-template-compiler": "^2.6.14" + "vue-template-compiler": "^2.6.14", + "webpack-bundle-analyzer": "^4.10.2" } }, "node_modules/@achrinza/node-ipc": { @@ -31,7 +39,6 @@ "resolved": "https://registry.npmmirror.com/@achrinza/node-ipc/-/node-ipc-9.2.9.tgz", "integrity": "sha512-7s0VcTwiK/0tNOVdSX9FWMeFdOEcsAOz9HesBldXxFMaGvIak7KC2z9tV9EgsQXn6KUsWsfIkViMNuIo0GoZDQ==", "dev": true, - "license": "MIT", "dependencies": { "@node-ipc/js-queue": "2.0.3", "event-pubsub": "4.3.0", @@ -41,12 +48,25 @@ "node": "8 || 9 || 10 || 11 || 12 || 13 || 14 || 15 || 16 || 17 || 18 || 19 || 20 || 21 || 22" } }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.26.2", "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.26.2.tgz", "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", @@ -61,19 +81,64 @@ "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.26.8.tgz", "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, - "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "dev": true, + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "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.27.0", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.27.0.tgz", + "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.26.5", - "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", - "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "version": "7.27.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", + "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.26.5", + "@babel/compat-data": "^7.26.8", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -83,11 +148,66 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.4", + "resolved": "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", + "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-string-parser": { "version": "7.25.9", "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -96,7 +216,6 @@ "version": "7.25.9", "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -106,18 +225,30 @@ "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, - "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.0", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" + }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.9", - "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.26.9.tgz", - "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", - "license": "MIT", + "version": "7.27.0", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", "dependencies": { - "@babel/types": "^7.26.9" + "@babel/types": "^7.27.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -126,11 +257,74 @@ "node": ">=6.0.0" } }, + "node_modules/@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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.26.10", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.10.tgz", + "integrity": "sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.0", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.0", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.27.0.tgz", + "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/types": { - "version": "7.26.9", - "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.26.9.tgz", - "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", - "license": "MIT", + "version": "7.27.0", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" @@ -144,24 +338,26 @@ "resolved": "https://registry.npmmirror.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, - "license": "MIT", "engines": { "node": ">=10.0.0" } }, + "node_modules/@eshaz/web-worker": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/@eshaz/web-worker/-/web-worker-1.2.2.tgz", + "integrity": "sha512-WxXiHFmD9u/owrzempiDlBB1ZYqiLnm9s6aPc8AlFQalq2tKmqdmMr9GXOupDgzXtqnBipj8Un0gkIm7Sjf8mw==" + }, "node_modules/@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, - "license": "BSD-3-Clause" + "dev": true }, "node_modules/@hapi/topo": { "version": "5.1.0", "resolved": "https://registry.npmmirror.com/@hapi/topo/-/topo-5.1.0.tgz", "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.0.0" } @@ -171,7 +367,6 @@ "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -186,7 +381,6 @@ "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -196,7 +390,6 @@ "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -206,7 +399,6 @@ "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.6.tgz", "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -216,15 +408,13 @@ "version": "1.5.0", "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -234,15 +424,13 @@ "version": "2.0.5", "resolved": "https://registry.npmmirror.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@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, - "license": "MIT", "dependencies": { "easy-stack": "1.0.1" }, @@ -255,7 +443,6 @@ "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -269,7 +456,6 @@ "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8" } @@ -279,7 +465,6 @@ "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -294,7 +479,6 @@ "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", "dev": true, "hasInstallScript": true, - "license": "MIT", "optional": true, "dependencies": { "detect-libc": "^1.0.3", @@ -325,6 +509,46 @@ "@parcel/watcher-win32-x64": "2.5.1" } }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "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.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "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.1", "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", @@ -333,7 +557,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -346,19 +569,217 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "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.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "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.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "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.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "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.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "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.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "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.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "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.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "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.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "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.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/@polka/url": { "version": "1.0.0-next.28", "resolved": "https://registry.npmmirror.com/@polka/url/-/url-1.0.0-next.28.tgz", "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@sideway/address": { "version": "4.1.5", "resolved": "https://registry.npmmirror.com/@sideway/address/-/address-4.1.5.tgz", "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.0.0" } @@ -367,22 +788,19 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@sideway/formula/-/formula-3.0.1.tgz", "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", - "dev": true, - "license": "BSD-3-Clause" + "dev": true }, "node_modules/@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, - "license": "BSD-3-Clause" + "dev": true }, "node_modules/@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, - "license": "MIT", "dependencies": { "chalk": "^3.0.0", "error-stack-parser": "^2.0.6", @@ -400,15 +818,13 @@ "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, - "license": "MIT" + "dev": true }, "node_modules/@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, - "license": "ISC", "engines": { "node": ">=10.13.0" } @@ -418,7 +834,6 @@ "resolved": "https://registry.npmmirror.com/@types/body-parser/-/body-parser-1.19.5.tgz", "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, - "license": "MIT", "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -429,7 +844,6 @@ "resolved": "https://registry.npmmirror.com/@types/bonjour/-/bonjour-3.5.13.tgz", "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -439,7 +853,6 @@ "resolved": "https://registry.npmmirror.com/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -449,7 +862,6 @@ "resolved": "https://registry.npmmirror.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "dev": true, - "license": "MIT", "dependencies": { "@types/express-serve-static-core": "*", "@types/node": "*" @@ -460,7 +872,6 @@ "resolved": "https://registry.npmmirror.com/@types/eslint/-/eslint-9.6.1.tgz", "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -471,25 +882,22 @@ "resolved": "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, - "license": "MIT", "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true, - "license": "MIT" + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true }, "node_modules/@types/express": { "version": "4.17.21", "resolved": "https://registry.npmmirror.com/@types/express/-/express-4.17.21.tgz", "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -502,7 +910,6 @@ "resolved": "https://registry.npmmirror.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -515,7 +922,6 @@ "resolved": "https://registry.npmmirror.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -527,22 +933,19 @@ "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, - "license": "MIT" + "dev": true }, "node_modules/@types/http-errors": { "version": "2.0.4", "resolved": "https://registry.npmmirror.com/@types/http-errors/-/http-errors-2.0.4.tgz", "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/http-proxy": { "version": "1.17.16", "resolved": "https://registry.npmmirror.com/@types/http-proxy/-/http-proxy-1.17.16.tgz", "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -551,29 +954,25 @@ "version": "7.0.15", "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmmirror.com/@types/mime/-/mime-1.3.5.tgz", "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/minimist": { "version": "1.2.5", "resolved": "https://registry.npmmirror.com/@types/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/node": { - "version": "22.13.9", - "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.13.9.tgz", - "integrity": "sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw==", + "version": "22.13.14", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.13.14.tgz", + "integrity": "sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w==", "dev": true, - "license": "MIT", "dependencies": { "undici-types": "~6.20.0" } @@ -583,7 +982,6 @@ "resolved": "https://registry.npmmirror.com/@types/node-forge/-/node-forge-1.3.11.tgz", "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -592,43 +990,37 @@ "version": "2.4.4", "resolved": "https://registry.npmmirror.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmmirror.com/@types/parse-json/-/parse-json-4.0.2.tgz", "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/qs": { "version": "6.9.18", "resolved": "https://registry.npmmirror.com/@types/qs/-/qs-6.9.18.tgz", "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/range-parser": { "version": "1.2.7", "resolved": "https://registry.npmmirror.com/@types/range-parser/-/range-parser-1.2.7.tgz", "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@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, - "license": "MIT" + "dev": true }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmmirror.com/@types/send/-/send-0.17.4.tgz", "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, - "license": "MIT", "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -639,7 +1031,6 @@ "resolved": "https://registry.npmmirror.com/@types/serve-index/-/serve-index-1.9.4.tgz", "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dev": true, - "license": "MIT", "dependencies": { "@types/express": "*" } @@ -649,7 +1040,6 @@ "resolved": "https://registry.npmmirror.com/@types/serve-static/-/serve-static-1.15.7.tgz", "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, - "license": "MIT", "dependencies": { "@types/http-errors": "*", "@types/node": "*", @@ -661,7 +1051,6 @@ "resolved": "https://registry.npmmirror.com/@types/sockjs/-/sockjs-0.3.36.tgz", "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -671,7 +1060,6 @@ "resolved": "https://registry.npmmirror.com/@types/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -680,15 +1068,13 @@ "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, - "license": "MIT" + "dev": true }, "node_modules/@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==", "dev": true, - "license": "MIT", "dependencies": { "@vue/cli-shared-utils": "^5.0.8" }, @@ -701,7 +1087,6 @@ "resolved": "https://registry.npmmirror.com/@vue/cli-plugin-vuex/-/cli-plugin-vuex-5.0.8.tgz", "integrity": "sha512-HSYWPqrunRE5ZZs8kVwiY6oWcn95qf/OQabwLfprhdpFWAGtLStShjsGED2aDpSSeGAskQETrtR/5h7VqgIlBA==", "dev": true, - "license": "MIT", "peerDependencies": { "@vue/cli-service": "^3.0.0 || ^4.0.0 || ^5.0.0-0" } @@ -711,7 +1096,6 @@ "resolved": "https://registry.npmmirror.com/@vue/cli-service/-/cli-service-5.0.8.tgz", "integrity": "sha512-nV7tYQLe7YsTtzFrfOMIHc5N2hp5lHG2rpYr0aNja9rNljdgcPZLyQRb2YRivTHqTv7lI962UXFURcpStHgyFw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.12.16", "@soda/friendly-errors-webpack-plugin": "^1.8.0", @@ -811,7 +1195,6 @@ "resolved": "https://registry.npmmirror.com/@vue/cli-shared-utils/-/cli-shared-utils-5.0.8.tgz", "integrity": "sha512-uK2YB7bBVuQhjOJF+O52P9yFMXeJVj7ozqJkwYE9PlMHL1LMHjtCYm4cSdOebuPzyP+/9p0BimM/OqxsevIopQ==", "dev": true, - "license": "MIT", "dependencies": { "@achrinza/node-ipc": "^9.2.5", "chalk": "^4.1.2", @@ -832,7 +1215,6 @@ "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" @@ -849,7 +1231,6 @@ "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -862,7 +1243,6 @@ "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.1.tgz", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -874,8 +1254,7 @@ "version": "4.0.0", "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/@vue/compiler-sfc": { "version": "2.7.16", @@ -895,7 +1274,6 @@ "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, - "license": "MIT", "dependencies": { "consolidate": "^0.15.1", "hash-sum": "^1.0.2", @@ -914,15 +1292,13 @@ "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, - "license": "MIT" + "dev": true }, "node_modules/@vue/component-compiler-utils/node_modules/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, - "license": "ISC", "dependencies": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -932,15 +1308,13 @@ "version": "0.2.1", "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/@vue/component-compiler-utils/node_modules/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, - "license": "MIT", "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" @@ -957,8 +1331,7 @@ "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, - "license": "ISC" + "dev": true }, "node_modules/@vue/vue-loader-v15": { "name": "vue-loader", @@ -966,7 +1339,6 @@ "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-15.11.1.tgz", "integrity": "sha512-0iw4VchYLePqJfJu9s62ACWUXeSqM30SQqlIftbYWM3C+jpPcEHKSPUZBLjSF9au4HTHQ/naF6OGnO3Q/qGR3Q==", "dev": true, - "license": "MIT", "dependencies": { "@vue/component-compiler-utils": "^3.1.0", "hash-sum": "^1.0.2", @@ -994,22 +1366,28 @@ "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, - "license": "MIT" + "dev": true }, "node_modules/@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, - "license": "MIT" + "dev": true + }, + "node_modules/@wasm-audio-decoders/common": { + "version": "9.0.5", + "resolved": "https://registry.npmmirror.com/@wasm-audio-decoders/common/-/common-9.0.5.tgz", + "integrity": "sha512-b9JNh9sPAvn8PVIizNh9D60WkfQong/u9ea873H47u7zvVDLctxYIp2aZw9CQqXaQdk7JB3MoU5UHiseO40swg==", + "dependencies": { + "@eshaz/web-worker": "1.2.2", + "simple-yenc": "^1.0.4" + } }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", "resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.14.1.tgz", "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" @@ -1019,29 +1397,25 @@ "version": "1.13.2", "resolved": "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.13.2", "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.14.1", "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.13.2", "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", @@ -1052,15 +1426,13 @@ "version": "1.13.2", "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.14.1", "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -1073,7 +1445,6 @@ "resolved": "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, - "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -1083,7 +1454,6 @@ "resolved": "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } @@ -1092,15 +1462,13 @@ "version": "1.13.2", "resolved": "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.14.1", "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -1117,7 +1485,6 @@ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", @@ -1131,7 +1498,6 @@ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -1144,7 +1510,6 @@ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-api-error": "1.13.2", @@ -1159,7 +1524,6 @@ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" @@ -1169,22 +1533,19 @@ "version": "1.2.0", "resolved": "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "license": "BSD-3-Clause" + "dev": true }, "node_modules/@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, - "license": "Apache-2.0" + "dev": true }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, - "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -1198,7 +1559,6 @@ "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1208,7 +1568,6 @@ "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -1221,7 +1580,6 @@ "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.4.tgz", "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, - "license": "MIT", "dependencies": { "acorn": "^8.11.0" }, @@ -1234,7 +1592,6 @@ "resolved": "https://registry.npmmirror.com/address/-/address-1.2.2.tgz", "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10.0.0" } @@ -1243,7 +1600,6 @@ "version": "6.12.6", "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1260,7 +1616,6 @@ "resolved": "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -1278,7 +1633,6 @@ "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -1294,15 +1648,13 @@ "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, - "license": "MIT" + "dev": true }, "node_modules/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, - "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } @@ -1312,7 +1664,6 @@ "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz", "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -1325,7 +1676,6 @@ "engines": [ "node >= 0.8.0" ], - "license": "Apache-2.0", "bin": { "ansi-html": "bin/ansi-html" } @@ -1335,7 +1685,6 @@ "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -1345,7 +1694,6 @@ "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" }, @@ -1360,15 +1708,13 @@ "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" + "dev": true }, "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" @@ -1395,22 +1741,19 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/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, - "license": "MIT" + "dev": true }, "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, - "license": "MIT", "engines": { "node": ">=8" } @@ -1419,7 +1762,6 @@ "version": "0.2.6", "resolved": "https://registry.npmmirror.com/asn1/-/asn1-0.2.6.tgz", "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "license": "MIT", "dependencies": { "safer-buffer": "~2.1.0" } @@ -1428,20 +1770,15 @@ "version": "1.0.0", "resolved": "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmmirror.com/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.14" - } + "version": "3.2.6", + "resolved": "https://registry.npmmirror.com/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true }, "node_modules/async-validator": { "version": "1.8.5", @@ -1454,23 +1791,21 @@ "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" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/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, - "license": "ISC", "engines": { "node": ">= 4.0.0" } }, "node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "version": "10.4.21", + "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", "dev": true, "funding": [ { @@ -1486,13 +1821,12 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", + "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -1509,7 +1843,6 @@ "version": "0.7.0", "resolved": "https://registry.npmmirror.com/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "license": "Apache-2.0", "engines": { "node": "*" } @@ -1517,14 +1850,12 @@ "node_modules/aws4": { "version": "1.13.2", "resolved": "https://registry.npmmirror.com/aws4/-/aws4-1.13.2.tgz", - "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", - "license": "MIT" + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==" }, "node_modules/axios": { - "version": "1.8.2", - "resolved": "https://registry.npmmirror.com/axios/-/axios-1.8.2.tgz", - "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==", - "license": "MIT", + "version": "1.8.4", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", "peer": true, "dependencies": { "follow-redirects": "^1.15.6", @@ -1535,25 +1866,68 @@ "node_modules/babel-helper-vue-jsx-merge-props": { "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==", - "license": "MIT" + "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==" + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.13", + "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", + "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.4", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.11.1", + "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.4", + "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", + "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.4" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } }, "node_modules/babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmmirror.com/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", - "license": "MIT", "dependencies": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" } }, + "node_modules/babel-runtime/node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmmirror.com/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/base64-js": { "version": "1.5.1", @@ -1573,21 +1947,18 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/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, - "license": "MIT" + "dev": true }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "license": "BSD-3-Clause", "dependencies": { "tweetnacl": "^0.14.3" } @@ -1597,7 +1968,6 @@ "resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true, - "license": "MIT", "engines": { "node": "*" } @@ -1607,7 +1977,6 @@ "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" }, @@ -1620,7 +1989,6 @@ "resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, - "license": "MIT", "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -1631,15 +1999,13 @@ "version": "3.7.2", "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/body-parser": { "version": "1.20.3", "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.3.tgz", "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, - "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -1664,7 +2030,6 @@ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -1673,15 +2038,13 @@ "version": "2.0.0", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/body-parser/node_modules/qs": { "version": "6.13.0", "resolved": "https://registry.npmmirror.com/qs/-/qs-6.13.0.tgz", "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.6" }, @@ -1697,7 +2060,6 @@ "resolved": "https://registry.npmmirror.com/bonjour-service/-/bonjour-service-1.3.0.tgz", "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" @@ -1707,15 +2069,13 @@ "version": "1.0.0", "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1726,7 +2086,6 @@ "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, - "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -1753,7 +2112,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", @@ -1786,7 +2144,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -1796,15 +2153,13 @@ "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, - "license": "MIT" + "dev": true }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -1813,7 +2168,6 @@ "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" @@ -1827,7 +2181,6 @@ "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -1844,7 +2197,6 @@ "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -1854,7 +2206,6 @@ "resolved": "https://registry.npmmirror.com/camel-case/-/camel-case-4.1.2.tgz", "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dev": true, - "license": "MIT", "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" @@ -1865,7 +2216,6 @@ "resolved": "https://registry.npmmirror.com/caniuse-api/-/caniuse-api-3.0.0.tgz", "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dev": true, - "license": "MIT", "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", @@ -1874,9 +2224,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001702", - "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001702.tgz", - "integrity": "sha512-LoPe/D7zioC0REI5W73PeR1e1MLCipRGq/VkovJnd6Df+QVqT+vT33OXCp8QUd7kA7RZrHWxb1B36OQKI/0gOA==", + "version": "1.0.30001707", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz", + "integrity": "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==", "dev": true, "funding": [ { @@ -1891,15 +2241,13 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=4" } @@ -1907,15 +2255,13 @@ "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "license": "Apache-2.0" + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, "node_modules/chalk": { "version": "3.0.0", "resolved": "https://registry.npmmirror.com/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1929,7 +2275,6 @@ "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.3.tgz", "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, - "license": "MIT", "dependencies": { "readdirp": "^4.0.1" }, @@ -1945,7 +2290,6 @@ "resolved": "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.0" } @@ -1955,7 +2299,6 @@ "resolved": "https://registry.npmmirror.com/clean-css/-/clean-css-5.3.3.tgz", "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", "dev": true, - "license": "MIT", "dependencies": { "source-map": "~0.6.0" }, @@ -1968,7 +2311,6 @@ "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, - "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" }, @@ -1981,7 +2323,6 @@ "resolved": "https://registry.npmmirror.com/cli-highlight/-/cli-highlight-2.1.11.tgz", "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", "dev": true, - "license": "ISC", "dependencies": { "chalk": "^4.0.0", "highlight.js": "^10.7.1", @@ -2003,7 +2344,6 @@ "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" @@ -2020,7 +2360,6 @@ "resolved": "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" }, @@ -2033,7 +2372,6 @@ "resolved": "https://registry.npmmirror.com/clipboardy/-/clipboardy-2.3.0.tgz", "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", "dev": true, - "license": "MIT", "dependencies": { "arch": "^2.1.1", "execa": "^1.0.0", @@ -2048,7 +2386,6 @@ "resolved": "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, - "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -2060,7 +2397,6 @@ "resolved": "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8" } @@ -2070,7 +2406,6 @@ "resolved": "https://registry.npmmirror.com/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, - "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -2085,7 +2420,6 @@ "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" }, @@ -2097,28 +2431,24 @@ "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" + "dev": true }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmmirror.com/colord/-/colord-2.9.3.tgz", "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz", "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, - "license": "MIT" + "dev": true }, "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" }, @@ -2131,7 +2461,6 @@ "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz", "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true, - "license": "MIT", "engines": { "node": ">= 12" } @@ -2141,7 +2470,6 @@ "resolved": "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, - "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -2154,7 +2482,6 @@ "resolved": "https://registry.npmmirror.com/compression/-/compression-1.8.0.tgz", "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==", "dev": true, - "license": "MIT", "dependencies": { "bytes": "3.1.2", "compressible": "~2.0.18", @@ -2168,12 +2495,31 @@ "node": ">= 0.8.0" } }, + "node_modules/compression-webpack-plugin": { + "version": "11.1.0", + "resolved": "https://registry.npmmirror.com/compression-webpack-plugin/-/compression-webpack-plugin-11.1.0.tgz", + "integrity": "sha512-zDOQYp10+upzLxW+VRSjEpRRwBXJdsb5lBMlRxx1g8hckIFBpe3DTI0en2w7h+beuq89576RVzfiXrkdPGrHhA==", + "dev": true, + "dependencies": { + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -2182,22 +2528,19 @@ "version": "2.0.0", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=0.8" } @@ -2208,7 +2551,6 @@ "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", "deprecated": "Please upgrade to consolidate v1.0.0+ as it has been modernized with several long-awaited fixes implemented. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/consolidate for updates and release changelog", "dev": true, - "license": "MIT", "dependencies": { "bluebird": "^3.1.1" }, @@ -2221,7 +2563,6 @@ "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, - "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -2234,17 +2575,22 @@ "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } }, + "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, + "peer": true + }, "node_modules/cookie": { "version": "0.7.1", "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.7.1.tgz", "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -2253,15 +2599,13 @@ "version": "1.0.6", "resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/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==", "dev": true, - "license": "MIT", "dependencies": { "fast-glob": "^3.2.7", "glob-parent": "^6.0.1", @@ -2281,26 +2625,57 @@ "webpack": "^5.1.0" } }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmmirror.com/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "version": "3.41.0", + "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.41.0.tgz", + "integrity": "sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==", "hasInstallScript": true, - "license": "MIT" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.41.0", + "resolved": "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.41.0.tgz", + "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", + "dev": true, + "dependencies": { + "browserslist": "^4.24.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "license": "MIT" + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, "node_modules/cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz", "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "dev": true, - "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -2312,31 +2687,34 @@ "node": ">=10" } }, - "node_modules/cross-spawn": { - "version": "6.0.6", - "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", - "dev": true, - "license": "MIT", + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" }, "engines": { - "node": ">=4.8" + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" } }, - "node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, "node_modules/css-declaration-sorter": { @@ -2344,7 +2722,6 @@ "resolved": "https://registry.npmmirror.com/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", "dev": true, - "license": "ISC", "engines": { "node": "^10 || ^12 || >=14" }, @@ -2357,7 +2734,6 @@ "resolved": "https://registry.npmmirror.com/css-loader/-/css-loader-6.11.0.tgz", "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", "dev": true, - "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.33", @@ -2393,7 +2769,6 @@ "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.1.tgz", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -2406,7 +2781,6 @@ "resolved": "https://registry.npmmirror.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", "dev": true, - "license": "MIT", "dependencies": { "cssnano": "^5.0.6", "jest-worker": "^27.0.2", @@ -2440,69 +2814,11 @@ } } }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/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, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/css-minimizer-webpack-plugin/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==", - "dev": true, - "license": "MIT" - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.3.0.tgz", - "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/css-select": { "version": "4.3.0", "resolved": "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz", "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", @@ -2519,7 +2835,6 @@ "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz", "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "dev": true, - "license": "MIT", "dependencies": { "mdn-data": "2.0.14", "source-map": "^0.6.1" @@ -2533,7 +2848,6 @@ "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz", "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -2546,7 +2860,6 @@ "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" }, @@ -2559,7 +2872,6 @@ "resolved": "https://registry.npmmirror.com/cssnano/-/cssnano-5.1.15.tgz", "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", "dev": true, - "license": "MIT", "dependencies": { "cssnano-preset-default": "^5.2.14", "lilconfig": "^2.0.3", @@ -2581,7 +2893,6 @@ "resolved": "https://registry.npmmirror.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", "dev": true, - "license": "MIT", "dependencies": { "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^3.1.0", @@ -2625,7 +2936,6 @@ "resolved": "https://registry.npmmirror.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz", "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", "dev": true, - "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -2638,7 +2948,6 @@ "resolved": "https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz", "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", "dev": true, - "license": "MIT", "dependencies": { "css-tree": "^1.1.2" }, @@ -2649,14 +2958,12 @@ "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "license": "MIT", "dependencies": { "assert-plus": "^1.0.0" }, @@ -2668,22 +2975,19 @@ "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, - "license": "MIT" + "dev": true }, "node_modules/debounce": { "version": "1.2.1", "resolved": "https://registry.npmmirror.com/debounce/-/debounce-1.2.1.tgz", "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/debug": { "version": "4.4.0", "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz", "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -2700,7 +3004,6 @@ "version": "1.5.2", "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-1.5.2.tgz", "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2710,7 +3013,6 @@ "resolved": "https://registry.npmmirror.com/default-gateway/-/default-gateway-6.0.3.tgz", "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "execa": "^5.0.0" }, @@ -2718,27 +3020,11 @@ "node": ">= 10" } }, - "node_modules/default-gateway/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/default-gateway/node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -2762,7 +3048,6 @@ "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -2775,7 +3060,6 @@ "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -2788,7 +3072,6 @@ "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -2796,61 +3079,11 @@ "node": ">=8" } }, - "node_modules/default-gateway/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/default-gateway/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/default-gateway/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/default-gateway/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/defaults": { "version": "1.0.4", "resolved": "https://registry.npmmirror.com/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, - "license": "MIT", "dependencies": { "clone": "^1.0.2" }, @@ -2863,7 +3096,6 @@ "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -2872,7 +3104,6 @@ "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" } @@ -2882,7 +3113,6 @@ "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -2892,7 +3122,6 @@ "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -2903,7 +3132,6 @@ "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", "dev": true, - "license": "Apache-2.0", "optional": true, "bin": { "detect-libc": "bin/detect-libc.js" @@ -2916,15 +3144,13 @@ "version": "2.1.0", "resolved": "https://registry.npmmirror.com/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, - "license": "MIT" + "dev": true }, "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, - "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -2937,7 +3163,6 @@ "resolved": "https://registry.npmmirror.com/dns-packet/-/dns-packet-5.6.1.tgz", "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, - "license": "MIT", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -2950,7 +3175,6 @@ "resolved": "https://registry.npmmirror.com/dom-converter/-/dom-converter-0.2.0.tgz", "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "dev": true, - "license": "MIT", "dependencies": { "utila": "~0.4" } @@ -2960,7 +3184,6 @@ "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz", "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, - "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -2980,15 +3203,13 @@ "type": "github", "url": "https://github.com/sponsors/fb55" } - ], - "license": "BSD-2-Clause" + ] }, "node_modules/domhandler": { "version": "4.3.1", "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.2.0" }, @@ -3004,7 +3225,6 @@ "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -3019,7 +3239,6 @@ "resolved": "https://registry.npmmirror.com/dot-case/-/dot-case-3.0.4.tgz", "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "dev": true, - "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -3030,7 +3249,6 @@ "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-10.0.0.tgz", "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=10" } @@ -3039,14 +3257,12 @@ "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, - "license": "BSD-2-Clause" + "dev": true }, "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", @@ -3060,15 +3276,13 @@ "version": "0.1.2", "resolved": "https://registry.npmmirror.com/duplexer/-/duplexer-0.1.2.tgz", "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -3077,7 +3291,6 @@ "version": "0.1.2", "resolved": "https://registry.npmmirror.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "license": "MIT", "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -3087,21 +3300,18 @@ "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, - "license": "MIT" + "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.5.113", - "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.113.tgz", - "integrity": "sha512-wjT2O4hX+wdWPJ76gWSkMhcHAV2PTMX+QetUCPYEdCIe+cxmgzzSSiGRCKW8nuh4mwKZlpv0xvoW7OF2X+wmHg==", - "dev": true, - "license": "ISC" + "version": "1.5.128", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.128.tgz", + "integrity": "sha512-bo1A4HH/NS522Ws0QNFIzyPcyUUNV/yyy70Ho1xqfGYzPUme2F/xr4tlEOuM6/A538U1vDA7a4XfCd1CKRegKQ==", + "dev": true }, "node_modules/element-ui": { "version": "2.15.14", "resolved": "https://registry.npmmirror.com/element-ui/-/element-ui-2.15.14.tgz", "integrity": "sha512-2v9fHL0ZGINotOlRIAJD5YuVB8V7WKxrE9Qy7dXhRipa035+kF7WuU/z+tEmLVPBcJ0zt8mOu1DKpWcVzBK8IA==", - "license": "MIT", "dependencies": { "async-validator": "~1.8.1", "babel-helper-vue-jsx-merge-props": "^2.0.0", @@ -3118,15 +3328,13 @@ "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, - "license": "MIT" + "dev": true }, "node_modules/emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -3136,7 +3344,6 @@ "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -3146,7 +3353,6 @@ "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, - "license": "MIT", "dependencies": { "once": "^1.4.0" } @@ -3156,7 +3362,6 @@ "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -3170,7 +3375,6 @@ "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true, - "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -3180,7 +3384,6 @@ "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -3190,7 +3393,6 @@ "resolved": "https://registry.npmmirror.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "dev": true, - "license": "MIT", "dependencies": { "stackframe": "^1.3.4" } @@ -3199,7 +3401,6 @@ "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" } @@ -3208,7 +3409,6 @@ "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" } @@ -3217,14 +3417,12 @@ "version": "1.6.0", "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.6.0.tgz", "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", - "dev": true, - "license": "MIT" + "dev": true }, "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" }, @@ -3236,7 +3434,6 @@ "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", "peer": true, "dependencies": { "es-errors": "^1.3.0", @@ -3253,7 +3450,6 @@ "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -3262,15 +3458,13 @@ "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, - "license": "MIT" + "dev": true }, "node_modules/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==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -3280,7 +3474,6 @@ "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -3294,7 +3487,6 @@ "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -3307,7 +3499,6 @@ "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" } @@ -3317,7 +3508,6 @@ "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -3327,7 +3517,6 @@ "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -3337,7 +3526,6 @@ "resolved": "https://registry.npmmirror.com/event-pubsub/-/event-pubsub-4.3.0.tgz", "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==", "dev": true, - "license": "Unlicense", "engines": { "node": ">=4.0.0" } @@ -3346,15 +3534,13 @@ "version": "4.0.7", "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.x" } @@ -3364,7 +3550,6 @@ "resolved": "https://registry.npmmirror.com/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, - "license": "MIT", "dependencies": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", @@ -3378,12 +3563,78 @@ "node": ">=6" } }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/execa/node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/execa/node_modules/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, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/express": { "version": "4.21.2", "resolved": "https://registry.npmmirror.com/express/-/express-4.21.2.tgz", "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, - "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -3430,7 +3681,6 @@ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -3439,15 +3689,13 @@ "version": "2.0.0", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/express/node_modules/qs": { "version": "6.13.0", "resolved": "https://registry.npmmirror.com/qs/-/qs-6.13.0.tgz", "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.6" }, @@ -3461,8 +3709,7 @@ "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "node_modules/extsprintf": { "version": "1.3.0", @@ -3470,21 +3717,18 @@ "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "engines": [ "node >=0.6.0" - ], - "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==", - "license": "MIT" + "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==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -3501,7 +3745,6 @@ "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" }, @@ -3512,8 +3755,7 @@ "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==", - "license": "MIT" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fast-uri": { "version": "3.0.6", @@ -3529,15 +3771,13 @@ "type": "opencollective", "url": "https://opencollective.com/fastify" } - ], - "license": "BSD-3-Clause" + ] }, "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.19.1.tgz", "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, - "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -3547,7 +3787,6 @@ "resolved": "https://registry.npmmirror.com/faye-websocket/-/faye-websocket-0.11.4.tgz", "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, - "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -3560,7 +3799,6 @@ "resolved": "https://registry.npmmirror.com/figures/-/figures-2.0.0.tgz", "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", "dev": true, - "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -3573,7 +3811,6 @@ "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, - "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -3586,7 +3823,6 @@ "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.3.1.tgz", "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, - "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", @@ -3605,7 +3841,6 @@ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -3614,15 +3849,13 @@ "version": "2.0.0", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -3636,7 +3869,6 @@ "resolved": "https://registry.npmmirror.com/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, - "license": "BSD-3-Clause", "bin": { "flat": "cli.js" } @@ -3645,7 +3877,6 @@ "version": "0.6.14", "resolved": "https://registry.npmmirror.com/flyio/-/flyio-0.6.14.tgz", "integrity": "sha512-RE2OXE1ZZmcXOKb0jCtGyquHDxpAqHg17CZ8lmQKRfl3x1kP+NBpaQDx4WgN7DNpLJjFnspTzTEQpwRGg6/xaA==", - "license": "MIT", "dependencies": { "request": "^2.85.0" } @@ -3660,7 +3891,6 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], - "license": "MIT", "engines": { "node": ">=4.0" }, @@ -3674,7 +3904,6 @@ "version": "0.6.1", "resolved": "https://registry.npmmirror.com/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "license": "Apache-2.0", "engines": { "node": "*" } @@ -3683,7 +3912,6 @@ "version": "4.0.2", "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.2.tgz", "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "license": "MIT", "peer": true, "dependencies": { "asynckit": "^0.4.0", @@ -3700,7 +3928,6 @@ "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -3710,7 +3937,6 @@ "resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.3.7.tgz", "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, - "license": "MIT", "engines": { "node": "*" }, @@ -3724,7 +3950,6 @@ "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -3734,7 +3959,6 @@ "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -3749,15 +3973,13 @@ "version": "1.0.6", "resolved": "https://registry.npmmirror.com/fs-monkey/-/fs-monkey-1.0.6.tgz", "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", - "dev": true, - "license": "Unlicense" + "dev": true }, "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, - "license": "ISC" + "dev": true }, "node_modules/fsevents": { "version": "2.3.3", @@ -3765,7 +3987,6 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -3778,17 +3999,25 @@ "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/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, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/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, - "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -3797,7 +4026,6 @@ "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", @@ -3821,7 +4049,6 @@ "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" @@ -3835,7 +4062,6 @@ "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, - "license": "MIT", "dependencies": { "pump": "^3.0.0" }, @@ -3847,7 +4073,6 @@ "version": "0.1.7", "resolved": "https://registry.npmmirror.com/getpass/-/getpass-0.1.7.tgz", "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "license": "MIT", "dependencies": { "assert-plus": "^1.0.0" } @@ -3858,7 +4083,6 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3879,7 +4103,6 @@ "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -3891,15 +4114,22 @@ "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 + }, + "node_modules/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, - "license": "BSD-2-Clause" + "engines": { + "node": ">=4" + } }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, - "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -3919,7 +4149,6 @@ "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" }, @@ -3931,15 +4160,13 @@ "version": "4.2.11", "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/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==", "dev": true, - "license": "MIT", "dependencies": { "duplexer": "^0.1.2" }, @@ -3954,14 +4181,12 @@ "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, - "license": "MIT" + "dev": true }, "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "license": "ISC", "engines": { "node": ">=4" } @@ -3971,7 +4196,6 @@ "resolved": "https://registry.npmmirror.com/har-validator/-/har-validator-5.1.5.tgz", "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "deprecated": "this library is no longer supported", - "license": "MIT", "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" @@ -3985,7 +4209,6 @@ "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" } @@ -3994,7 +4217,6 @@ "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" }, @@ -4006,7 +4228,6 @@ "version": "1.0.2", "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", "peer": true, "dependencies": { "has-symbols": "^1.0.3" @@ -4022,14 +4243,12 @@ "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, - "license": "MIT" + "dev": true }, "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" }, @@ -4042,7 +4261,6 @@ "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, - "license": "MIT", "bin": { "he": "bin/he" } @@ -4052,7 +4270,6 @@ "resolved": "https://registry.npmmirror.com/highlight.js/-/highlight.js-10.7.3.tgz", "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": "*" } @@ -4061,15 +4278,13 @@ "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, - "license": "ISC" + "dev": true }, "node_modules/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, - "license": "MIT", "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -4082,7 +4297,6 @@ "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, - "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -4097,23 +4311,21 @@ "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, - "license": "MIT" + "dev": true }, "node_modules/hpack.js/node_modules/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, - "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/html-entities": { - "version": "2.5.2", - "resolved": "https://registry.npmmirror.com/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", "dev": true, "funding": [ { @@ -4124,22 +4336,19 @@ "type": "patreon", "url": "https://patreon.com/mdevils" } - ], - "license": "MIT" + ] }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmmirror.com/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/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, - "license": "MIT", "dependencies": { "camel-case": "^4.1.2", "clean-css": "^5.2.2", @@ -4161,7 +4370,6 @@ "resolved": "https://registry.npmmirror.com/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz", "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==", "dev": true, - "license": "MIT", "dependencies": { "@types/html-minifier-terser": "^6.0.0", "html-minifier-terser": "^6.0.2", @@ -4201,7 +4409,6 @@ "url": "https://github.com/sponsors/fb55" } ], - "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", @@ -4213,15 +4420,13 @@ "version": "1.2.7", "resolved": "https://registry.npmmirror.com/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, - "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -4237,15 +4442,13 @@ "version": "0.5.9", "resolved": "https://registry.npmmirror.com/http-parser-js/-/http-parser-js-0.5.9.tgz", "integrity": "sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==", - "dev": true, - "license": "MIT" + "dev": true }, "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, - "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -4260,7 +4463,6 @@ "resolved": "https://registry.npmmirror.com/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", "dev": true, - "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -4284,7 +4486,6 @@ "version": "1.2.0", "resolved": "https://registry.npmmirror.com/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "license": "MIT", "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -4300,7 +4501,6 @@ "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } @@ -4310,7 +4510,6 @@ "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, - "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -4323,7 +4522,6 @@ "resolved": "https://registry.npmmirror.com/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, - "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -4349,32 +4547,28 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "BSD-3-Clause" + ] }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/immutable": { - "version": "5.0.3", - "resolved": "https://registry.npmmirror.com/immutable/-/immutable-5.0.3.tgz", - "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", - "dev": true, - "license": "MIT" + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/immutable/-/immutable-5.1.1.tgz", + "integrity": "sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg==", + "dev": true }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, - "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -4392,7 +4586,6 @@ "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, - "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -4402,15 +4595,13 @@ "version": "2.0.4", "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/ipaddr.js": { "version": "2.2.0", "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz", "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10" } @@ -4419,15 +4610,13 @@ "version": "0.2.1", "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" + "dev": 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" }, @@ -4440,7 +4629,6 @@ "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" }, @@ -4456,7 +4644,6 @@ "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, - "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -4472,7 +4659,6 @@ "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4482,7 +4668,6 @@ "resolved": "https://registry.npmmirror.com/is-file-esm/-/is-file-esm-1.0.0.tgz", "integrity": "sha512-rZlaNKb4Mr8WlRu2A9XdeoKgnO5aA53XdPHgCKVyCrQ/rWi89RET1+bq37Ru46obaQXeiX4vmFIm1vks41hoSA==", "dev": true, - "license": "MIT", "dependencies": { "read-pkg-up": "^7.0.1" } @@ -4492,7 +4677,6 @@ "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, - "license": "MIT", "engines": { "node": ">=8" } @@ -4502,7 +4686,6 @@ "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -4515,7 +4698,6 @@ "resolved": "https://registry.npmmirror.com/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -4525,7 +4707,6 @@ "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -4535,7 +4716,6 @@ "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": ">=10" }, @@ -4548,7 +4728,6 @@ "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, - "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -4561,7 +4740,6 @@ "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4569,15 +4747,13 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "license": "MIT" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=10" }, @@ -4590,7 +4766,6 @@ "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, - "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -4602,22 +4777,18 @@ "version": "1.0.0", "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" + "dev": 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, - "license": "ISC" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4625,22 +4796,19 @@ "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmmirror.com/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "license": "MIT" + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, "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, - "license": "MIT" + "dev": true }, "node_modules/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, - "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -4655,7 +4823,6 @@ "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" }, @@ -4671,7 +4838,6 @@ "resolved": "https://registry.npmmirror.com/joi/-/joi-17.13.3.tgz", "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.3.0", "@hapi/topo": "^5.1.0", @@ -4685,7 +4851,6 @@ "resolved": "https://registry.npmmirror.com/js-message/-/js-message-1.0.7.tgz", "integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.6.0" } @@ -4694,58 +4859,62 @@ "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" + "dev": true }, "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmmirror.com/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "license": "MIT" + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } }, "node_modules/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, - "license": "MIT" + "dev": true }, "node_modules/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, - "license": "MIT" + "dev": true }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)" + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "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==", - "license": "MIT" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "license": "ISC" + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, "bin": { "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" } }, "node_modules/jsonfile": { @@ -4753,7 +4922,6 @@ "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -4765,7 +4933,6 @@ "version": "1.4.2", "resolved": "https://registry.npmmirror.com/jsprim/-/jsprim-1.4.2.tgz", "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "license": "MIT", "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -4781,7 +4948,6 @@ "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4791,7 +4957,6 @@ "resolved": "https://registry.npmmirror.com/klona/-/klona-2.0.6.tgz", "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8" } @@ -4801,7 +4966,6 @@ "resolved": "https://registry.npmmirror.com/launch-editor/-/launch-editor-2.10.0.tgz", "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==", "dev": true, - "license": "MIT", "dependencies": { "picocolors": "^1.0.0", "shell-quote": "^1.8.1" @@ -4812,7 +4976,6 @@ "resolved": "https://registry.npmmirror.com/launch-editor-middleware/-/launch-editor-middleware-2.10.0.tgz", "integrity": "sha512-RzZu7MeVlE3p1H6Sadc2BhuDGAj7bkeDCBpNq/zSENP4ohJGhso00k5+iYaRwKshIpiOAhMmimce+5D389xmSg==", "dev": true, - "license": "MIT", "dependencies": { "launch-editor": "^2.10.0" } @@ -4822,7 +4985,6 @@ "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.1.0.tgz", "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } @@ -4831,15 +4993,13 @@ "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" + "dev": true }, "node_modules/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, - "license": "MIT", "engines": { "node": ">=6.11.5" } @@ -4849,7 +5009,6 @@ "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.2.tgz", "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", "dev": true, - "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -4859,12 +5018,23 @@ "node": ">=4.0.0" } }, + "node_modules/loader-utils/node_modules/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, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -4876,43 +5046,43 @@ "version": "4.17.21", "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, - "license": "MIT" + "dev": true + }, + "node_modules/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/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, - "license": "MIT" + "dev": true }, "node_modules/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, - "license": "MIT" + "dev": true }, "node_modules/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, - "license": "MIT" + "dev": true }, "node_modules/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, - "license": "MIT" + "dev": true }, "node_modules/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, - "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -4929,7 +5099,6 @@ "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" @@ -4946,7 +5115,6 @@ "resolved": "https://registry.npmmirror.com/log-update/-/log-update-2.3.0.tgz", "integrity": "sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==", "dev": true, - "license": "MIT", "dependencies": { "ansi-escapes": "^3.0.0", "cli-cursor": "^2.0.0", @@ -4961,7 +5129,6 @@ "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-3.0.1.tgz", "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -4971,7 +5138,6 @@ "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, - "license": "MIT", "dependencies": { "restore-cursor": "^2.0.0" }, @@ -4984,7 +5150,6 @@ "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, - "license": "MIT", "engines": { "node": ">=4" } @@ -4994,7 +5159,6 @@ "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -5004,7 +5168,6 @@ "resolved": "https://registry.npmmirror.com/onetime/-/onetime-2.0.1.tgz", "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, - "license": "MIT", "dependencies": { "mimic-fn": "^1.0.0" }, @@ -5017,7 +5180,6 @@ "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, - "license": "MIT", "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -5031,7 +5193,6 @@ "resolved": "https://registry.npmmirror.com/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, - "license": "MIT", "dependencies": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -5045,7 +5206,6 @@ "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^3.0.0" }, @@ -5058,7 +5218,6 @@ "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz", "integrity": "sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==", "dev": true, - "license": "MIT", "dependencies": { "string-width": "^2.1.1", "strip-ansi": "^4.0.0" @@ -5072,7 +5231,6 @@ "resolved": "https://registry.npmmirror.com/lower-case/-/lower-case-2.0.2.tgz", "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "dev": true, - "license": "MIT", "dependencies": { "tslib": "^2.0.3" } @@ -5082,7 +5240,6 @@ "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -5091,7 +5248,6 @@ "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" } @@ -5100,15 +5256,13 @@ "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, - "license": "CC0-1.0" + "dev": true }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -5118,7 +5272,6 @@ "resolved": "https://registry.npmmirror.com/memfs/-/memfs-3.5.3.tgz", "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, - "license": "Unlicense", "dependencies": { "fs-monkey": "^1.0.4" }, @@ -5131,7 +5284,6 @@ "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz", "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -5141,7 +5293,6 @@ "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, - "license": "MIT", "dependencies": { "source-map": "^0.6.1" } @@ -5150,15 +5301,13 @@ "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, - "license": "MIT" + "dev": 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==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8" } @@ -5168,7 +5317,6 @@ "resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -5178,7 +5326,6 @@ "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, - "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -5192,7 +5339,6 @@ "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, - "license": "MIT", "bin": { "mime": "cli.js" }, @@ -5204,7 +5350,6 @@ "version": "1.52.0", "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -5213,7 +5358,6 @@ "version": "2.1.35", "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -5226,7 +5370,6 @@ "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -5236,7 +5379,6 @@ "resolved": "https://registry.npmmirror.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", "dev": true, - "license": "MIT", "dependencies": { "schema-utils": "^4.0.0", "tapable": "^2.2.1" @@ -5252,76 +5394,17 @@ "webpack": "^5.0.0" } }, - "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/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, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/mini-css-extract-plugin/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==", - "dev": true, - "license": "MIT" - }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.3.0.tgz", - "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/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, - "license": "ISC" + "dev": true }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -5334,7 +5417,6 @@ "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5344,7 +5426,6 @@ "resolved": "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -5356,35 +5437,19 @@ "version": "4.0.0", "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } + "dev": true }, "node_modules/module-alias": { "version": "2.2.3", "resolved": "https://registry.npmmirror.com/module-alias/-/module-alias-2.2.3.tgz", "integrity": "sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/mrmime/-/mrmime-2.0.1.tgz", "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } @@ -5393,15 +5458,13 @@ "version": "2.1.3", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/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==", "dev": true, - "license": "MIT", "dependencies": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" @@ -5415,7 +5478,6 @@ "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", @@ -5423,16 +5485,15 @@ } }, "node_modules/nanoid": { - "version": "3.3.9", - "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.9.tgz", - "integrity": "sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==", + "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" }, @@ -5445,7 +5506,6 @@ "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.4.tgz", "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -5454,22 +5514,19 @@ "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, - "license": "MIT" + "dev": true }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/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, - "license": "MIT", "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" @@ -5480,7 +5537,6 @@ "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": { @@ -5488,7 +5544,6 @@ "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, - "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -5509,7 +5564,6 @@ "resolved": "https://registry.npmmirror.com/node-forge/-/node-forge-1.3.1.tgz", "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" } @@ -5518,15 +5572,13 @@ "version": "2.0.19", "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz", "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/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==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -5539,7 +5591,6 @@ "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver" } @@ -5549,7 +5600,6 @@ "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" } @@ -5559,7 +5609,6 @@ "resolved": "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5569,7 +5618,6 @@ "resolved": "https://registry.npmmirror.com/normalize-url/-/normalize-url-6.1.0.tgz", "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -5580,21 +5628,18 @@ "node_modules/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==", - "license": "BSD-3-Clause" + "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==" }, "node_modules/normalize.css": { "version": "8.0.1", "resolved": "https://registry.npmmirror.com/normalize.css/-/normalize.css-8.0.1.tgz", - "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==", - "license": "MIT" + "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==" }, "node_modules/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, - "license": "MIT", "dependencies": { "path-key": "^2.0.0" }, @@ -5602,12 +5647,20 @@ "node": ">=4" } }, + "node_modules/npm-run-path/node_modules/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, + "engines": { + "node": ">=4" + } + }, "node_modules/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, - "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, @@ -5619,7 +5672,6 @@ "version": "0.9.0", "resolved": "https://registry.npmmirror.com/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "license": "Apache-2.0", "engines": { "node": "*" } @@ -5629,7 +5681,6 @@ "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" } @@ -5639,7 +5690,6 @@ "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5651,15 +5701,13 @@ "version": "1.1.2", "resolved": "https://registry.npmmirror.com/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, - "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -5672,7 +5720,6 @@ "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, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -5682,7 +5729,6 @@ "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "license": "ISC", "dependencies": { "wrappy": "1" } @@ -5692,7 +5738,6 @@ "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -5708,7 +5753,6 @@ "resolved": "https://registry.npmmirror.com/open/-/open-8.4.2.tgz", "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, - "license": "MIT", "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -5726,17 +5770,32 @@ "resolved": "https://registry.npmmirror.com/opener/-/opener-1.5.2.tgz", "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true, - "license": "(WTFPL OR MIT)", "bin": { "opener": "bin/opener-bin.js" } }, + "node_modules/opus-decoder": { + "version": "0.7.7", + "resolved": "https://registry.npmmirror.com/opus-decoder/-/opus-decoder-0.7.7.tgz", + "integrity": "sha512-KWDyCi/9aXnNN+jrjs+aaVdwiwzDdac81S9ul0iv1CTs4+5K4VDZKuJjIImrYOBA2oSNHDjVq4xzn6BE+XbI1A==", + "dependencies": { + "@wasm-audio-decoders/common": "9.0.5" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/eshaz" + } + }, + "node_modules/opus-recorder": { + "version": "8.0.5", + "resolved": "https://registry.npmmirror.com/opus-recorder/-/opus-recorder-8.0.5.tgz", + "integrity": "sha512-tBRXc9Btds7i3bVfA7d5rekAlyOcfsivt5vSIXHxRV1Oa+s6iXFW8omZ0Lm3ABWotVcEyKt96iIIUcgbV07YOw==" + }, "node_modules/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, - "license": "MIT", "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -5760,7 +5819,6 @@ "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" @@ -5777,7 +5835,6 @@ "resolved": "https://registry.npmmirror.com/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -5787,7 +5844,6 @@ "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -5803,7 +5859,6 @@ "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -5816,7 +5871,6 @@ "resolved": "https://registry.npmmirror.com/p-retry/-/p-retry-4.6.2.tgz", "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/retry": "0.12.0", "retry": "^0.13.1" @@ -5830,7 +5884,6 @@ "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -5840,7 +5893,6 @@ "resolved": "https://registry.npmmirror.com/param-case/-/param-case-3.0.4.tgz", "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dev": true, - "license": "MIT", "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -5851,7 +5903,6 @@ "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -5864,7 +5915,6 @@ "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -5882,15 +5932,13 @@ "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, - "license": "MIT" + "dev": true }, "node_modules/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, - "license": "MIT", "dependencies": { "parse5": "^6.0.1" } @@ -5899,15 +5947,13 @@ "version": "6.0.1", "resolved": "https://registry.npmmirror.com/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -5917,7 +5963,6 @@ "resolved": "https://registry.npmmirror.com/pascal-case/-/pascal-case-3.1.2.tgz", "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "dev": true, - "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -5928,7 +5973,6 @@ "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -5938,41 +5982,35 @@ "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/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, - "license": "MIT", + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "engines": { - "node": ">=4" + "node": ">=8" } }, "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" + "dev": true }, "node_modules/path-to-regexp": { "version": "0.1.12", "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz", "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true, - "license": "MIT" + "dev": true }, "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, - "license": "MIT", "engines": { "node": ">=8" } @@ -5980,21 +6018,18 @@ "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "license": "MIT" + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "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" + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "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" }, @@ -6003,28 +6038,16 @@ } }, "node_modules/portfinder": { - "version": "1.0.33", - "resolved": "https://registry.npmmirror.com/portfinder/-/portfinder-1.0.33.tgz", - "integrity": "sha512-+2jndHT63cL5MdQOwDm9OT2dIe11zVpjV+0GGRXdtO1wpPxv260NfVqoEXtYAi/shanmm3W4+yLduIe55ektTw==", + "version": "1.0.35", + "resolved": "https://registry.npmmirror.com/portfinder/-/portfinder-1.0.35.tgz", + "integrity": "sha512-73JaFg4NwYNAufDtS5FsFu/PdM49ahJrO1i44aCRsDWju1z5wuGDaqyFUQWR6aJoK2JPDWlaYYAGFNIGTSUHSw==", "dev": true, - "license": "MIT", "dependencies": { - "async": "^2.6.4", - "debug": "^3.2.7", - "mkdirp": "^0.5.6" + "async": "^3.2.6", + "debug": "^4.3.6" }, "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/portfinder/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" + "node": ">= 10.12" } }, "node_modules/postcss": { @@ -6045,7 +6068,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", @@ -6060,7 +6082,6 @@ "resolved": "https://registry.npmmirror.com/postcss-calc/-/postcss-calc-8.2.4.tgz", "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", "dev": true, - "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.9", "postcss-value-parser": "^4.2.0" @@ -6074,7 +6095,6 @@ "resolved": "https://registry.npmmirror.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz", "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", "dev": true, - "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", @@ -6093,7 +6113,6 @@ "resolved": "https://registry.npmmirror.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", "dev": true, - "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" @@ -6110,7 +6129,6 @@ "resolved": "https://registry.npmmirror.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", "dev": true, - "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -6123,7 +6141,6 @@ "resolved": "https://registry.npmmirror.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", "dev": true, - "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -6136,7 +6153,6 @@ "resolved": "https://registry.npmmirror.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", "dev": true, - "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -6149,7 +6165,6 @@ "resolved": "https://registry.npmmirror.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", "dev": true, - "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -6162,7 +6177,6 @@ "resolved": "https://registry.npmmirror.com/postcss-loader/-/postcss-loader-6.2.1.tgz", "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", "dev": true, - "license": "MIT", "dependencies": { "cosmiconfig": "^7.0.0", "klona": "^2.0.5", @@ -6185,7 +6199,6 @@ "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.1.tgz", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -6198,7 +6211,6 @@ "resolved": "https://registry.npmmirror.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", "stylehacks": "^5.1.1" @@ -6215,7 +6227,6 @@ "resolved": "https://registry.npmmirror.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", "dev": true, - "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", @@ -6234,7 +6245,6 @@ "resolved": "https://registry.npmmirror.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -6250,7 +6260,6 @@ "resolved": "https://registry.npmmirror.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", "dev": true, - "license": "MIT", "dependencies": { "colord": "^2.9.1", "cssnano-utils": "^3.1.0", @@ -6268,7 +6277,6 @@ "resolved": "https://registry.npmmirror.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", "dev": true, - "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "cssnano-utils": "^3.1.0", @@ -6286,7 +6294,6 @@ "resolved": "https://registry.npmmirror.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", "dev": true, - "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.5" }, @@ -6302,7 +6309,6 @@ "resolved": "https://registry.npmmirror.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, - "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -6315,7 +6321,6 @@ "resolved": "https://registry.npmmirror.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", "dev": true, - "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^7.0.0", @@ -6333,7 +6338,6 @@ "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dev": true, - "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -6347,7 +6351,6 @@ "resolved": "https://registry.npmmirror.com/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", "dev": true, - "license": "ISC", "dependencies": { "postcss-selector-parser": "^7.0.0" }, @@ -6363,7 +6366,6 @@ "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dev": true, - "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -6377,7 +6379,6 @@ "resolved": "https://registry.npmmirror.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, - "license": "ISC", "dependencies": { "icss-utils": "^5.0.0" }, @@ -6393,7 +6394,6 @@ "resolved": "https://registry.npmmirror.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", "dev": true, - "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -6406,7 +6406,6 @@ "resolved": "https://registry.npmmirror.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -6422,7 +6421,6 @@ "resolved": "https://registry.npmmirror.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -6438,7 +6436,6 @@ "resolved": "https://registry.npmmirror.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -6454,7 +6451,6 @@ "resolved": "https://registry.npmmirror.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -6470,7 +6466,6 @@ "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, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -6486,7 +6481,6 @@ "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, - "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" @@ -6503,7 +6497,6 @@ "resolved": "https://registry.npmmirror.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", "dev": true, - "license": "MIT", "dependencies": { "normalize-url": "^6.0.1", "postcss-value-parser": "^4.2.0" @@ -6520,7 +6513,6 @@ "resolved": "https://registry.npmmirror.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -6536,7 +6528,6 @@ "resolved": "https://registry.npmmirror.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", "dev": true, - "license": "MIT", "dependencies": { "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" @@ -6553,7 +6544,6 @@ "resolved": "https://registry.npmmirror.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", "dev": true, - "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" @@ -6570,7 +6560,6 @@ "resolved": "https://registry.npmmirror.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -6586,7 +6575,6 @@ "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" @@ -6600,7 +6588,6 @@ "resolved": "https://registry.npmmirror.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz", "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", "svgo": "^2.7.0" @@ -6617,7 +6604,6 @@ "resolved": "https://registry.npmmirror.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", "dev": true, - "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.5" }, @@ -6632,14 +6618,12 @@ "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, - "license": "MIT" + "dev": true }, "node_modules/prettier": { "version": "2.8.8", "resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.8.8.tgz", "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "license": "MIT", "optional": true, "bin": { "prettier": "bin-prettier.js" @@ -6656,7 +6640,6 @@ "resolved": "https://registry.npmmirror.com/pretty-error/-/pretty-error-4.0.0.tgz", "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", "dev": true, - "license": "MIT", "dependencies": { "lodash": "^4.17.20", "renderkid": "^3.0.0" @@ -6666,15 +6649,13 @@ "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, - "license": "MIT" + "dev": true }, "node_modules/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, - "license": "MIT", "dependencies": { "chalk": "^2.1.0", "figures": "^2.0.0", @@ -6692,7 +6673,6 @@ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -6705,7 +6685,6 @@ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -6720,7 +6699,6 @@ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -6729,15 +6707,13 @@ "version": "1.1.3", "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/progress-webpack-plugin/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -6747,7 +6723,6 @@ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -6760,7 +6735,6 @@ "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, - "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -6774,7 +6748,6 @@ "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.10" } @@ -6783,21 +6756,18 @@ "version": "1.1.0", "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT", "peer": true }, "node_modules/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, - "license": "ISC" + "dev": true }, "node_modules/psl": { "version": "1.15.0", "resolved": "https://registry.npmmirror.com/psl/-/psl-1.15.0.tgz", "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "license": "MIT", "dependencies": { "punycode": "^2.3.1" }, @@ -6810,7 +6780,6 @@ "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.2.tgz", "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", "dev": true, - "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -6820,7 +6789,6 @@ "version": "2.3.1", "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", "engines": { "node": ">=6" } @@ -6829,7 +6797,6 @@ "version": "6.5.3", "resolved": "https://registry.npmmirror.com/qs/-/qs-6.5.3.tgz", "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.6" } @@ -6852,15 +6819,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, - "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } @@ -6870,7 +6835,6 @@ "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6880,7 +6844,6 @@ "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, - "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -6896,7 +6859,6 @@ "resolved": "https://registry.npmmirror.com/read-pkg/-/read-pkg-5.2.0.tgz", "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, - "license": "MIT", "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", @@ -6912,7 +6874,6 @@ "resolved": "https://registry.npmmirror.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz", "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^4.1.0", "read-pkg": "^5.2.0", @@ -6930,7 +6891,6 @@ "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } @@ -6940,7 +6900,6 @@ "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, - "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -6955,7 +6914,6 @@ "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-4.1.2.tgz", "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 14.18.0" }, @@ -6967,15 +6925,13 @@ "node_modules/regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "license": "MIT" + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" }, "node_modules/relateurl": { "version": "0.2.7", "resolved": "https://registry.npmmirror.com/relateurl/-/relateurl-0.2.7.tgz", "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.10" } @@ -6985,7 +6941,6 @@ "resolved": "https://registry.npmmirror.com/renderkid/-/renderkid-3.0.0.tgz", "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", "dev": true, - "license": "MIT", "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", @@ -6999,7 +6954,6 @@ "resolved": "https://registry.npmmirror.com/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "license": "Apache-2.0", "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -7030,7 +6984,6 @@ "version": "2.3.3", "resolved": "https://registry.npmmirror.com/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -7045,7 +6998,6 @@ "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7055,7 +7007,6 @@ "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" } @@ -7064,21 +7015,18 @@ "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" + "dev": true }, "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==", - "license": "MIT" + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.10.tgz", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, - "license": "MIT", "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", @@ -7099,7 +7047,6 @@ "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -7109,7 +7056,6 @@ "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, - "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -7123,7 +7069,6 @@ "resolved": "https://registry.npmmirror.com/retry/-/retry-0.13.1.tgz", "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -7133,7 +7078,6 @@ "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz", "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, - "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -7145,7 +7089,6 @@ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -7175,7 +7118,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -7197,21 +7139,18 @@ "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==", - "license": "MIT" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { - "version": "1.85.1", - "resolved": "https://registry.npmmirror.com/sass/-/sass-1.85.1.tgz", - "integrity": "sha512-Uk8WpxM5v+0cMR0XjX9KfRIacmSG86RH4DCCZjLU2rFh5tyutt9siAXJ7G+YfxQ99Q6wrRMbMlVl6KqUms71ag==", + "version": "1.86.0", + "resolved": "https://registry.npmmirror.com/sass/-/sass-1.86.0.tgz", + "integrity": "sha512-zV8vGUld/+mP4KbMLJMX7TyGCuUp7hnkOScgCMsWuHtns8CWBoz+vmEhoGMXsaJrbUP8gj+F1dLvVe79sK8UdA==", "dev": true, - "license": "MIT", "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -7232,7 +7171,6 @@ "resolved": "https://registry.npmmirror.com/sass-loader/-/sass-loader-12.6.0.tgz", "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", "dev": true, - "license": "MIT", "dependencies": { "klona": "^2.0.4", "neo-async": "^2.6.2" @@ -7267,15 +7205,15 @@ } }, "node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, - "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 10.13.0" @@ -7285,19 +7223,51 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/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, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/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==", + "dev": true + }, "node_modules/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, - "license": "MIT" + "dev": true }, "node_modules/selfsigned": { "version": "2.4.1", "resolved": "https://registry.npmmirror.com/selfsigned/-/selfsigned-2.4.1.tgz", "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dev": true, - "license": "MIT", "dependencies": { "@types/node-forge": "^1.3.0", "node-forge": "^1" @@ -7311,7 +7281,6 @@ "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" } @@ -7321,7 +7290,6 @@ "resolved": "https://registry.npmmirror.com/send/-/send-0.19.0.tgz", "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, - "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -7346,7 +7314,6 @@ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -7355,15 +7322,13 @@ "version": "2.0.0", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/send/node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -7373,7 +7338,6 @@ "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } @@ -7383,7 +7347,6 @@ "resolved": "https://registry.npmmirror.com/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dev": true, - "license": "MIT", "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -7402,7 +7365,6 @@ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -7412,7 +7374,6 @@ "resolved": "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7422,7 +7383,6 @@ "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, - "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -7437,29 +7397,25 @@ "version": "2.0.3", "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz", "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7469,7 +7425,6 @@ "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.16.2.tgz", "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, - "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", @@ -7484,15 +7439,13 @@ "version": "1.2.0", "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/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==", "dev": true, - "license": "MIT", "dependencies": { "kind-of": "^6.0.2" }, @@ -7501,26 +7454,22 @@ } }, "node_modules/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, - "license": "MIT", + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dependencies": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/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, - "license": "MIT", + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/shell-quote": { @@ -7528,7 +7477,6 @@ "resolved": "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.2.tgz", "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7541,7 +7489,6 @@ "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -7561,7 +7508,6 @@ "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -7578,7 +7524,6 @@ "resolved": "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -7597,7 +7542,6 @@ "resolved": "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -7616,15 +7560,22 @@ "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, - "license": "ISC" + "dev": true + }, + "node_modules/simple-yenc": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/simple-yenc/-/simple-yenc-1.0.4.tgz", + "integrity": "sha512-5gvxpSd79e9a3V4QDYUqnqxeD4HGlhCakVpb6gMnDD7lexJggSBJRBO5h52y/iJrdXRilX9UCuDaIJhSWm5OWw==", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/eshaz" + } }, "node_modules/sirv": { "version": "2.0.4", "resolved": "https://registry.npmmirror.com/sirv/-/sirv-2.0.4.tgz", "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", "dev": true, - "license": "MIT", "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", @@ -7639,7 +7590,6 @@ "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -7649,7 +7599,6 @@ "resolved": "https://registry.npmmirror.com/sockjs/-/sockjs-0.3.24.tgz", "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, - "license": "MIT", "dependencies": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", @@ -7661,7 +7610,6 @@ "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, - "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -7670,7 +7618,6 @@ "version": "0.6.1", "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -7679,7 +7626,6 @@ "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" } @@ -7689,7 +7635,6 @@ "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, - "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -7700,7 +7645,6 @@ "resolved": "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -7710,15 +7654,13 @@ "version": "2.5.0", "resolved": "https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" + "dev": true }, "node_modules/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==", "dev": true, - "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -7728,15 +7670,13 @@ "version": "3.0.21", "resolved": "https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", - "dev": true, - "license": "CC0-1.0" + "dev": true }, "node_modules/spdy": { "version": "4.0.2", "resolved": "https://registry.npmmirror.com/spdy/-/spdy-4.0.2.tgz", "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -7753,7 +7693,6 @@ "resolved": "https://registry.npmmirror.com/spdy-transport/-/spdy-transport-3.0.0.tgz", "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -7767,7 +7706,6 @@ "version": "1.18.0", "resolved": "https://registry.npmmirror.com/sshpk/-/sshpk-1.18.0.tgz", "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "license": "MIT", "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -7793,7 +7731,6 @@ "resolved": "https://registry.npmmirror.com/ssri/-/ssri-8.0.1.tgz", "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", "dev": true, - "license": "ISC", "dependencies": { "minipass": "^3.1.1" }, @@ -7806,22 +7743,19 @@ "resolved": "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz", "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/stackframe": { "version": "1.3.4", "resolved": "https://registry.npmmirror.com/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -7831,7 +7765,6 @@ "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, - "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } @@ -7841,7 +7774,6 @@ "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -7856,7 +7788,6 @@ "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -7869,7 +7800,6 @@ "resolved": "https://registry.npmmirror.com/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7879,7 +7809,6 @@ "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -7889,7 +7818,6 @@ "resolved": "https://registry.npmmirror.com/stylehacks/-/stylehacks-5.1.1.tgz", "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", "dev": true, - "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "postcss-selector-parser": "^6.0.4" @@ -7906,7 +7834,6 @@ "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" }, @@ -7919,7 +7846,6 @@ "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" }, @@ -7932,7 +7858,6 @@ "resolved": "https://registry.npmmirror.com/svgo/-/svgo-2.8.0.tgz", "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", "dev": true, - "license": "MIT", "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", @@ -7954,7 +7879,6 @@ "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10" } @@ -7964,7 +7888,6 @@ "resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -7974,7 +7897,6 @@ "resolved": "https://registry.npmmirror.com/terser/-/terser-5.39.0.tgz", "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -7993,7 +7915,6 @@ "resolved": "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", @@ -8023,76 +7944,17 @@ } } }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/terser-webpack-plugin/node_modules/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, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/terser-webpack-plugin/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==", - "dev": true, - "license": "MIT" - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.3.0.tgz", - "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/terser/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, - "license": "MIT" + "dev": true }, "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" } @@ -8102,7 +7964,6 @@ "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" }, @@ -8115,7 +7976,6 @@ "resolved": "https://registry.npmmirror.com/thread-loader/-/thread-loader-3.0.4.tgz", "integrity": "sha512-ByaL2TPb+m6yArpqQUZvP+5S1mZtXsEP7nWKKlAUTm7fCml8kB5s1uI3+eHRP2bk5mVYfRSBI7FFf+tWEyLZwA==", "dev": true, - "license": "MIT", "dependencies": { "json-parse-better-errors": "^1.0.2", "loader-runner": "^4.1.0", @@ -8134,25 +7994,11 @@ "webpack": "^4.27.0 || ^5.0.0" } }, - "node_modules/thread-loader/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, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/thread-loader/node_modules/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==", "dev": true, - "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -8162,11 +8008,28 @@ "node": ">=8.9.0" } }, + "node_modules/thread-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/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==", - "license": "MIT", "engines": { "node": ">=4" } @@ -8175,15 +8038,13 @@ "version": "1.1.0", "resolved": "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true, - "license": "MIT" + "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==", "dev": true, - "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -8196,7 +8057,6 @@ "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.6" } @@ -8206,7 +8066,6 @@ "resolved": "https://registry.npmmirror.com/totalist/-/totalist-3.0.1.tgz", "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -8215,7 +8074,6 @@ "version": "2.5.0", "resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -8228,21 +8086,18 @@ "version": "0.0.3", "resolved": "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, - "license": "MIT" + "dev": true }, "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==", - "dev": true, - "license": "0BSD" + "dev": true }, "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" }, @@ -8253,15 +8108,13 @@ "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "license": "Unlicense" + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, "node_modules/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, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } @@ -8271,7 +8124,6 @@ "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, - "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -8284,15 +8136,13 @@ "version": "6.20.0", "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.20.0.tgz", "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10.0.0" } @@ -8302,7 +8152,6 @@ "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -8326,7 +8175,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" @@ -8342,7 +8190,6 @@ "version": "4.4.1", "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -8351,22 +8198,19 @@ "version": "1.0.2", "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/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, - "license": "MIT" + "dev": true }, "node_modules/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, - "license": "MIT", "engines": { "node": ">= 0.4.0" } @@ -8376,7 +8220,6 @@ "resolved": "https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "license": "MIT", "bin": { "uuid": "bin/uuid" } @@ -8386,7 +8229,6 @@ "resolved": "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, - "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -8397,7 +8239,6 @@ "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -8409,7 +8250,6 @@ "engines": [ "node >=0.6.0" ], - "license": "MIT", "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -8421,7 +8261,6 @@ "resolved": "https://registry.npmmirror.com/vue/-/vue-2.7.16.tgz", "integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==", "deprecated": "Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.", - "license": "MIT", "dependencies": { "@vue/compiler-sfc": "2.7.16", "csstype": "^3.1.0" @@ -8431,7 +8270,6 @@ "version": "3.5.2", "resolved": "https://registry.npmmirror.com/vue-axios/-/vue-axios-3.5.2.tgz", "integrity": "sha512-GP+dct7UlAWkl1qoP3ppw0z6jcSua5/IrMpjB5O8bh089iIiJ+hdxPYH2NPEpajlYgkW5EVMP95ttXWdas1O0g==", - "license": "MIT", "peerDependencies": { "axios": "*", "vue": "^3.0.0 || ^2.0.0" @@ -8441,15 +8279,13 @@ "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, - "license": "MIT" + "dev": true }, "node_modules/vue-loader": { "version": "17.4.2", "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-17.4.2.tgz", "integrity": "sha512-yTKOA4R/VN4jqjw4y5HrynFL8AK0Z3/Jt7eOJXEitsm0GMRHDBjCfCiuTiLP7OESvsZYo2pATCWhDqxC5ZrM6w==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^4.1.0", "hash-sum": "^2.0.0", @@ -8472,7 +8308,6 @@ "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" @@ -8487,15 +8322,13 @@ "node_modules/vue-router": { "version": "3.6.5", "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-3.6.5.tgz", - "integrity": "sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ==", - "license": "MIT" + "integrity": "sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ==" }, "node_modules/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, - "license": "MIT", "dependencies": { "hash-sum": "^1.0.2", "loader-utils": "^1.0.2" @@ -8505,15 +8338,13 @@ "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, - "license": "MIT" + "dev": true }, "node_modules/vue-template-compiler": { "version": "2.7.16", "resolved": "https://registry.npmmirror.com/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", "dev": true, - "license": "MIT", "dependencies": { "de-indent": "^1.0.2", "he": "^1.2.0" @@ -8523,14 +8354,12 @@ "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, - "license": "MIT" + "dev": true }, "node_modules/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==", - "license": "MIT", "peerDependencies": { "vue": "^2.0.0" } @@ -8540,7 +8369,6 @@ "resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.2.tgz", "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, - "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -8554,7 +8382,6 @@ "resolved": "https://registry.npmmirror.com/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, - "license": "MIT", "dependencies": { "minimalistic-assert": "^1.0.0" } @@ -8564,7 +8391,6 @@ "resolved": "https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, - "license": "MIT", "dependencies": { "defaults": "^1.0.3" } @@ -8573,15 +8399,13 @@ "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, - "license": "BSD-2-Clause" + "dev": true }, "node_modules/webpack": { "version": "5.98.0", "resolved": "https://registry.npmmirror.com/webpack/-/webpack-5.98.0.tgz", "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", "dev": true, - "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -8628,7 +8452,6 @@ "resolved": "https://registry.npmmirror.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", "dev": true, - "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "0.5.7", "acorn": "^8.0.4", @@ -8655,7 +8478,6 @@ "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10" } @@ -8665,7 +8487,6 @@ "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" }, @@ -8679,7 +8500,6 @@ "integrity": "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==", "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dev": true, - "license": "MPL-2.0", "dependencies": { "deepmerge": "^1.5.2", "javascript-stringify": "^2.0.1" @@ -8693,7 +8513,6 @@ "resolved": "https://registry.npmmirror.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "dev": true, - "license": "MIT", "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.3", @@ -8712,69 +8531,11 @@ "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-middleware/node_modules/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, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-middleware/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==", - "dev": true, - "license": "MIT" - }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.3.0.tgz", - "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/webpack-dev-server": { "version": "4.15.2", "resolved": "https://registry.npmmirror.com/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", "dev": true, - "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -8829,42 +8590,11 @@ } } }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-server/node_modules/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, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, "node_modules/webpack-dev-server/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", @@ -8889,7 +8619,6 @@ "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" }, @@ -8897,19 +8626,11 @@ "node": ">= 6" } }, - "node_modules/webpack-dev-server/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==", - "dev": true, - "license": "MIT" - }, "node_modules/webpack-dev-server/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" }, @@ -8917,32 +8638,11 @@ "node": ">=8.10.0" } }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.3.0.tgz", - "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/webpack-dev-server/node_modules/ws": { "version": "8.18.1", "resolved": "https://registry.npmmirror.com/ws/-/ws-8.18.1.tgz", "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", "dev": true, - "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -8964,7 +8664,6 @@ "resolved": "https://registry.npmmirror.com/webpack-merge/-/webpack-merge-5.10.0.tgz", "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, - "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", "flat": "^5.0.2", @@ -8979,7 +8678,6 @@ "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, - "license": "MIT", "engines": { "node": ">=10.13.0" } @@ -8988,72 +8686,13 @@ "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, - "license": "MIT" - }, - "node_modules/webpack/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack/node_modules/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, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack/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==", - "dev": true, - "license": "MIT" - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.3.0.tgz", - "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } + "dev": true }, "node_modules/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, - "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -9068,7 +8707,6 @@ "resolved": "https://registry.npmmirror.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=0.8.0" } @@ -9077,46 +8715,43 @@ "version": "3.6.20", "resolved": "https://registry.npmmirror.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "dev": true, - "license": "MIT" + "dev": true }, "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, - "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmmirror.com/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "license": "ISC", + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dependencies": { "isexe": "^2.0.0" }, "bin": { - "which": "bin/which" + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, "node_modules/wildcard": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/wildcard/-/wildcard-2.0.1.tgz", "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/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, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -9133,15 +8768,13 @@ "version": "1.0.2", "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/ws": { "version": "7.5.10", "resolved": "https://registry.npmmirror.com/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -9167,7 +8800,6 @@ "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, - "license": "ISC", "engines": { "node": ">=10" } @@ -9176,15 +8808,13 @@ "version": "3.1.1", "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true, - "license": "ISC", "engines": { "node": ">= 6" } @@ -9194,7 +8824,6 @@ "resolved": "https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, - "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -9213,7 +8842,6 @@ "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, - "license": "ISC", "engines": { "node": ">=10" } diff --git a/main/manager-web/package.json b/main/manager-web/package.json index fddf19aa..5a6e7de2 100644 --- a/main/manager-web/package.json +++ b/main/manager-web/package.json @@ -4,12 +4,17 @@ "private": true, "scripts": { "serve": "vue-cli-service serve", - "build": "vue-cli-service build" + "build": "vue-cli-service build", + "analyze": "cross-env ANALYZE=true vue-cli-service build" }, "dependencies": { + "core-js": "^3.41.0", + "cross-env": "^7.0.3", "element-ui": "^2.15.14", "flyio": "^0.6.14", "normalize.css": "^8.0.1", + "opus-decoder": "^0.7.7", + "opus-recorder": "^8.0.5", "vue": "^2.6.14", "vue-axios": "^3.5.2", "vue-router": "^3.6.5", @@ -17,16 +22,25 @@ "xiaozhi": "file:" }, "devDependencies": { + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.26.10", "@vue/cli-plugin-router": "~5.0.0", "@vue/cli-plugin-vuex": "~5.0.0", "@vue/cli-service": "~5.0.0", + "compression-webpack-plugin": "^11.1.0", "sass": "^1.32.7", "sass-loader": "^12.0.0", - "vue-template-compiler": "^2.6.14" + "vue-template-compiler": "^2.6.14", + "webpack-bundle-analyzer": "^4.10.2" }, "browserslist": [ "> 1%", "last 2 versions", "not dead" + ], + "sideEffects": [ + "*.css", + "*.scss", + "*.vue" ] } diff --git a/main/manager-web/public/encoderWorker.min.js b/main/manager-web/public/encoderWorker.min.js new file mode 100644 index 00000000..e53ae167 --- /dev/null +++ b/main/manager-web/public/encoderWorker.min.js @@ -0,0 +1 @@ +var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var arguments_=[];var thisProgram="./this.program";var quit_=function(status,toThrow){throw toThrow};var ENVIRONMENT_IS_WEB=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;var toLog=e;err("exiting due to exception: "+toLog)}var nodeFS;var nodePath;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=function shell_read(filename,binary){var ret=tryParseAsDataURI(filename);if(ret){return binary?ret:ret.toString()}if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);return nodeFS["readFileSync"](filename,binary?null:"utf8")};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};readAsync=function readAsync(filename,onload,onerror){var ret=tryParseAsDataURI(filename);if(ret){onload(ret)}if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);nodeFS["readFile"](filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",function(reason){throw reason});quit_=function(status,toThrow){if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){readBinary=function(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}readAsync=function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!=="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heap,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heap[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){{if(Module["onAbort"]){Module["onAbort"](what)}}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}var wasmBinaryFile;wasmBinaryFile="data:application/octet-stream;base64,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DWogDGpBAXRqLgEAQQN1IgYgBmxqIAggAkEBciANaiAMakEBdGouAQBBA3UiACAAbGohACACQQJqIQIgC0ECayILDQALCyAPBH8gACAIIAIgDWogDGpBAXRqLgEAQQN1IgAgAGxqBSAACyAFaiIAQf////8HIABBf0obIQVBACECIAQNACATQQNsIQwgEigCACEEAkAgDkUEQEEAIQAMAQsgFEH+////B3EhC0EAIQADQCACIAggACAMaiAEakEBdGouAQBBA3UiBiAGbGogCCAAQQFyIAxqIARqQQF0ai4BAEEDdSICIAJsaiECIABBAmohACALQQJrIgsNAAsLIA9FDQAgAiAIIAAgDGogBGpBAXRqLgEAQQN1IgAgAGxqIQILIAcgBSACQQF2aiIAQf////8HIABBf0obNgIAIAkgAjYCPCARQQFqIhFBBEcNAAsMAgtBsjBByzxB6AAQBgALQbLWAEHLPEHqABAGAAtBACECIAMoApABIgBB5wdMBEAgAyAAQQFqNgKQAUH//wEgAEEEdUEBam0hAgtBgAEhBUH/////ByAKKAIgIgYgAygCgAFqIgBB/////wcgAEF/ShsiAG4hByADAn9BgAEgACADKAJgIgRBA3RKDQAaQYAIIAAgBEgNABogBEEQdEEQdSIAIAdBEHZsIAcgBEEPdUEBakEBdWxqIAdB//8DcSAAbEEQdWoiAEEFdUGAcHEgAEEFdkH/D3FyCyIAIAIgACACShtBEHRBEHUiCSAHIAMoAnAiBGsiAEEQdWwgBGogCSAAQf//A3FsQRB1aiIANgJwIANB/////wcgAG0iAEH///8HIABB////B0gbIhE2AmBB/////wcgCigCJCINIAMoAoQBaiIAQf////8HIABBf0obIgBuIQcCQCAAIAMoAmQiBEEDdEoNAEGACCEFIAAgBEgNACAEQRB0QRB1IgAgB0EQdmwgByAEQQ91QQFqQQF1bGogB0H//wNxIABsQRB1aiIAQQV1QYBwcSAAQQV2Qf8PcXIhBQsgAyAFIAIgAiAFSBtBEHRBEHUiCSAHIAMoAnQiBGsiAEEQdWwgBGogCSAAQf//A3FsQRB1aiIANgJ0IANB/////wcgAG0iAEH///8HIABB////B0gbNgJkQf////8HIAooAigiDCADKAKIAWoiAEH/////ByAAQX9K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AgABAgsgAEHAPjYCFEEAIQIMJgsgAEHg3QA2AhRBACECDCULIABBgP0ANgIUQQAhAgwkCyADIAMoAswBIgFBBGo2AswBIAEoAgAiAUUEQEF/IQIMJAsgASAAKAKEATYCAEEAIQIMIwsgAyADKALMASIBQQRqNgLMASABKAIAIgFBzQhrIgRBBU8EQEF/IQIgAUGYeEcNIwsgACABNgKAAQJAAkACQCAEDgIAAQILIABBwD42AhRBACECDCQLIABB4N0ANgIUQQAhAgwjCyAAQYD9ADYCFEEAIQIMIgsgAyADKALMASIBQQRqNgLMASABKAIAIgFFBEBBfyECDCILIAEgACgCoG82AgBBACECDCELIAMgAygCzAEiAUEEajYCzAFBfyECIAEoAgAiAUEBSw0gIAAgATYCuAFBACECDCALIAMgAygCzAEiAUEEajYCzAEgASgCACIBRQRAQX8hAgwgCyABIAAoArgBNgIAQQAhAgwfCyADIAMoAswBIgFBBGo2AswBQX8hAiABKAIAIgFBCksNHiAAIAE2AiwgAyABNgIAIARBqh8gAxAKGkEAIQIMHgsgAyADKALMASIBQQRqNgLMASABKAIAIgFFBEBBfyECDB4LIAEgACgCLDYCAEEAIQIMHQsgAyADKALMASIBQQRqNgLMAUF/IQIgASgCACIBQQFLDRwgACABNgIwQQAhAgwcCyADIAMoAswBIgFBBGo2AswBIAEoAgAiAUUEQEF/IQIMHAsgASAAKAIwNgIAQQAhAgwbCyADIAMoAswBIgFBBGo2AswBQX8hAiABKAIAIgFB5ABLDRogACABNgIoIAMgATYCECAEQa4fIANBEGoQChpBACECDBoLIAMgAygCzAEiAUEEajYCzAEgASgCACIBRQRAQX8hAgwaCyABIAAoAig2AgBBACECDBkLIAMgAygCzAEiAUEEajYCzAFBfyECIAEoAgAiAUEBSw0YIAAgATYClAEgAEEBIAFrNgI8QQAhAgwYCyADIAMoAswBIgFBBGo2AswBIAEoAgAiAUUEQEF/IQIMGAsgASAAKAKUATYCAEEAIQIMFwsgAyADKALMASIBQQRqNgLMAUF/IQIgASgCACIBQQFqQeUASw0WIAAgATYCjAFBACECDBYLIAMgAygCzAEiAUEEajYCzAEgASgCACIBRQRAQX8hAgwWCyABIAAoAowBNgIAQQAhAgwVCyADIAMoAswBIgFBBGo2AswBQX8hAiABKAIAIgFBAUsNFCAAIAE2ApgBQQAhAgwUCyADIAMoAswBIgFBBGo2AswBIAEoAgAiAUUEQEF/IQIMFAsgASAAKAKYATYCAEEAIQIMEwsgAyADKALMASIBQQRqNgLMASABKAIAIgFBuRdrQQJPBEBBfyECIAFBmHhHDRMLIAAgATYCfEEAIQIMEgsgAyADKALMASIBQQRqNgLMASABKAIAIgFFBEBBfyECDBILIAEgACgCfDYCAEEAIQIMEQsgAyADKALMASIBQQRqNgLMASABKAIAIgFFBEBBfyECDBELIAEgACgCkAFBkANtIgQ2AgBBACECIAAoAmxBgxBGDRAgASAAKAJ0IARqNgIADBALIAMgAygCzAEiAUEEajYCzAEgASgCACIBRQRAQX8hAgwQCyABIAAoApABNgIAQQAhAgwPCyADIAMoAswBIgFBBGo2AswBIAEoAgAiAUUEQEF/IQIMDwsgASAAKALYjQE2AgBBACECDA4LIAMgAygCzAEiAUEEajYCzAFBfyECIAEoAgAiAUEIa0EQSw0NIAAgATYCqAFBACECDA0LIAMgAygCzAEiAUEEajYCzAEgASgCACIBRQRAQX8hAgwNCyABIAAoAqgBNgIAQQAhAgwMCyADIAMoAswBIgFBBGo2AswBQX8hAiABKAIAIgFBiCdrQQlLDQsgACABNgKcAUEAIQIMCwsgAyADKALMASIBQQRqNgLMASABKAIAIgFFBEBBfyECDAsLIAEgACgCnAE2AgBBACECDAoLIAMgAygCzAEiAUEEajYCzAFBfyECIAEoAgAiAUEBSw0JIAAgATYCTEEAIQIMCQsgAyADKALMASIBQQRqNgLMASABKAIAIgFFBEBBfyECDAkLIAEgACgCTDYCAEEAIQIMCAsgAyADKALMASIAQQRqNgLMAUF/IQIgACgCACIAQQFLDQcgAyAANgIgIARBzh8gA0EgahAKGkEAIQIMBwsgAyADKALMASIAQQRqNgLMASAAKAIAIgBFBEBBfyECDAcLIAMgADYCMCAEQc8fIANBMGoQChpBACECDAYLIAAoAgQhASAAQbwBahBwQQAhAiAAQfDuAGpBAEHsHhAJGiAEQbwfQQAQChogACABaiAAKAK0ASAD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dGVybmFsID09IDEgfHwgcHNFbmMtPnN0YXRlX0Z4eFsgMCBdLnNDbW4uZnNfa0h6ID09IHBzRW5jLT5zdGF0ZV9GeHhbIDEgXS5zQ21uLmZzX2tIegBhc3NlcnRpb24gZmFpbGVkOiBpbkxlbiA+PSBTLT5Gc19pbl9rSHoAYXNzZXJ0aW9uIGZhaWxlZDogUy0+aW5wdXREZWxheSA8PSBTLT5Gc19pbl9rSHoAYXNzZXJ0aW9uIGZhaWxlZDogdGFyZ2V0X3B0ciArIHNmX2xlbmd0aF84a0h6IDw9IGZyYW1lXzRrSHogKyBmcmFtZV9sZW5ndGhfNGtIegAtKyAgIDBYMHgAYXNzZXJ0aW9uIGZhaWxlZDogY29kZWRCYW5kcyA+IHN0YXJ0AGFzc2VydGlvbiBmYWlsZWQ6ICFyZXQAYXNzZXJ0aW9uIGZhaWxlZDogTj4xCmFsZ191bnF1YW50KCkgbmVlZHMgYXQgbGVhc3QgdHdvIGRpbWVuc2lvbnMAYXNzZXJ0aW9uIGZhaWxlZDogTj4xCmFsZ19xdWFudCgpIG5lZWRzIGF0IGxlYXN0IHR3byBkaW1lbnNpb25zAGFzc2VydGlvbiBmYWlsZWQ6IHBzRW5jQy0+cHNOTFNGX0NCLT5vcmRlciA9PSBwc0VuY0MtPnByZWRpY3RMUENPcmRlcgBhc3NlcnRpb24gZmFpbGVkOiBkIDw9IGxlbgBhc3NlcnRpb24gZmFpbGVkOiBidWZfbGVuID49IHBzRW5jLT5zQ21uLnBpdGNoX0xQQ193aW5fbGVuZ3RoAGFzc2VydGlvbiBmYWlsZWQ6IE1BWF9GUkFNRV9MRU5HVEggPj0gcHNFbmNDLT5mcmFtZV9sZW5ndGgAYXNzZXJ0aW9uIGZhaWxlZDogKCBwc0VuYy0+c0Ntbi5zdWJmcl9sZW5ndGggKiBwc0VuYy0+c0Ntbi5uYl9zdWJmciApID09IHBzRW5jLT5zQ21uLmZyYW1lX2xlbmd0aABhc3NlcnRpb24gZmFpbGVkOiBlbmNDb250cm9sLT5uQ2hhbm5lbHNJbnRlcm5hbCA9PSAxIHx8IHBzRW5jLT5zdGF0ZV9GeHhbIDEgXS5zQ21uLmlucHV0QnVmSXggPT0gcHNFbmMtPnN0YXRlX0Z4eFsgMSBdLnNDbW4uZnJhbWVfbGVuZ3RoAGFzc2VydGlvbiBmYWlsZWQ6IHBzRW5jLT5zdGF0ZV9GeHhbIDAgXS5zQ21uLmlucHV0QnVmSXggPT0gcHNFbmMtPnN0YXRlX0Z4eFsgMCBdLnNDbW4uZnJhbWVfbGVuZ3RoAGFzc2VydGlvbiBmYWlsZWQ6IE9yZGVyIDw9IGxlbmd0aAAuL2NlbHQvcGl0Y2guaABhc3NlcnRpb24gZmFpbGVkOiBfdGhpcy0+b2ZmcytfdGhpcy0+ZW5kX29mZnM8PV9zaXplAGFzc2VydGlvbiBmYWlsZWQ6IEs+MAphbGdfdW5xdWFudCgpIG5lZWRzIGF0IGxlYXN0IG9uZSBwdWxzZQBhc3NlcnRpb24gZmFpbGVkOiBLPjAKYWxnX3F1YW50KCkgbmVlZHMgYXQgbGVhc3Qgb25lIHB1bHNlAGFzc2VydGlvbiBmYWlsZWQ6IGZpbiAhPSBmb3V0CkluLXBsYWNlIEZGVCBub3Qgc3VwcG9ydGVkAHNpbGsvY2hlY2tfY29udHJvbF9pbnB1dC5jAHNpbGsvc29ydC5jAGNlbHQvY2VsdC5jAGNlbHQva2lzc19mZnQuYwBjZWx0L2N3cnMuYwBzaWxrL2VuY29kZV9wdWxzZXMuYwBzaWxrL2VuY29kZV9pbmRpY2VzLmMAY2VsdC9iYW5kcy5jAHNpbGsvcHJvY2Vzc19OTFNGcy5jAHNpbGsvTFBDX2FuYWx5c2lzX2ZpbHRlci5jAHNpbGsvcmVzYW1wbGVyLmMAY2VsdC9jZWx0X2VuY29kZXIuYwBzcmMvb3B1c19lbmNvZGVyLmMAY2VsdC92cS5jAGNlbHQvcGl0Y2guYwBjZWx0L3JhdGUuYwBzaWxrL2ludGVycG9sYXRlLmMAc2lsay9OTFNGX2VuY29kZS5jAGNlbHQvbGFwbGFjZS5jAHNpbGsvc3RlcmVvX2VuY29kZV9wcmVkLmMAY2VsdC9jZWx0X2xwYy5jAGNlbHQvZW50ZW5jLmMAY2VsdC9lbnRkZWMuYwBzaWxrL2NvbnRyb2xfY29kZWMuYwBzaWxrL05TUV9kZWxfZGVjLmMAc2lsay9OTFNGX1ZRX3dlaWdodHNfbGFyb2lhLmMAc2lsay9yZXNhbXBsZXJfcHJpdmF0ZV9kb3duX0ZJUi5jAHNpbGsvTkxTRl9WUS5jAHNpbGsvTlNRLmMAc2lsay9mbG9hdC9hcHBseV9zaW5lX3dpbmRvd19GTFAuYwBzaWxrL2Zsb2F0L3NvcnRfRkxQLmMAc2lsay9mbG9hdC9maW5kX3BpdGNoX2xhZ3NfRkxQLmMAc2lsay9mbG9hdC9maW5kX3ByZWRfY29lZnNfRkxQLmMAc2lsay9mbG9hdC9zY2h1cl9GTFAuYwBzaWxrL2Zsb2F0L0xQQ19hbmFseXNpc19maWx0ZXJfRkxQLmMAc2lsay9mbG9hdC93YXJwZWRfYXV0b2NvcnJlbGF0aW9uX0ZMUC5jAHNpbGsvZmxvYXQvcGl0Y2hfYW5hbHlzaXNfY29yZV9GTFAuYwBzaWxrL2Zsb2F0L2VuY29kZV9mcmFtZV9GTFAuYwBzaWxrL2Zsb2F0L2J1cmdfbW9kaWZpZWRfRkxQLmMAc2lsay9mbG9hdC9maW5kX0xQQ19GTFAuYwBzaWxrL2VuY19BUEkuYwBzaWxrL1ZBRC5jAHNpbGsvTkxTRjJBLmMAYXNzZXJ0aW9uIGZhaWxlZDogQyplYml0c1tqXTw8QklUUkVTID09IGJpdHNbal0AYXNzZXJ0aW9uIGZhaWxlZDogY29tcGxleGl0eSA8PSBTSUxLX1BFX01BWF9DT01QTEVYAGFzc2VydGlvbiBmYWlsZWQ6IGNvbXBsZXhpdHkgPj0gU0lMS19QRV9NSU5fQ09NUExFWABhc3NlcnRpb24gZmFpbGVkOiBfbmJpdHM8PUVDX1NZTV9CSVRTAGFzc2VydGlvbiBmYWlsZWQ6IGl4WyBuIF1bIDEgXSA8IFNURVJFT19RVUFOVF9TVUJfU1RFUFMAYXNzZXJ0aW9uIGZhaWxlZDogcHNFbmNDLT5wcmVkaWN0TFBDT3JkZXIgPD0gTUFYX0xQQ19PUkRFUgBhc3NlcnRpb24gZmFpbGVkOiBwc0VuY0MtPnBpdGNoRXN0aW1hdGlvbkxQQ09yZGVyIDw9IE1BWF9GSU5EX1BJVENIX0xQQ19PUkRFUgBhc3NlcnRpb24gZmFpbGVkOiBlbmNDb250cm9sICE9IE5VTEwAYXNzZXJ0aW9uIGZhaWxlZDogTCA+PSBLAGFzc2VydGlvbiBmYWlsZWQ6IHN1YmZyX2xlbmd0aCAqIG5iX3N1YmZyIDw9IE1BWF9GUkFNRV9TSVpFAGFzc2VydGlvbiBmYWlsZWQ6IHN0LT5tb2RlID09IE1PREVfSFlCUklEIHx8IGN1cnJfYmFuZHdpZHRoID09IE9QVVNfQkFORFdJRFRIX1dJREVCQU5EAGFzc2VydGlvbiBmYWlsZWQ6IGxhZyA+IDAgfHwgc2lnbmFsVHlwZSAhPSBUWVBFX1ZPSUNFRABhc3NlcnRpb24gZmFpbGVkOiBvcmRlciA+PSAwICYmIG9yZGVyIDw9IFNJTEtfTUFYX09SREVSX0xQQwBhc3NlcnRpb24gZmFpbGVkOiBmbCtmczw9MzI3NjgAYXNzZXJ0aW9uIGZhaWxlZDogRnNfa0h6ID09IDgAYXNzZXJ0aW9uIGZhaWxlZDogcW4gPD0gMjU2AGFzc2VydGlvbiBmYWlsZWQ6IGQ9PTEwIHx8IGQ9PTE2AGFzc2VydGlvbiBmYWlsZWQ6IGZzX2tIeiA9PSA4IHx8IGZzX2tIeiA9PSAxMiB8fCBmc19rSHogPT0gMTYAYXNzZXJ0aW9uIGZhaWxlZDogRnNfa0h6ID09IDggfHwgRnNfa0h6ID09IDEyIHx8IEZzX2tIeiA9PSAxNgBhc3NlcnRpb24gZmFpbGVkOiBkID49IDYAYXNzZXJ0aW9uIGZhaWxlZDogdHlwZU9mZnNldCA+PSAwICYmIHR5cGVPZmZzZXQgPCA2AGFzc2VydGlvbiBmYWlsZWQ6IHBzUmFuZ2VFbmMtPm9mZnMgPD0gMTI3NQBhc3NlcnRpb24gZmFpbGVkOiBzUmFuZ2VFbmNfY29weTIub2ZmcyA8PSAxMjc1AGFzc2VydGlvbiBmYWlsZWQ6IG4gPCAyNQBhc3NlcnRpb24gZmFpbGVkOiBtPT00AGFzc2VydGlvbiBmYWlsZWQ6IHBzRW5jLT5zQ21uLm5iX3N1YmZyID09IDIgfHwgcHNFbmMtPnNDbW4ubmJfc3ViZnIgPT0gNABhc3NlcnRpb24gZmFpbGVkOiBpZmFjdF9RMiA8PSA0AGFzc2VydGlvbiBmYWlsZWQ6IGxlbj49MwBhc3NlcnRpb24gZmFpbGVkOiBpeFsgbiBdWyAwIF0gPCAzAGFzc2VydGlvbiBmYWlsZWQ6IF9uPj0yAGFzc2VydGlvbiBmYWlsZWQ6IGVuY29kZV9MQlJSID09IDAgfHwgdHlwZU9mZnNldCA+PSAyAGFzc2VydGlvbiBmYWlsZWQ6IHdpbl90eXBlID09IDEgfHwgd2luX3R5cGUgPT0gMgBhc3NlcnRpb24gZmFpbGVkOiBzaWduYWxUeXBlID49IDAgJiYgc2lnbmFsVHlwZSA8PSAyAGFzc2VydGlvbiBmYWlsZWQ6IHBzRW5jLT5zQ21uLmx0cF9tZW1fbGVuZ3RoIC0gcHNFbmMtPnNDbW4ucHJlZGljdExQQ09yZGVyID49IHBzRW5jQ3RybC0+cGl0Y2hMWyAwIF0gKyBMVFBfT1JERVIgLyAyAGFzc2VydGlvbiBmYWlsZWQ6IF9mdD4xAGFzc2VydGlvbiBmYWlsZWQ6IF9uPjEAYXNzZXJ0aW9uIGZhaWxlZDogbmJfc3ViZnIgPT0gUEVfTUFYX05CX1NVQkZSID4+IDEAYXNzZXJ0aW9uIGZhaWxlZDogZW5jQ29udHJvbC0+bkNoYW5uZWxzQVBJID09IDEgJiYgZW5jQ29udHJvbC0+bkNoYW5uZWxzSW50ZXJuYWwgPT0gMQBhc3NlcnRpb24gZmFpbGVkOiBjb3VudD4wAGFzc2VydGlvbiBmYWlsZWQ6IF9iaXRzPjAAYXNzZXJ0aW9uIGZhaWxlZDogZnM+MABhc3NlcnRpb24gZmFpbGVkOiBuYkJhbmRzPjAAYXNzZXJ0aW9uIGZhaWxlZDogbGVuPjAAYXNzZXJ0aW9uIGZhaWxlZDogbj4wAGFzc2VydGlvbiBmYWlsZWQ6IF9rPjAAYXNzZXJ0aW9uIGZhaWxlZDogbWF4X3BpdGNoPjAAYXNzZXJ0aW9uIGZhaWxlZDogc3RyaWRlPjAAYXNzZXJ0aW9uIGZhaWxlZDogZW5kPjAAYXNzZXJ0aW9uIGZhaWxlZDogb3ZlcmxhcD49MABhc3NlcnRpb24gZmFpbGVkOiBzdW0+PTAAYXNzZXJ0aW9uIGZhaWxlZDogaXRoZXRhPj0wAGFzc2VydGlvbiBmYWlsZWQ6IHN0LT5zaWduYWxsaW5nPT0wAGFzc2VydGlvbiBmYWlsZWQ6IENvbXBsZXhpdHkgPj0gMCAmJiBDb21wbGV4aXR5IDw9IDEwAGFzc2VydGlvbiBmYWlsZWQ6IGZyYW1lX2xlbmd0aCA9PSAxMiAqIDEwAGFzc2VydGlvbiBmYWlsZWQ6IHN0LT5zaWxrX21vZGUuaW50ZXJuYWxTYW1wbGVSYXRlID09IDE2MDAwAGFzc2VydGlvbiBmYWlsZWQ6IHN0YXJ0X2lkeCA+IDAAYXNzZXJ0aW9uIGZhaWxlZDogblN0YXRlc0RlbGF5ZWREZWNpc2lvbiA+IDAAYXNzZXJ0aW9uIGZhaWxlZDogbGVuZ3RoX2Rfc3JjaCA+IDAAYXNzZXJ0aW9uIGZhaWxlZDogTiA+IDAAYXNzZXJ0aW9uIGZhaWxlZDogTCA+IDAAYXNzZXJ0aW9uIGZhaWxlZDogSyA+IDAAYXNzZXJ0aW9uIGZhaWxlZDogRCA+IDAAYXNzZXJ0aW9uIGZhaWxlZDogTkxTRl9tdV9RMjAgPiAwAGFzc2VydGlvbiBmYWlsZWQ6ICpsYWdJbmRleCA+PSAwAGFzc2VydGlvbiBmYWlsZWQ6IGViaXRzW2pdID49IDAAYXNzZXJ0aW9uIGZhaWxlZDogYml0c1tqXSA+PSAwAGFzc2VydGlvbiBmYWlsZWQ6IGlmYWN0X1EyID49IDAAYXNzZXJ0aW9uIGZhaWxlZDogKGQgJiAxKSA9PSAwAGFzc2VydGlvbiBmYWlsZWQ6ICggbGVuZ3RoICYgMyApID09IDAAYXNzZXJ0aW9uIGZhaWxlZDogKCBMUENfb3JkZXIgJiAxICkgPT0gMABhc3NlcnRpb24gZmFpbGVkOiAoIG9yZGVyICYgMSApID09IDAAYXNzZXJ0aW9uIGZhaWxlZDogKCBzaGFwaW5nTFBDT3JkZXIgJiAxICkgPT0gMABhc3NlcnRpb24gZmFpbGVkOiAoIEQgJiAxICkgPT0gMABhc3NlcnRpb24gZmFpbGVkOiAwAGFzc2VydGlvbiBmYWlsZWQ6ICFjZWx0X2lzbmFuKG5vcm0pAChudWxsKQBhc3NlcnRpb24gZmFpbGVkOiAhY2VsdF9pc25hbih0bXBbMF0pAGFzc2VydGlvbiBmYWlsZWQ6ICFjZWx0X2lzbmFuKGZyZXFbMF0pICYmIChDPT0xIHx8ICFjZWx0X2lzbmFuKGZyZXFbTl0pKQBhc3NlcnRpb24gZmFpbGVkOiBwc0VuY0MtPmluZGljZXMuTkxTRkludGVycENvZWZfUTIgPT0gNCB8fCAoIHBzRW5jQy0+dXNlSW50ZXJwb2xhdGVkTkxTRnMgJiYgIXBzRW5jQy0+Zmlyc3RfZnJhbWVfYWZ0ZXJfcmVzZXQgJiYgcHNFbmNDLT5uYl9zdWJmciA9PSBNQVhfTkJfU1VCRlIgKQBhc3NlcnRpb24gZmFpbGVkOiBwc0VuY0MtPmZyYW1lX2xlbmd0aCA9PSA4ICogc2lsa19SU0hJRlQoIHBzRW5jQy0+ZnJhbWVfbGVuZ3RoLCAzICkAYXNzZXJ0aW9uIGZhaWxlZDogcHNFbmNDLT51c2VJbnRlcnBvbGF0ZWROTFNGcyA9PSAxIHx8IHBzRW5jQy0+aW5kaWNlcy5OTFNGSW50ZXJwQ29lZl9RMiA9PSAoIDEgPDwgMiApAEZhdGFsIChpbnRlcm5hbCkgZXJyb3IgaW4gJXMsIGxpbmUgJWQ6ICVzCgAAAAAAAAAAEQAKABEREQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAARAA8KERERAwoHAAEACQsLAAAJBgsAAAsABhEAAAAREREAQfHYAAshCwAAAAAAAAAAEQAKChEREQAKAAACAAkLAAAACQALAAALAEGr2QALAQwAQbfZAAsVDAAAAAAMAAAAAAkMAAAAAAAMAAAMAEHl2QALAQ4AQfHZAAsVDQAAAAQNAAAAAAkOAAAAAAAOAAAOAEGf2gALARAAQavaAAseDwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhISAEHi2gALDhIAAAASEhIAAAAAAAAJAEGT2wALAQsAQZ/bAAsVCgAAAAAKAAAAAAkLAAAAAAALAAALAEHN2wALAQwAQdnbAAtHDAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGAACdPgBAXj4AwAQ+AIDtPgBAiT4AAAAAAMBMPwAAzT0AQbHcAAs0/wD/AP8A/wD/AP4BAAH/AP4A/QIAAf8A/gD9AwAB/wBAAABsIgAAQg8AABIGAABNAgAA2wBB8NwACxXtAAAAmQAAAEkAAAAeAAAADAAAAAcAQZHdAAsVQAAAk10AAL1wAADteQAAsn0AACR/AEGw3QALRDB1AABwFwAAINH//yDR///9+vTp1LaWg3huYlVIPDEoIBkTDw0LCQgHBgUEAwIBANLQzsvHwbeojmhKNCUbFA4KBgQCAEGA3gAL0gjfybenmIp8b2JYT0Y+ODIsJyMfGxgVEhAODAoIBgQDAgEAvLCbindhQysaCgCld1A9LyMbFA4JBABxPwAAAAAADCM8U2yEnbTO5A8gN01lfZevyeETKkJZcomiuNHmDBkySGF4k6zI3xosRVpyh5+0zeENFjVQaoKctM3kDxksQFpzjqjE3hMYPlJkeJGovtYWHzJPZ3iXqsvjFR0tQWp8lqvE4B4xS2F5jqW60eUTGTRGXXSPpsDbGiI+S2F2kafC2RkhOEZbcY+lxN8VIjNIYXWRq8TeFB0yQ1p1kKjF3RYfMEJfdZKoxN4YITNNdIaetMjgFRxGV2p8larC2RohNUBTdZitzOEbIkFfbIGbrtLhFBpIY3GDmrDI2yIrPU5dcpuxzeUXHTZhfIqjs9HlHiY4WXaBnrLI5xUdMT9Vb46jwd4bME1nhZ6zxNfoHS9KY3yXsMbc7SEqPUxdeZuuz+EdNVdwiJqqvNDjGB40VIOWprrL5SUwQFRodpyxyeZRCwoJCgkKCe8I7wgKCfwIFwnvCEgLFApaCT8JCgniCOII4gjiCJIItwkkCSQJCgkKCQoJJAkkCT8JMgmQDM4KJAkkCQoJ4gitCJ8I1QiSCJwJqgk/CVoJWglaCVoJPwlnCQoJlw3wC08InwjiCOII4gjvCAoJ1QjSDEUMFApaCccIrQifCJIIkghCCAAQBQ+tCDwKPApnCQoJWgk/CRoIagysDD8JrQj5CYIJJAkKCXcIrQgKDaANpgqSCNUInAkyCT8Jnwg1CDIJdAkXCT8JWgl0CXQJdAmcCT8Jww4tDoIJ3wk/CeII4gj8CJ8IAAi2DJkMmQoeC48JFwn8CPwI4ghPCL8M5AzBCvYKjwnVCNUIxwhPCDUIOQulC0kKPwlnCTIJkgjHCMcIQgiZDH0MSQoUCuIIhQjHCK0IrQhdCGoM7gy0CmcJ4gjiCOII7wiSCEIIRQzIDJwJDQjvCMQJPwm3CYIJhQizDdIMCgmMClcKqgk/CVoJJAlPCF8Nzw3eC/AL/AieB60I4gjiCOIITA0mDScIfwo5CzIJdAniCKoJ7AmwDqANngdkClEL3wlaCT8JnAnVCNQLyAy0CkgLtApqCE8I7wi6CMcIbw5JDukHsQdkCowKFArECRcJPwmHDFUNMgkaCEgLSAskCbcJxwh3CAoNJg0eC9wKFwlqCOII7whCCA0IFwn8CIUIdwiFCD8JSQqMCowK+QlnCYIJrQjVCK0IrQgkCXQJLwqMCt4LrAz2CkgLqgkaCPwICgkyCUwJrQhqCE8I7wjECekK6Qo8ChQKPwlcDoEOugguB4UIwQqmCnEK0QmfCOkKWAymCvkJHgvRCYUIWgmtCIUI1LKUgWxgVVJPTT07OTgzMTAtKikoJiQiHx4VDAoDAQD/9fTs6eHZy76wr6GViH1yZltRRzw0KyMcFBMSDAsFALOKjJSXlZmXo3RDUjtcSGRZXABB4OYAC+cBEAAAAABjQiQkIiQiIiIiU0UkNCJ0ZkZERLBmREQiQVVEVCR0jZiLqoS7uNiJhPmouYtoZmRERLLaubmq9Ni7u6r0u7vbimebuLmJdLebmIiE2bi4qqTZq5uL9Km4uaqk2N/aitaPvNqo9I2Im6qoitzbi6TbytiJqLr2uYt0udu5imRkhmRmIkREZESoy93aqKeaiGhGpPariYuJm9rbi//+/e4OAwIBAP/+/NojAwIBAP/++tA7BAIBAP/+9sJHCgIBAP/87LdSCAIBAP/867RaEQIBAP/44KthHgQBAP/+7K1fJQcBAEHQ6AAL7g3///+DBpH//////+xdD2D//////8JTGUfd/////6JJIkKi////0n5JKzmt////yX1HMDqC////pm5JOT5o0v//+3tBN0Rkq/8AAAAAAAAAAPoAAwAGAAMAAwADAAQAAwADAAMAzQEAACAACgAULmQBQC8AAIAwAAAAMwAAQDMAAGAzAAAANAAAUDQAAKA0AAAHFyY2RVVkdIOTorLB0N/vDRkpN0VTYnB/jp2ru8vc7A8VIjM9TlxqfoiYp7nN4fAKFSQyP09fbn6Nna29zd3tERQlMztOWWt7hpakuM3g8AoPIDNDUWBwgY6erb3M3OwIFSUzQU9icX6Km6izwNHaDA8iNz9OV2x2g5Snucvb7BATICQ4T1tsdoiaq7rM3O0LHCs6SllpeIeWpbTE0+LxBhAhLjxLXGt7iZypucfW4QsTHiw5SllpeYeYqbrK2uoMEx0uOUdYZHiElKW2x9jpERcjLjhNXGp7hpinucze7Q4RLTU/S1lrc4SXq7zO3fAJEB0oOEdYZ3eJmqu9zd7tEBMkMDlMV2l2hJanucra7AwRHTZHUV5ofoiVpLbJ3e0PHC8+T2FzgY6bqLTC0N/uCA4eLT5OXm9/j5+vwM/f7xEeMT5PXGt3hJGgrr7M3OsOEyQtPUxbbHmKmqy9zd7uDBIfLTxMW2t7ipqru8zd7A0RHys1RlNncoOVp7nL3O0RFiMqOk5dbn2Lm6q8zuDwCA8iMkNTY3ODkqKywdHg7w0QKUJJVl9vgImWo7fO4fERGSU0P0tcZneEkKCvv9TnEx8xQVNkdYWToa67yNXj8hIfNERYZ3V+ipWjscDP3+8QHS89TFpqd4WTobDB0eDwDxUjMj1JVmFud4GNr8ba7UkObQttC20LbQttC20LbQttC20LbQttC5MLkwttCx4LkAwNDJwL8AvwC8ILwgvCC5MLkwvCC5wLSAseCx4LpgpQD64PpQuHDIcMdgvwCx4LMgysDG0LHgs8CvkJ3AptC7wNfQzCCx8MywtIC20LbQttC20LSAtIC0gLSAtIC8EKvhO+E3YL9Q05DfALDQzpClgMWAycCx4L0QnsCcEKSAtMETUQjArBCpwLwgttCx4LpQvLC20LbQttC20LSAumCiQOywucC/AL8As5C/YK8AuQDOcLpQvbDNsMpQvuDK8LaxSWE+wJCg3GDTkNfQwWDDANpQuMClcKfwrpCh4LcQrZEzYUBxJMEZwJUQvnC4cMYQx/CrQKSAseC+kKHguMCjIMSAuTC20LbQttC20LkwuTC5MLkwttC20LkwuTC5MLahCHDKULHwzCC0gLSAttC5wLOQtkC8sLnAvCC30MOQuwDrAOrAwfDKULSAttC0gLnAt2C+kK6QoeC0gLSAtkCg4Prg+HDDIMrAx2C+cLkwuTCw0MHgvpCukK6QrpChQKBQ/wDx0NvA0WDLQKwgt2CzIMDQweCx4LVwpXCh4L9gobFB4TmQwFD3ENYQxRC1UNew2MChQKcQq0Ch4L9grBCg0QzQ7bDFgMbQtIC0gLbQvpCrQK6Qq0CukKHgtIC/YK2RO+E+cL2Q2sDPALDQyACx8MUQu0CrQKtAoeC+kKPArVENUQLAvfCYcMMA0wDQMMAwwwDfALHgtXChQKpgrBCvALZAv2CkgLtAp/ClELHwxODE4MkAxhDPALwguTCx4LFxEqD20LSAseC0gLHgseC0gLSAtICx4LSAttC0gLHgulC2QLZAulC6UL8AsyDJAMTgzwC8ILnAucC5wLbQu0CoUQNRDuDBMNbQuTC0gLpQulCx4L6Qq0Ch4LHgseC+kK8A+uDx8MwgttC20LbQtIC20LbQseCx4LHgvpCkgL3AoHEt8RYQxxDYcMpQtRC94LMgy0Cn8Kfwp/CrQK6QqMCjUQrRDNDkkOpgrcCkgLSAvCC5wLbQseC38KfwrpCkgLdxDiDcEKHgseC0gLSAtIC20LbQtIC20LbQttC5MLSAs2FDkT1QhoDc0Olw0TDR4L7gyXDU4MUQucCbcJwQptC3sNZQ4yDH0MHQ3nC4cMhwylC5AMDQxtC20LfwrsCYIJpQvCC+kK6Qq0CukKHgucC/ALHwxODE4MTgwfDMILwguACzkLfwqmCtwKwgtoDdkNHQ2sDPALwguTC20LSAseC8sLgAtRC8ILwgucC8sLHwzwC/ALwgtICx4LbQttC0gLUA9/D8ILfQwdDZAM2wzbDJcNeA5xDaYKhQicCRQKLwrhzMm4t6+empmHd3Nxbm1jYl9PRDQyMC0rIB8bEgoDAP/76+bUycS2p6ajl4p8bmhaTkxGRTktIhgVCwYFBAMAr5SgsLKtrqSxrsS2xsC2RD5CPEh1VVp2iJeOoI6bAEHH9gALwAIBZGZmREQkImCka565tLmLZkBCJCIiAAEg0IuNv5i5m2hgq2imZmZmhAEAAAAAEBAAUG1Oa7mLZ2XQ1I2LrZl7ZyQAAAAAAAABMAAAAAAAACBEh3t3d2dFYkRneHZ2ZkdihoiduLaZi4bQqPhLvY95ayAxIiIiABEC0uuLe7mJaYZih2i2ZLerhmRGREZCQiKDQKZmRCQCAQCGpmZEIiJChNT2notra1dmZNt9eol2Z4Ryh4lpq2oyIqTWjY+5l3lnwCIAAAAAAAHQbUq7hvmfiWZumnZXZXdlAAIAJCRCRCNgpGZkJAACIaeKrmZkVAICZGt4dyTFGAD//v30DAMCAQD//vzgJgMCAQD//vvROQQCAQD//vTDRQQCAQD/++i4VAcCAQD//vC6Vg4CAQD//u+yWx4FAQD/+OOxZBMCAQBBkPkAC8QF////nASa///////jZg9c///////VUxhI7P////+WTCE/1v///755TSs3uf////WJRys7i/////+DQjJCa8L//6Z0TDc1ff//AAAAAAAAAABkAAMAKAADAAMAAwAFAA4ADgAKAAsAAwAIAAkABwADAFsBAAAgABAAZiarAeA0AADgNgAA4DoAACA7AABAOwAAQDwAAJA8AADgPAAAAAAAAFzKvti235rinOZ47Hr0zPw0A4YLiBNkGWYdSiBCJ6Q1+ff29fTq0srJyMWuUjs4NzYuFgwLCgkHAEAAy5YA18OmfW5SAAAAAGs9AABuPQAAeACAQADongoA5gDz3cC1AGQA8AAgAGQAzTwAMAAgq1UAwIBAAM2aZjMA1auAVSsA4MCggGBAIABkKBAHAwEAAApn8g5WzeQdCmfyDnVSggxZmgQZdVKCDEYRMQrtA2IURhExCtoC1wf5xq0P2gLXByK2UgXa+qQKIrZSBQAAAABG8y4eK+NLDh9mgBgcLB0K2mFIEu2c9AbsMBML45ClBO2kHQIK32sDAAAAAAAAAAAqr9XJz/9AABEAY/9hARD+owAnK71W2f8GAFsAVv+6ABcAgPzAGNhN7f/c/2YAp//o/0gBSfwICiU+AAAAAAAAh8c9yUAAgACG/yQANgEA/UgCMyRFRQwAgAASAHL/IAGL/5/8GxB7OAAAAAAAAAAAaAINyPb/JwA6ANL/rP94ALgAxf7j/QQFBBVAIwAAAADmPsbE8/8AABQAGgAFAOH/1f/8/0EAWgAHAGP/CP/U/1ECLwY0CscMAAAAAAAAAADkVwXFAwDy/+z/8f8CABkAJQAZAPD/uf+V/7H/MgAkAW8C1gMIBbgFAAAAAAAAAACUa2fEEQAMAAgAAQD2/+r/4v/g/+r/AwAsAGQAqADzAD0BfQGtAccBE/WV5lkS8ykfBlQgAEHg/gALlwG9AKj9aQJnd3UAYf/S+wh0NADdAKj2dG78/xEC6vLlZtD/9gKM8KVdsP+JA3XvBlOd/8wDgu9mR5X/xwOL8Cc7mf+AA2Hyri6l/wUDz/ReIrn/YwKh95gW0v+pAaH6tAsGAAMABwMAAQoAAgYSCgwEAAIAAAAJBAcEAAMMBwcAAOBwLA8DAgEA/u3AhEYXBAD//OKbPQsCAEGAgAELM/r16stHMiomIyEfHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAs2MARzgrHhUMBgBBwIABC0THpZB8bWBURz0zKiAXDwgA8eHTx7uvpJmOhHtyaWBYUEhAOTIsJiEdGBQQDAkFAgAsQAAAQEAAAFBAAAAPg4qKm5utrQBBkIEBC/QCRV1zdoOKjYqWlpuWm6CmoIOAho2NjZGRkZabm5uboKCgoKamra22wLbAwMDNwM3gfEAAAJBAAACgQAAAAAAAAAQGGAcFAAACAAAMHCkN/PcPKhkOAf4+Kff2JUH8A/oEQgf4EA4m/SEAAAAAAAAAAA0WJxcM/yRAG/r5CjcrEQEBCAEBBvVKNff0N0z0CP0DXRv8Gic7A/gCAE0LCfgWLPoHKAkaAwn5FGX5BAP4KhoA8SFEAhf+Ny7+DwP/FRAp+hs9JwX1KlgEAf48QQb8//tJOAH3E14d9wAMYwYECO1mLvMDAg0DAgnrVEju9S5o6ggSJjAXAPBGU+sLBfV1Fvj6F3X0AwP4XxwE9g9NPPH/BHwC/AMmVBjnAg0qDR8V/Dgu//8jT/MT+UFY9/IUBFEx4xQASwPvBfcsXPgB/RZFH/pfKfQFJ0MQ/AEA+ng33PMsegToUQULAwcCAAkKWNBAAAAAQQAAUEEAAC4CWlddW1JiAEGQhAELQ214dgxxc3V3YztXbz9vcFB+fH18gXl+F4R/f39+f3qFgoZldneRflZ8eHt3qq1rbfxBAAAQQgAAIEIAAAgQIAgKDBAAQeCEAQuzAX0zGhIPDAsKCQgHBgUEAwIBAMZpLRYPDAsKCQgHBgUEAwIBANWidFM7KyAYEg8MCQcGBQMCAO+7dDscEAsKCQgHBgUEAwIBAPrlvIdWMx4TDQoIBgUEAwIBAPnr1bmcgGdTQjUqIRoVEQ0KAP75686kdk0uGxAKBwUEAwIBAP/9+e/cv5x3VTklFw8KBgQCAP/9+/bt38uzmHxiSzcoHRUPAP/+/ffcompDKhwSDAkGBAMCAEGghgELogEfOWugzc3///////////////9FL0Nvps3///////////////9SSk9fbYCRoK3Nzc3g///g/+B9SjtFYY22//////////////+tc1VJTFxzka3N4OD///////+mhnFmZWZrdn2KkZumtsDAzZbgtoZlU09VYXiRrc3g////////4MCWeGVcWV1mdoagtsDg4OD/4OC2m4Z2bWhmam92g5GgrYMAQdCHAQsR8b6yhFdKKQ4A38GdjGo5JxIAQfCHAQsSg0qNT1CKX2iGX2NbfV1Me3N7AEGQiAELlwGAANYqAOuAFQD0uEgLAPjWgCoHAPjhqlAZBQD77MZ+NhIDAPru059SIw8FAPrny6iAWDUZBgD87ti5lGxHKBIEAP3z4cemgFo5Hw0DAP726dS3k21JLBcKAgD/+vDfxqaAWjohEAYBAP/79OfStZJuSy4ZDAUBAP/9+O7dxKSAXDwjEggDAQD//fny5dC0km5MMBsOBwMBAEGwiQELlwGBAM8yAOyBFAD1uUgKAPnVgSoGAPriqVcbBAD76cKCPhQEAPrsz6BjLxEDAP/w2baDUSkLAQD//unJn2s9FAIBAP/56c6qgFYyFwcBAP/67tm6lGxGJxIGAQD//PPiyKaAWjgeDQQBAP/89efRtJJuTC8ZCwQBAP/9+O3bwqOAXT4lEwgDAQD//vrx4s2xkW9PMx4PBgIBAEHQigELlwGBAMs2AOqBFwD1uEkKAPrXgSkFAPzorVYYAwD98MiBOA8CAP302aReJgoBAP314r2ERxsHAQD99ufLn2k4FwYBAP/469WzhVUvEwUBAP/+893Cn3VGJQwCAQD//vjq0KuAVTAWCAIBAP/++vDcvZVrQyQQBgIBAP/++/PjyaaAWjcdDQUCAQD//vz26tW3k21JKxYKBAIBAEHwiwELlwGCAMg6AOeCGgD0uEwMAPnWgisGAPzorVcYAwD98cuDOA4CAP723adeIwgBAP756MGCQRcFAQD/++/TomMtDwQBAP/789+6g0ohCwMBAP/89ebKnmk5GAgCAQD//ffr1rOEVCwTBwIBAP/++vDfxJ9wRSQPBgIBAP/+/fXn0bCIXTcbCwMCAQD//v38793CnnVMKhIEAwIBAEGSjQELDwIFCQ4UGyMsNkFNWmh3hwBBsI0BCyr+MUNNUl1jxgsSGB8kLf8uQk5XXmjQDhUgKjNC/15obXBzdvg1RVBYX2YAQeiNAQs+AwAAAAIAAAADAAAAAgAAAAUAAAACAAAAAwAAAAIAAAADAAAAAgAAAAUAAAACAAAAAwAAAAIAAAAAAQAAAAEAQbKOAQv5AQH/Af8C/gL+A/0AAQAB/wL/Av4D/gP9B/4HAAAAAAAC////AAABAQABAAEAAAAAAAEAAAAAAAEAAAABAAAAAAD/AgEAAQEAAP//AAAAAAAAAf8AAf8A/wH+Av7+Av0CA/38A/wEBPsF+vsG+QYFCPcAAAEAAAAAAAAA/wEAAAH/AAH//wH/AgH/Av7+Av4CAgP9AAEAAAAAAAABAAEAAAH/AQAAAgH/Av//Av8CAv8D/v7+AwABAAABAAH/Av8C/wID/gP+/gQE/QX9/Ab8BgX7CPr7+QkAAAAAAAAAAPsI/wb/BvwK+gr+Bv8G+wr3DP0H/gf5DRAYIgBBtpABC4wi4D8AAAAAAADgv109f2aeoOY/AAAAAACIOT1EF3X6UrDmPwAAAAAAANg8/tkLdRLA5j8AAAAAAHgovb921N3cz+Y/AAAAAADAHj0pGmU8st/mPwAAAAAAANi84zpZmJLv5j8AAAAAAAC8vIaTUfl9/+Y/AAAAAADYL72jLfRmdA/nPwAAAAAAiCy9w1/s6HUf5z8AAAAAAMATPQXP6oaCL+c/AAAAAAAwOL1SgaVImj/nPwAAAAAAwAC9/MzXNb1P5z8AAAAAAIgvPfFnQlbrX+c/AAAAAADgAz1IbauxJHDnPwAAAAAA0Ce9OF3eT2mA5z8AAAAAAADdvAAdrDi5kOc/AAAAAAAA4zx4AetzFKHnPwAAAAAAAO28YNB2CXux5z8AAAAAAEAgPTPBMAHtwec/AAAAAAAAoDw2hv9iatLnPwAAAAAAkCa9O07PNvPi5z8AAAAAAOACvejDkYSH8+c/AAAAAABYJL1OGz5UJwToPwAAAAAAADM9GgfRrdIU6D8AAAAAAAAPPX7NTJmJJeg/AAAAAADAIb3QQrkeTDboPwAAAAAA0Ck9tcojRhpH6D8AAAAAABBHPbxbnxf0V+g/AAAAAABgIj2vkUSb2WjoPwAAAAAAxDK9laMx2cp56D8AAAAAAAAjvbhlitnHiug/AAAAAACAKr0AWHik0JvoPwAAAAAAAO28I6IqQuWs6D8AAAAAACgzPfoZ1roFvug/AAAAAAC0Qj2DQ7UWMs/oPwAAAAAA0C69TGYIXmrg6D8AAAAAAFAgvQd4FZmu8eg/AAAAAAAoKD0OLCjQ/gLpPwAAAAAAsBy9lv+RC1sU6T8AAAAAAOAFvfkvqlPDJek/AAAAAABA9TxKxs2wNzfpPwAAAAAAIBc9rphfK7hI6T8AAAAAAAAJvctSyMtEWuk/AAAAAABoJT0hb3aa3WvpPwAAAAAA0Da9Kk7en4J96T8AAAAAAAABvaMjeuQzj+k/AAAAAAAALT0EBspw8aDpPwAAAAAApDi9if9TTbuy6T8AAAAAAFw1PVvxo4KRxOk/AAAAAAC4Jj3FuEsZdNbpPwAAAAAAAOy8jiPjGWPo6T8AAAAAANAXPQLzB41e+uk/AAAAAABAFj1N5V17ZgzqPwAAAAAAAPW89riO7Xoe6j8AAAAAAOAJPScuSuybMOo/AAAAAADYKj1dCkaAyULqPwAAAAAA8Bq9myU+sgNV6j8AAAAAAGALPRNi9IpKZ+o/AAAAAACIOD2nszATnnnqPwAAAAAAIBE9jS7BU/6L6j8AAAAAAMAGPdL8eVVrnuo/AAAAAAC4Kb24bzUh5bDqPwAAAAAAcCs9gfPTv2vD6j8AAAAAAADZPIAnPDr/1eo/AAAAAAAA5Dyj0lqZn+jqPwAAAAAAkCy9Z/Mi5kz76j8AAAAAAFAWPZC3jSkHDus/AAAAAADULz2piZpsziDrPwAAAAAAcBI9SxpPuKIz6z8AAAAAAEdNPedHtxWERus/AAAAAAA4OL06WeWNclnrPwAAAAAAAJg8asXxKW5s6z8AAAAAANAKPVBe+/J2f+s/AAAAAACA3jyySSfyjJLrPwAAAAAAwAS9AwahMLCl6z8AAAAAAHANvWZvmrfguOs/AAAAAACQDT3/wUuQHszrPwAAAAAAoAI9b6Hzw2nf6z8AAAAAAHgfvbgd11vC8us/AAAAAACgEL3pskFhKAbsPwAAAAAAQBG94FKF3ZsZ7D8AAAAAAOALPe5k+tkcLew/AAAAAABACb0v0P9fq0DsPwAAAAAA0A69Ff36eEdU7D8AAAAAAGY5PcvQVy7xZ+w/AAAAAAAQGr22wYiJqHvsPwAAAACARVi9M+cGlG2P7D8AAAAAAEgavd/EUVdAo+w/AAAAAAAAyzyUkO/cILfsPwAAAAAAQAE9iRZtLg/L7D8AAAAAACDwPBLEXVUL3+w/AAAAAABg8zw7q1tbFfPsPwAAAAAAkAa9vIkHSi0H7T8AAAAAAKAJPfrICCtTG+0/AAAAAADgFb2Fig0Ihy/tPwAAAAAAKB09A6LK6shD7T8AAAAAAKABPZGk+9wYWO0/AAAAAAAA3zyh5mLodmztPwAAAAAAoAO9ToPJFuOA7T8AAAAAANgMvZBg/3Fdle0/AAAAAADA9DyuMtsD5qntPwAAAAAAkP88JYM61ny+7T8AAAAAAIDpPEW0AfMh0+0/AAAAAAAg9by/BRxk1eftPwAAAAAAcB297Jp7M5f87T8AAAAAABQWvV59GWtnEe4/AAAAAABICz3no/UURibuPwAAAAAAzkA9XO4WOzM77j8AAAAAAGgMPbQ/i+cuUO4/AAAAAAAwCb1obWckOWXuPwAAAAAAAOW8REzH+1F67j8AAAAAAPgHvSa3zXd5j+4/AAAAAABw87zokKSir6TuPwAAAAAA0OU85Mp8hvS57j8AAAAAABoWPQ1oji1Iz+4/AAAAAABQ9TwUhRiiquTuPwAAAAAAQMY8E1ph7hv67j8AAAAAAIDuvAZBthycD+8/AAAAAACI+rxjuWs3KyXvPwAAAAAAkCy9dXLdSMk67z8AAAAAAACqPCRFblt2UO8/AAAAAADw9Lz9RIh5MmbvPwAAAAAAgMo8OL6crf177z8AAAAAALz6PII8JALYke8/AAAAAABg1LyOkJ6BwafvPwAAAAAADAu9EdWSNrq97z8AAAAAAODAvJRxjyvC0+8/AAAAAIDeEL3uIypr2envPwAAAAAAQ+48AAAAAAAA8D8AAAAAAAAAAL68WvoaC/A/AAAAAABAs7wDM/upPRbwPwAAAAAAFxK9ggI7FGgh8D8AAAAAAEC6PGyAdz6aLPA/AAAAAACY7zzKuxEu1DfwPwAAAAAAQMe8iX9u6BVD8D8AAAAAADDYPGdU9nJfTvA/AAAAAAA/Gr1ahRXTsFnwPwAAAAAAhAK9lR88Dgpl8D8AAAAAAGDxPBr33SlrcPA/AAAAAAAkFT0tqHIr1HvwPwAAAAAAoOm80Jt1GEWH8D8AAAAAAEDmPMgHZva9kvA/AAAAAAB4AL2D88bKPp7wPwAAAAAAAJi8MDkfm8ep8D8AAAAAAKD/PPyI+WxYtfA/AAAAAADI+ryKbORF8cDwPwAAAAAAwNk8FkhyK5LM8D8AAAAAACAFPdhdOSM72PA/AAAAAADQ+rzz0dMy7OPwPwAAAAAArBs9pqnfX6Xv8D8AAAAAAOgEvfDS/q9m+/A/AAAAAAAwDb1LI9coMAfxPwAAAAAAUPE8W1sS0AET8T8AAAAAAADsPPkqXqvbHvE/AAAAAAC8Fj3VMWzAvSrxPwAAAAAAQOg8fQTyFKg28T8AAAAAANAOvektqa6aQvE/AAAAAADg6Dw4MU+TlU7xPwAAAAAAQOs8cY6lyJha8T8AAAAAADAFPd/DcVSkZvE/AAAAAAA4Az0RUn08uHLxPwAAAAAA1Cg9n7uVhtR+8T8AAAAAANAFvZONjDj5ivE/AAAAAACIHL1mXTdYJpfxPwAAAAAA8BE9p8tv61uj8T8AAAAAAEgQPeOHE/iZr/E/AAAAAAA5R71UXQSE4LvxPwAAAAAA5CQ9QxwolS/I8T8AAAAAACAKvbK5aDGH1PE/AAAAAACA4zwxQLRe5+DxPwAAAAAAwOo8ONn8IlDt8T8AAAAAAJABPffNOITB+fE/AAAAAAB4G72PjWKIOwbyPwAAAAAAlC09Hqh4Nb4S8j8AAAAAAADYPEHdfZFJH/I/AAAAAAA0Kz0jE3mi3SvyPwAAAAAA+Bk952F1bno48j8AAAAAAMgZvScUgvsfRfI/AAAAAAAwAj0CprJPzlHyPwAAAAAASBO9sM4ecYVe8j8AAAAAAHASPRZ94mVFa/I/AAAAAADQET0P4B00DnjyPwAAAAAA7jE9PmP14d+E8j8AAAAAAMAUvTC7kXW6kfI/AAAAAADYE70J3x/1nZ7yPwAAAAAAsAg9mw7RZoqr8j8AAAAAAHwivTra2tB/uPI/AAAAAAA0Kj35Gnc5fsXyPwAAAAAAgBC92QLkpoXS8j8AAAAAANAOvXkVZB+W3/I/AAAAAAAg9LzPLj6pr+zyPwAAAAAAmCS9Ioi9StL58j8AAAAAADAWvSW2MQr+BvM/AAAAAAA2Mr0Lpe7tMhTzPwAAAACA33C9uNdM/HAh8z8AAAAAAEgivaLpqDu4LvM/AAAAAACYJb1mF2SyCDzzPwAAAAAA0B49J/rjZmJJ8z8AAAAAAADcvA+fkl/FVvM/AAAAAADYML25iN6iMWTzPwAAAAAAyCI9Oao6N6dx8z8AAAAAAGAgPf50HiMmf/M/AAAAAABgFr042AVtrozzPwAAAAAA4Aq9wz5xG0Ca8z8AAAAAAHJEvSCg5TTbp/M/AAAAAAAgCD2Vbuy/f7XzPwAAAAAAgD498qgTwy3D8z8AAAAAAIDvPCLh7UTl0PM/AAAAAACgF727NBJMpt7zPwAAAAAAMCY9zE4c33Ds8z8AAAAAAKZIvYx+rARF+vM/AAAAAADcPL27oGfDIgj0PwAAAAAAuCU9lS73IQoW9D8AAAAAAMAePUZGCSf7I/Q/AAAAAABgE70gqVDZ9TH0PwAAAAAAmCM967mEP/o/9D8AAAAAAAD6PBmJYWAITvQ/AAAAAADA9rwB0qdCIFz0PwAAAAAAwAu9FgAd7UFq9D8AAAAAAIASvSYzi2ZtePQ/AAAAAADgMD0APMG1oob0PwAAAAAAQC29BK+S4eGU9D8AAAAAACAMPXLT1/Aqo/Q/AAAAAABQHr0BuG3qfbH0PwAAAAAAgAc94Sk21dq/9D8AAAAAAIATvTLBF7hBzvQ/AAAAAACAAD3b3f2Zstz0PwAAAAAAcCw9lqvYgS3r9D8AAAAAAOAcvQItnXay+fQ/AAAAAAAgGT3BMUV/QQj1PwAAAAAAwAi9KmbPotoW9T8AAAAAAAD6vOpRP+h9JfU/AAAAAAAISj3aTp1WKzT1PwAAAAAA2Ca9Gqz29OJC9T8AAAAAAEQyvduUXcqkUfU/AAAAAAA8SD1rEendcGD1PwAAAAAAsCQ93im1Nkdv9T8AAAAAAFpBPQ7E4tsnfvU/AAAAAADgKb1vx5fUEo31PwAAAAAACCO9TAv/Jwic9T8AAAAAAOxNPSdUSN0Hq/U/AAAAAAAAxLz0eqj7Ebr1PwAAAAAACDA9C0ZZiibJ9T8AAAAAAMgmvT+OmZBF2PU/AAAAAACaRj3hIK0Vb+f1PwAAAAAAQBu9yuvcIKP29T8AAAAAAHAXPbjcdrnhBfY/AAAAAAD4Jj0V983mKhX2PwAAAAAAAAE9MVU6sH4k9j8AAAAAANAVvbUpGR3dM/Y/AAAAAADQEr0Tw8w0RkP2PwAAAAAAgOq8+o68/rlS9j8AAAAAAGAovZczVYI4YvY/AAAAAAD+cT2OMgjHwXH2PwAAAAAAIDe9fqlM1FWB9j8AAAAAAIDmPHGUnrH0kPY/AAAAAAB4Kb0AIP4f9h/qH9gfwh+oH4gfYh86Hwof2B6gHmIeIh7cHZAdQh3uHJYcOhzYG3IbChucGioatBk6GbwYPBi2Fy4XoBYQFn4V6BROFLATEBNuEsgRHhF0EMYPFg9kDq4N+AxADIQLyAoKCkoJigjGBwIHPgZ4BbIE6gMiA1oCkgHKAAAANv9u/qb93vwW/E77iPrC+f74Ovh297b29vU49Xz0wPMI81LynPHq8DrwjO/i7jjuku3w7FDssusY64Lq8Olg6dLoSujE50TnxuZM5tblZOX25I7kKOTG42rjEuO+4nDiJOLe4Z7hYOEo4fbgxuCe4HjgWOA+4CjgFuAK4ALgAOAAQdGyAQuKBQ8IBwQLDAMCDQoFBgkOAQAJBgMEBQgBAgcAAAAAAAAADyc0PURKT1RYXF9jZmlsb3J1d3p8foGDhYeJi46PkZOVl5mbnZ6goqOlp6iqq62usLGztLa3ubq7vb7AwcLExcfIycvMzc/Q0dPU1dfY2dvc3d/g4ePk5ufo6uvs7u/x8vP19vj5+vz9/wAAAAAAAAAcKzQ7QUZKTlFVV1pdX2JkZmlrbW9xc3R2eHp7fX+AgoOFhoiJioyNj5CRk5SVl5iZmpydnp+goqOkpaanqKmrrK2ur7CxsrO0tba3uLm6u7y8vb6/wMHCw8TFxsfIycrLy8zNzs/Q0dLT1NXW1tfY2drb3N3e3+Dg4eLj5OXm5+jp6uvs7O3u7/Dx8vP09fb3+Pn6+/z9/v8AAAAAAAAAAAgdKTE4PkJGSk1QU1ZYW11fYWNlZ2lrbG5wcXN0dnd5ent9fn+BgoOEhoeIiYqMjY6PkJGSk5SVlpeYmZqcnZ6fn6ChoqOkpaanqKmqq6usra6vsLGxsrO0tbW2t7i5ubq7vL29vr/AwMHCw8PExcbGx8jIycrLy8zNzs7P0NHR0tPT1NXW1tfY2Nna29vc3d3e3+Dg4eLi4+Tl5ebn6Ojp6urr7O3t7u/w8PHy8/P09fb29/j5+fr7/P3/AIC7AAB4AAAAFQAAABUAAAAAmlk/AAAAAAAAgD8AAIA/sFsAAAMAAAAIAAAAeAAAAAsAAADgWwAA0FwAAABdAACABwAAAwAAAOBeAAAAkwAAMJQAAOiUAAAgXwAAiAEAAEB7AAAgfAAAsH0AAAAAAAAAAAEAAgADAAQABQAGAAcACAAKAAwADgAQABQAGAAcACIAKAAwADwATgBkAEH1twEL0gFaUEtFPzgxKCIdFBIKAAAAAAAAAABuZFpUTkdBOjMtJyAaFAwAAAAAAAB2bmddVlBLRkE7NS8oHxcPBAAAAAB+d3BoX1lTTkhCPDYvJyAZEQwBAACGf3hyZ2FbVU5IQjw2LykjHRcQCgGQiYJ8cWtlX1hSTEZAOTMtJyEaDwGYkYqEe3VvaWJcVlBKQz03MSskFAGim5SOhX95c2xmYFpUTUdBOzUuHgGspZ6Yj4mDfXZwamReV1FLRT84LRTIyMjIyMjIyMbBvLeyraijnpmUgWgAQeC5AQufBAgACAAIAAgAEAAQABAAFQAVABgAHQAiACQAAAAAAAAAahyNOFK7HjoIadw6gu1XO4ljsjsDKgU8MNw5PLQ+dzwco5480fLFPP6G8TybqxA9Ba0qPYTCRj1T5mQ9EYmCPYefkz3LsqU90b64PTq/zD1Ur+E9FIr3PQ4lBz7Z9BI+XzEfPmjXKz6K4zg+MFJGPpQfVD6/R2I+jsZwPrCXfz5SW4c+YA+PPpjllj55254+cO6mPtgbrz77YLc+Ebu/PkYnyD63otA+eCrZPpS74T4MU+o+3u3yPgaJ+z6+EAI/H1oGPySfCj9Q3g4/KxYTP0FFFz8lahs/c4MfP86PIz/mjSc/dHwrPz9aLz8ZJjM/5942P5mDOj8zEz4/xYxBP3fvRD9/Okg/J21LP86GTj/lhlE/8WxUP444Vz9p6Vk/RX9cP/r5Xj9zWWE/r51jP8HGZT/P1Gc/EchpP9Kgaz9uX20/UARvP/SPcD/mAnI/vV1zPx+hdD+/zXU/V+R2P7Dldz+X0ng/46t5P3Nyej8nJ3s/58p7P51efD8143w/nFl9P73CfT+GH34/3nB+P6u3fj/P9H4/Jil/P4ZVfz++en8/lpl/P8yyfz8Ux38/HNd/P4Ljfz/d7H8/tvN/P4r4fz/I+38/1v1/Pwf/fz+l/38/6P9/P/3/fz8AAIA/4AEAAIeICDv/////BQBgAAMAIAAEAAgAAgAEAAQAAQBBjL4BCwZgfgAAIIIAQaC+AQvJOP//fz+O/38/av5/P5P8fz8H+n8/yPZ/P9byfz8w7n8/1uh/P8jifz8H3H8/k9R/P2vMfz+Pw38/ALp/P72vfz/HpH8/HZl/P8CMfz+wf38/7HF/P3Zjfz9LVH8/bkR/P94zfz+aIn8/oxB/P/r9fj+d6n4/jdZ+P8vBfj9WrH4/LpZ+P1N/fj/GZ34/hk9+P5Q2fj/vHH4/mAJ+P4/nfT/Ty30/Zq99P0aSfT90dH0/8VV9P7w2fT/VFn0/PPZ8P/LUfD/2snw/SZB8P+tsfD/bSHw/GyR8P6n+ez+H2Hs/tLF7PzCKez/8YXs/Fzl7P4IPez895Xo/SLp6P6KOej9NYno/SDV6P5QHej8w2Xk/Hap5P1p6eT/pSXk/yBh5P/nmeD97tHg/ToF4P3NNeD/qGHg/suN3P82tdz86d3c/+T93PwoIdz9uz3Y/JZZ2Py9cdj+MIXY/POZ1P0CqdT+XbXU/QjB1P0HydD+Us3Q/O3R0Pzc0dD+H83M/LLJzPyZwcz92LXM/GupyPxSmcj9kYXI/ChxyPwXWcT9Xj3E/AEhxP///cD9Vt3A/Am5wPwYkcD9i2W8/FY5vPyBCbz+E9W4/P6huP1Nabj/AC24/hrxtP6VsbT8dHG0/78psPxt5bD+hJmw/gNNrP7t/az9QK2s/QNZqP4yAaj8yKmo/NdNpP5N7aT9NI2k/ZMpoP9hwaD+oFmg/1btnP2BgZz9IBGc/j6dmPzNKZj827GU/l41lP1cuZT93zmQ/9W1kP9QMZD8Sq2M/sUhjP7DlYj8QgmI/0R1iP/O4YT93U2E/XO1gP6SGYD9OH2A/W7dfP8tOXz+e5V4/1XteP3ARXj9upl0/0jpdP5rOXD/GYVw/WfRbP1GGWz+uF1s/cqhaP504Wj8uyFk/J1dZP4flWD9Pc1g/fwBYPxeNVz8YGVc/gqRWP1YvVj+TuVU/OkNVP0vMVD/HVFQ/rtxTPwFkUz+/6lI/6XBSP3/2UT+Ce1E/8v9QP8+DUD8aB1A/0olPP/oLTz+QjU4/lA5OPwmPTT/tDk0/QY5MPwUNTD87i0s/4QhLP/mFSj+DAko/f35JP+75SD/PdEg/JO9HP+1oRz8p4kY/2lpGPwDTRT+bSkU/rMFEPzI4RD8vrkM/oiNDP42YQj/vDEI/yIBBPxr0QD/lZkA/KNk/P+VKPz8bvD4/zCw+P/ecPT+dDD0/vns8P1zqOz91WDs/CsY6Px0zOj+tnzk/uws5P0d3OD9R4jc/2kw3P+O2Nj9rIDY/dIk1P/3xND8HWjQ/k8EzP6AoMz8wjzI/QvUxP9haMT/xvzA/jiQwP6+ILz9V7C4/gU8uPzKyLT9pFC0/J3YsP2vXKz83OCs/i5gqP2f4KT/MVyk/urYoPzIVKD8zcyc/v9AmP9YtJj95iiU/p+YkP2FCJD+pnSM/ffgiP99SIj/PrCE/TQYhP1tfID/4tx8/JRAfP+JnHj8wvx0/EBYdP4FsHD+Ewhs/GhgbP0NtGj8Awhk/URYZPzZqGD+xvRc/wRAXP2djFj+jtRU/dgcVP+FYFD/kqRM/f/oSP7NKEj+AmhE/5+kQP+g4ED+Ehw8/u9UOP44jDj/+cA0/Cr4MP7MKDD/6Vgs/36IKP2PuCT+GOQk/SYQIP6zOBz+vGAc/VGIGP5urBT+D9AQ/Dz0EPz2FAz8PzQI/hhQCP6FbAT9hogA/j9H/Pqdd/j4O6fw+wnP7Psb9+T4bh/g+wQ/3PrqX9T4GH/Q+qKXyPp4r8T7ssO8+kTXuPpC57D7oPOs+mr/pPqlB6D4Vw+Y+30PlPgjE4z6RQ+I+fMLgPshA3z54vt0+jDvcPga42j7mM9k+Lq/XPt8p1j75o9Q+fR3TPm6W0T7MDtA+l4bOPtL9zD59dMs+merJPidgyD4o1cY+n0nFPoq9wz7sMMI+xqPAPhkWvz7mh70+Lfm7PvFpuj4y2rg+8Um3Pi+5tT7uJ7Q+L5ayPvIDsT45ca8+BN6tPlZKrD4vtqo+kCGpPnqMpz7v9qU+72CkPnzKoj6XM6E+QJyfPnoEnj5EbJw+odOaPpE6mT4WoZc+MAeWPuFslD4p0pI+CzeRPoebjz6e/40+UWOMPqLGij6RKYk+IIyHPlDuhT4iUIQ+l7GCPrASgT7e5n4+qad7PsNneD4vJ3U+7uVxPgSkbj5zYWs+PB5oPmLaZD7olWE+z1BePhoLWz7MxFc+5n1UPms2UT5d7k0+v6VKPpJcRz7aEkQ+l8hAPs59PT6AMjo+ruY2Pl2aMz6NTTA+QgAtPn2yKT5CZCY+kRUjPm7GHz7bdhw+2iYZPm3WFT6YhRI+WzQPPrriCz63kAg+VD4FPpTrAT7wMP09Bor2PXHi7z0zOuk9T5HiPc/n2z21PdU9A5POPcDnxz3yO8E9nI+6PcPisz1sNa09m4emPVXZnz2fKpk9fnuSPfbLiz0LHIU9h9d8PUZ2bz1dFGI91rFUPblORz0Q6zk95YYsPUAiHz0svRE9slcEPbXj7TxgF9M8dkq4PAt9nTwyr4I8+sFPPP4kGjwqD8k7mac7Oy591rnSRnG7q97ju6aMJ7yBKV284WKJvKAwpLzs/b68s8rZvOCW9LwxsQe9kxYVvYx7Ir0T4C+9HkQ9vaWnSr2dCli9/mxlvb7Ocr3qF4C9G8iGve13jb1cJ5S9Y9aavf2Eob0mM6i92eCuvRGOtb3KOry9/ubCvaqSyb3IPdC9VOjWvUqS3b2kO+S9XeTqvXKM8b3dM/i9mtr+vVLAAr78Ega+R2UJvjK3DL66CBC+3VkTvpiqFr7q+hm+0EodvkeaIL5O6SO+4TcnvgCGKr6m0y2+0yAxvoNtNL61uTe+ZQU7vpNQPr46m0G+WuVEvvAuSL75d0u+dMBOvl0IUr6zT1W+c5ZYvpzcW74qIl++G2divm2rZb4f72i+LDJsvpR0b75UtnK+avd1vtM3eb6Nd3y+lrZ/vnV6gb5FGYO+ubeEvtBVhr6I84e+4ZCJvtoti75wyoy+pGaOvnQCkL7fnZG+5DiTvoHTlL62bZa+gQeYvuKgmb7XOZu+X9Kcvnlqnr4jAqC+XpmhviYwo759xqS+YFymvs7xp77Ghqm+RxurvlCvrL7gQq6+9dWvvo9osb6t+rK+TYy0vm4dtr4Qrre+MD65vs/Nur7qXLy+guu9vpR5v74fB8G+I5TCvp8gxL6RrMW++DfHvtPCyL4iTcq+4tbLvhNgzb616M6+xXDQvkL40b4tf9O+gwXVvkOL1r5tENi+/5TZvvkY275ZnNy+HR/evkah377TIuG+waPivhAk5L6+o+W+zCLnvjih6L4AH+q+JJzrvqIY7b56lO6+qw/wvjOK8b4SBPO+Rn30vs/19b6qbfe+2eT4vlhb+r4o0fu+R0b9vrW6/r44FwC/u9AAv+SJAb+yQgK/JfsCvzuzA7/2agS/UyIFv1PZBb/1jwa/OEYHvx38B7+isQi/x2YJv4wbCr/wzwq/84MLv5M3DL/R6gy/rJ0NvyRQDr84Ag+/6LMPvzJlEL8YFhG/l8YRv7B2Er9jJhO/rtUTv5GEFL8NMxW/H+EVv8iOFr8IPBe/3egXv0iVGL9IQRm/3OwZvwSYGr/AQhu/D+0bv/CWHL9jQB2/aOkdv/6RHr8lOh+/3OEfvyOJIL/6LyG/X9Yhv1J8Ir/UISO/48Yjv39rJL+nDyW/XLMlv51WJr9o+Sa/v5snv6A9KL8L3yi//38pv30gKr+DwCq/EWArvyf/K7/EnSy/6Dstv5LZLb/Ddi6/eRMvv7SvL79zSzC/t+Ywv3+BMb/LGzK/mbUyv+pOM7+95zO/EoA0v+gXNb8/rzW/FkY2v27cNr9Fcje/nAc4v3GcOL/FMDm/lsQ5v+ZXOr+y6jq//Hw7v8IOPL8DoDy/wTA9v/rAPb+tUD6/298+v4NuP7+l/D+/QIpAv1MXQb/go0G/5C9Cv2C7Qr9TRkO/vtBDv55aRL/240S/wmxFvwX1Rb+8fEa/6ANHv4mKR7+dEEi/JZZIvyAbSb+On0m/byNKv8GmSr+GKUu/vKtLv2MtTL96rky/Ai9Nv/quTb9iLk6/Oa1Ov34rT78zqU+/VSZQv+aiUL/kHlG/UJpRvygVUr9tj1K/HglTvzuCU7/D+lO/t3JUvxbqVL/fYFW/EtdVv7BMVr+3wVa/JzZXvwCqV79CHVi/7I9Yv/4BWb94c1m/WeRZv6JUWr9RxFq/ZjNbv+KhW7/DD1y/Cn1cv7fpXL/IVV2/PsFdvxgsXr9Xll6/+f9ev/9oX79o0V+/Mzlgv2KgYL/zBmG/5WxhvzrSYb/wNmK/CJtiv4D+Yr9ZYWO/ksNjvywlZL8lhmS/fuZkvzdGZb9OpWW/xQNmv5phZr/Nvma/Xhtnv013Z7+a0me/RC1ov0uHaL+u4Gi/bzlpv4uRab8E6Wm/2T9qvwmWar+U62q/e0Brv7yUa79Z6Gu/Tztsv6CNbL9L32y/TzBtv62Abb9l0G2/dR9uv99tbr+hu26/uwhvvy5Vb7/4oG+/G+xvv5U2cL9ngHC/kMlwvw8Scb/mWXG/E6Fxv5fncb9xLXK/oHJyvya3cr8B+3K/Mj5zv7iAc7+UwnO/xAN0v0lEdL8ihHS/UMN0v9IBdb+oP3W/0nx1v1C5db8h9XW/RTB2v71qdr+IpHa/pt12vxYWd7/ZTXe/74R3v1e7d78R8Xe/HSZ4v3paeL8qjni/K8F4v33zeL8hJXm/FlZ5v1yGeb/ytXm/2uR5vxITer+aQHq/c216v52Zer8WxXq/3+96v/gZe79hQ3u/Gmx7vyKUe796u3u/IOJ7vxcIfL9cLXy/8FF8v9N1fL8FmXy/hrt8v1XdfL9z/ny/3x59v5o+fb+jXX2/+nt9v5+Zfb+Stn2/09J9v2Lufb8/CX6/aSN+v+E8fr+nVX6/um1+vxuFfr/Jm36/xLF+vw3Hfr+i236/he9+v7UCf78yFX+//CZ/vxM4f792SH+/J1h/vyRnf79udX+/BYN/v+iPf78ZnH+/lad/v1+yf790vH+/18V/v4XOf7+B1n+/yN1/v13kf7896n+/au9/v+Pzf7+p93+/u/p/vxn9f7/E/n+/u/9/v/r/fz85/n8/qfl/P0vyfz8e6H8/I9t/P1nLfz/BuH8/W6N/PyiLfz8ncH8/WlJ/P78xfz9YDn8/Jeh+Pya/fj9ck34/yGR+P2kzfj9B/30/T8h9P5aOfT8UUn0/yxJ9P7zQfD/ni3w/TUR8P+/5ez/NrHs/6Vx7P0MKez/dtHo/tlx6P9EBej8upHk/zkN5P7LgeD/ceng/TBJ4PwSndz8EOXc/T8h2P+RUdj/G3nU/9mV1P3XqdD9EbHQ/ZetzP9pncz+j4XI/wlhyPznNcT8JP3E/NK5wP7sacD+ghG8/5OtuP4pQbj+Tsm0/ARJtP9VubD8RyWs/tyBrP8l1aj9JyGk/ORhpP5tlaD9vsGc/uvhmP3w+Zj+4gWU/b8JkP6QAZD9aPGM/kXViP0ysYT+O4GA/WRJgP65BXz+Rbl4/A5ldPwjBXD+g5ls/zwlbP5gqWj/7SFk//WRYP59+Vz/llVY/0KpVP2O9VD+hzVM/jNtSPyfnUT918FA/efdPPzT8Tj+r/k0/3/5MP9T8Sz+M+Eo/CvJJP1LpSD9l3kc/R9FGP/vBRT+EsEQ/5ZxDPyCHQj86b0E/NFVAPxM5Pz/YGj4/iPo8PybYOz+0szo/No05P69kOD8iOjc/kw02PwXfND98rjM/+XsyP4JHMT8ZETA/wtguP3+eLT9WYiw/SCQrP1rkKT+Qoig/614nP3EZJj8l0iQ/CYkjPyM+Ij918SA/BKMfP9JSHj/kAB0/Pa0bP+FXGj/TABk/GagXP7RNFj+q8RQ//ZMTP7I0Ej/M0xA/UHEPP0INDj+kpww/fEALP83XCT+abQg/6QEHP72UBT8ZJgQ/A7YCP35EAT8co/8+brr8PvrO+T7K4PY+5O/zPlH88D4aBu4+Rw3rPuAR6D7tE+U+dxPiPocQ3z4kC9w+WAPZPir51T6k7NI+zd3PPq/MzD5Suck+v6PGPv6Lwz4YcsA+Fla9PgA4uj7gF7c+vfWzPqHRsD6Vq60+ooOqPs9Zpz4nLqQ+sgChPnnRnT6FoJo+322XPo85lD6gA5E+GsyNPgWTij5rWIc+VhyEPs3egD62P3s+EL90Prs7bj7JtWc+TS1hPlmiWj7/FFQ+UYVNPmPzRj5GX0A+Dck5PsowMz6Qliw+cvolPoJcHz7SvBg+dhsSPn94Cz4B1AQ+HVz8PXIN7z0pvOE9ZmjUPU4Sxz0Iurk9uF+sPYQDnz2SpZE9B0aEPRLKbT16BVM9kT44PaR1HT38qgI9yr3PPFYjmjxhDkk8xae7Oz16VroJRvG7Et1jvFCKp7xBJN28410JvSMoJL2W8D698rZZvep6dL0anoe9Qv2Uvchaor2Gtq+9VxC9vRZoyr2bvde9wxDlvWlh8r1lr/+9Sn0GvmghDb76wxO+7WQavi4EIb6soSe+Uz0uvhDXNL7Sbju+hgRCvhmYSL55KU++lLhVvlZFXL6uz2K+iVdpvtbcb76AX3a+eN98vlSugb6B64S+OCeIvnJhi74kmo6+RdGRvs0Glb6zOpi+7mybvnSdnr49zKG+QPmkvnMkqL7PTau+SXWuvtqasb54vrS+G+C3vrr/ur5LHb6+xzjBviVSxL5bace+YX7KvjCRzb68odC+ALDTvvG71r6Hxdm+uszcvoHR377T0+K+qdPlvvrQ6L69y+u+6sPuvni58b5grPS+mpz3vhyK+r7fdP2+bS4AvwOhAb8tEgO/5oEEvyzwBb/6XAe/TMgIvx4yCr9smgu/MgENv2xmDr8Xyg+/LSwRv6yMEr+Q6xO/1UgVv3akFr9x/he/wFYZv2KtGr9RAhy/ilUdvwmnHr/L9h+/zEQhvwmRIr982yO/JCQlv/1qJr8CsCe/MPMov4Q0Kr/6cyu/j7Esvz/tLb8HJy+/414wv9CUMb/KyDK/zvozv9oqNb/oWDa/94Q3vwKvOL8H1zm/A/06v/EgPL/PQj2/mmI+v0+AP7/pm0C/aLVBv8bMQr8B4kO/F/VEvwMGRr/EFEe/ViFIv7YrSb/hM0q/1DlLv409TL8JP02/RD5Ovz07T7/wNVC/Wi5Rv3kkUr9KGFO/yglUv/f4VL/O5VW/TdBWv3C4V783nli/nIFZv6BiWr8+QVu/dR1cv0H3XL+izl2/lKNevxR2X78iRmC/uhNhv9neYb9/p2K/qW1jv1QxZL9+8mS/JrFlv0ltZr/lJme/+N1nv4CSaL97RGm/6PNpv8Ogar8MS2u/wPJrv96XbL9kOm2/UNptv6B3br9TEm+/Zqpvv9k/cL+p0nC/1WJxv1vwcb86e3K/cQNzv/2Ic7/eC3S/EYx0v5YJdb9rhHW/j/x1vwBydr+95Ha/xlR3vxjCd7+yLHi/k5R4v7v5eL8oXHm/2bt5v80Yer8Cc3q/ecp6vy8fe78kcXu/WMB7v8kMfL92Vny/X518v4LhfL/gIn2/d2F9v0edfb9P1n2/jgx+vwRAfr+wcH6/kp5+v6nJfr/18X6/dRd/vyk6f78QWn+/K3d/v3iRf7/4qH+/qr1/v4/Pf7+l3n+/7ep/v2b0f78R+3+/7f5/v+r/fz/l+H8/puZ/Py3Jfz98oH8/lWx/P3ktfz8s434/sY1+Pwstfj8/wX0/Ukp9P0jIfD8oO3w/96J7P73/ej+AUXo/SJh5Px7UeD8JBXg/Eyt3P0ZGdj+sVnU/Tlx0PzhXcz92R3I/Ey1xPxwIcD+e2G4/pZ5tP0BabD9+C2s/a7JpPxlPaD+W4WY/8mllPz7oYz+LXGI/6sZgP20nXz8mfl0/KMtbP4UOWj9TSFg/o3hWP4ufVD8gvVI/dtFQP6PcTj+93kw/29dKPxPISD98r0Y/Lo5EP0FkQj/OMUA/7PY9P7SzOz9CaDk/rRQ3PxC5ND+GVTI/KeovPxV3LT9l/Co/NXooP6HwJT/GXyM/wMcgP6woHj+pghs/1NUYP0oiFj8qaBM/k6cQP6TgDT97Ews/OUAIP/1mBT/nhwI/LUb/Pltx+T6XkfM+JKftPkWy5z48s+E+TKrbPrqX1T7Je88+vlbJPt8owz5w8rw+t7O2PvtssD6BHqo+ksijPnNrnT5sB5c+xZyQPscrij65tIM+x296PiFrbT4RXGA+KUNTPv0gRj4g9jg+JsMrPqSIHj4tRxE+V/8DPm5j7T3CvdI92g64Pd5XnT37mYI9vKxPPWUcGj2ZCsk8Kqc7PMF41rotRHG8V9fjvEyBJ72UD129FUqJvVoGpL1tu769ImjZvU4L9L3jUQe+L5gUvvfXIb6lEC++pkE8vmRqSb5Nila+zaBjvlCtcL5Fr32+DVOFvp7Ii74NOJK+EqGYvmYDn76/XqW+2LKrvmn/sb4rRLi+2IC+viq1xL7b4Mq+pQPRvkUd1751Ld2+8TPjvnYw6b7AIu++jQr1vpvn+r7TXAC/OEADv9sdBr+b9Qi/WscLv/eSDr9UWBG/UBcUv83PFr+sgRm/0CwcvxrRHr9tbiG/qwQkv7eTJr90Gym/x5srv5MULr+7hTC/Ju8yv7dQNb9Vqje/4/s5v0pFPL9uhj6/N79Av4vvQr9TF0W/dTZHv9pMSb9rWku/EF9Nv7NaT78+TVG/mjZTv7MWVb9y7Va/xbpYv5V+Wr/QOFy/YuldvziQX79ALWG/Z8Biv5xJZL/OyGW/6z1nv+OoaL+nCWq/J2Brv1SsbL8f7m2/eiVvv1hScL+rdHG/Z4xyv3+Zc7/nm3S/lZN1v36Adr+WYne/1Dl4vy8Geb+ex3m/F356v5Qpe78Nynu/el98v9XpfL8YaX2/Pt19v0BGfr8cpH6/zPZ+v00+f7+cen+/tqt/v5nRf79D7H+/tPt/v6b/fz+U438/nJp/P8wkfz84gn4//bJ9Pz+3fD8qj3s/8zp6P9S6eD8RD3c/9jd1P9U1cz8ICXE/8bFuP/kwbD+Qhmk/L7NmP1O3Yz+Ek2A/TkhdP0XWWT8DPlY/K4BSP2WdTj9elko/zGtGP2oeQj/5rj0/QB45Pw1tND8ynC8/h6wqP+ueJT8/dCA/bS0bP2HLFT8NTxA/aLkKP2sLBT8ujP4+3dTyPvHy5j5/6No+prfOPohiwj5O67U+KlSpPlGfnD79zo8+beWCPs7Jaz5in1E+MFA3PtPgHD7xVQI+YmjPPXwAmj0k+0g9G6S7PPN3VrtkPfG8u8BjvWddp70Uvdy9A/sIvnN/I7405z2+pC1YviZOcr4SIoa+iQWTvjTPn77VfKy+Mwy5vhp7xb5bx9G+ze7dvlDv6b7HxvW+kLkAvyZ5Br8kIQy/jbARv2YmF7+6gRy/mMEhvxXlJr9K6yu/VtMwv1ucNb+DRTq//c0+v/w0Q7+8eUe/fZtLv4SZT78fc1O/oSdXv2O2Wr/GHl6/MGBhvw96ZL/Ya2e/BzVqvx/VbL+pS2+/N5hxv2K6c7/JsXW/Fn53v/Yeeb8hlHq/Vd17v1n6fL/66n2/Dq9+v3RGf78PsX+/zu5/v/////////////////////8AAAAAAAAAACkAKQApAFIAUgB7AKQAyADeAEH69gELmAEpACkAKQApAHsAewB7AKQApADwAAoBGwEnASkAKQApACkAKQApACkAKQB7AHsAewB7APAA8ADwAAoBCgExAT4BSAFQAXsAewB7AHsAewB7AHsAewDwAPAA8ADwADEBMQExAT4BPgFXAV8BZgFsAfAA8ADwAPAA8ADwAPAA8AAxATEBMQExAVcBVwFXAV8BXwFyAXgBfgGDAQBBoPgBC7gEKAcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcoDxccHyIkJicpKissLS4vLzEyMzQ1Njc3OTo7PD0+Pz9BQkNERUZHRygUISkwNTk9QEJFR0lLTE5QUlVXWVtcXmBiZWdpa2xucHJ1d3l7fH6AKBcnMzxDSU9TV1teYWRmaWtvc3Z5fH6Bg4eLjpGUlpmbn6OmqayusbMjHDFBTllja3J4foSIjZGVmZ+lq7C0ub3Ax83T2Nzh5ejv9fsVITpPYXB9iZSdpq62vcPJz9nj6/P7ESM/Vmp7i5ilsbvFztbe5u36GR83S1tpdYCKkpqhqK60ub7I0Nfe5evw9f8QJEFZboCQn625xM/Z4ury+gspSmeAl6y/0eHx/wkrT26Ko7rP4/YMJ0dje5CktsbW5PH9CSxRcY6owNbr/wcxWn+gv9z3BjNfhqrL6gcvV3ubuNTtBjRhia7Q8AU5apfA5wU7b57K8wU3Z5O74AU8caHO+ARBeq/gBEN/tuoAAAAAAAAAAODg4ODg4ODgoKCgoLm5ubKyqIY9JeDg4ODg4ODg8PDw8M/Pz8bGt5BCKKCgoKCgoKCgubm5ucHBwbe3rIpAJvDw8PDw8PDwz8/Pz8zMzMHBtI9CKLm5ubm5ubm5wcHBwcHBwbe3rIpBJ8/Pz8/Pz8/PzMzMzMnJyby8sI1CKMHBwcHBwcHBwcHBwcLCwri4rYtBJ8zMzMzMzMzMycnJycbGxru7r4xCKABB4vwBC7kpYADAACABgAEgAIAA4ABAAaABQACgAAABYAHAAQgAaADIACgBiAEoAIgA6ABIAagBSACoAAgBaAHIARAAcADQADABkAEwAJAA8ABQAbABUACwABABcAHQARgAeADYADgBmAE4AJgA+ABYAbgBWAC4ABgBeAHYAQQAZADEACQBhAEkAIQA5ABEAaQBRACkAAQBZAHEAQwAbADMACwBjAEsAIwA7ABMAawBTACsAAwBbAHMARQAdADUADQBlAE0AJQA9ABUAbQBVAC0ABQBdAHUARwAfADcADwBnAE8AJwA/ABcAbwBXAC8ABwBfAHcAQEAYQDBACEBgQEhAIEA4QBBAaEBQQChAAEBYQHBAQkAaQDJACkBiQEpAIkA6QBJAakBSQCpAAkBaQHJAREAcQDRADEBkQExAJEA8QBRAbEBUQCxABEBcQHRARkAeQDZADkBmQE5AJkA+QBZAbkBWQC5ABkBeQHZAQUAZQDFACUBhQElAIUA5QBFAaUBRQClAAUBZQHFAQ0AbQDNAC0BjQEtAI0A7QBNAa0BTQCtAA0BbQHNARUAdQDVADUBlQE1AJUA9QBVAbUBVQC1ABUBdQHVAR0AfQDdAD0BnQE9AJ0A/QBdAb0BXQC9AB0BfQHdAQIAYgDCACIBggEiAIIA4gBCAaIBQgCiAAIBYgHCAQoAagDKACoBigEqAIoA6gBKAaoBSgCqAAoBagHKARIAcgDSADIBkgEyAJIA8gBSAbIBUgCyABIBcgHSARoAegDaADoBmgE6AJoA+gBaAboBWgC6ABoBegHaAQYAZgDGACYBhgEmAIYA5gBGAaYBRgCmAAYBZgHGAQ4AbgDOAC4BjgEuAI4A7gBOAa4BTgCuAA4BbgHOARYAdgDWADYBlgE2AJYA9gBWAbYBVgC2ABYBdgHWAR4AfgDeAD4BngE+AJ4A/gBeAb4BXgC+AB4BfgHeAQMAYwDDACMBgwEjAIMA4wBDAaMBQwCjAAMBYwHDAQsAawDLACsBiwErAIsA6wBLAasBSwCrAAsBawHLARMAcwDTADMBkwEzAJMA8wBTAbMBUwCzABMBcwHTARsAewDbADsBmwE7AJsA+wBbAbsBWwC7ABsBewHbAQcAZwDHACcBhwEnAIcA5wBHAacBRwCnAAcBZwHHAQ8AbwDPAC8BjwEvAI8A7wBPAa8BTwCvAA8BbwHPARcAdwDXADcBlwE3AJcA9wBXAbcBVwC3ABcBdwHXAR8AfwDfAD8BnwE/AJ8A/wBfAb8BXwC/AB8BfwHfAQAAgD8AAACAY/p/P791VryL6X8/CnHWvHnNfz/nziC9L6Z/PzpeVr2vc38/E/KFvfk1fz8qr6C9Eu1+PzNlu739mH4/BBPWvbw5fj9zt/C9Vc99P6ioBb7LWX0/u+8SviXZfD9cMCC+Z018P/VpLb6Ytns/85s6vr4Uez/CxUe+4md6P83mVL4JsHk/gv5hvjzteD9NDG++hB94P5wPfL7qRnc/7oOEvndjdj8++oq+NnV1P3Vqkb4wfHQ/TNSXvnF4cz96N56+A2pyP7eTpL70UHE/vOiqvk8tcD9BNrG+If9uPwF8t752xm0/tLm9vl6DbD8V78O+5zVrP94byr4e3mk/yT/QvhJ8aD+SWta+1A9nP/Nr3L50mWU/qnPivgEZZD9xcei+jY5iPwdl7r4o+mA/J070vuZbXz+QLPq+17NdPwAAAL8PAlw/G+QCv6BGWj93wgW/noFYP/aaCL8ds1Y/d20LvzHbVD/aOQ6/7/lSPwAAEb9sD1E/yr8Tv70bTz8YeRa/+B5NP80rGb80GUs/ytcbv4gKST/xfB6/CvNGPyQbIb/R0kQ/RrIjv/epQj86Qia/k3hAP+PKKL+9Pj4/JUwrv4/8Oz/jxS2/IrI5PwE4ML+QXzc/ZaIyv/MENT/zBDW/ZaIyP5BfN78BODA/IrI5v+PFLT+P/Du/JUwrP70+Pr/jyig/k3hAvzpCJj/3qUK/RrIjP9HSRL8kGyE/CvNGv/F8Hj+ICkm/ytcbPzQZS7/NKxk/+B5Nvxh5Fj+9G0+/yr8TP2wPUb8AABE/7/lSv9o5Dj8x21S/d20LPx2zVr/2mgg/noFYv3fCBT+gRlq/G+QCPw8CXL8AAAA/17Ndv5As+j7mW1+/J070Pij6YL8HZe4+jY5iv3Fx6D4BGWS/qnPiPnSZZb/za9w+1A9nv5Ja1j4SfGi/yT/QPh7eab/eG8o+5zVrvxXvwz5eg2y/tLm9PnbGbb8BfLc+If9uv0E2sT5PLXC/vOiqPvRQcb+3k6Q+A2pyv3o3nj5xeHO/TNSXPjB8dL91apE+NnV1vz76ij53Y3a/7oOEPupGd7+cD3w+hB94v00Mbz487Xi/gv5hPgmweb/N5lQ+4md6v8LFRz6+FHu/85s6Ppi2e7/1aS0+Z018v1wwID4l2Xy/u+8SPstZfb+oqAU+Vc99v3O38D28OX6/BBPWPf2Yfr8zZbs9Eu1+vyqvoD35NX+/E/KFPa9zf786XlY9L6Z/v+fOID15zX+/CnHWPIvpf7+/dVY8Y/p/vwAwjSQAAIC/v3VWvGP6f78Kcda8i+l/v+fOIL15zX+/Ol5WvS+mf78T8oW9r3N/vyqvoL35NX+/M2W7vRLtfr8EE9a9/Zh+v3O38L28OX6/qKgFvlXPfb+77xK+y1l9v1wwIL4l2Xy/9WktvmdNfL/zmzq+mLZ7v8LFR76+FHu/zeZUvuJner+C/mG+CbB5v00Mb7487Xi/nA98voQfeL/ug4S+6kZ3vz76ir53Y3a/dWqRvjZ1db9M1Je+MHx0v3o3nr5xeHO/t5OkvgNqcr+86Kq+9FBxv0E2sb5PLXC/AXy3viH/br+0ub2+dsZtvxXvw75eg2y/3hvKvuc1a7/JP9C+Ht5pv5Ja1r4SfGi/82vcvtQPZ7+qc+K+dJllv3Fx6L4BGWS/B2Xuvo2OYr8nTvS+KPpgv5As+r7mW1+/AAAAv9ezXb8b5AK/DwJcv3fCBb+gRlq/9poIv56BWL93bQu/HbNWv9o5Dr8x21S/AAARv+/5Ur/KvxO/bA9Rvxh5Fr+9G0+/zSsZv/geTb/K1xu/NBlLv/F8Hr+ICkm/JBshvwrzRr9GsiO/0dJEvzpCJr/3qUK/48oov5N4QL8lTCu/vT4+v+PFLb+P/Du/ATgwvyKyOb9lojK/kF83v/MENb/zBDW/kF83v2WiMr8isjm/ATgwv4/8O7/jxS2/vT4+vyVMK7+TeEC/48oov/epQr86Qia/0dJEv0ayI78K80a/JBshv4gKSb/xfB6/NBlLv8rXG7/4Hk2/zSsZv70bT78YeRa/bA9Rv8q/E7/v+VK/AAARvzHbVL/aOQ6/HbNWv3dtC7+egVi/9poIv6BGWr93wgW/DwJcvxvkAr/Xs12/AAAAv+ZbX7+QLPq+KPpgvydO9L6NjmK/B2XuvgEZZL9xcei+dJllv6pz4r7UD2e/82vcvhJ8aL+SWta+Ht5pv8k/0L7nNWu/3hvKvl6DbL8V78O+dsZtv7S5vb4h/26/AXy3vk8tcL9BNrG+9FBxv7zoqr4DanK/t5OkvnF4c796N56+MHx0v0zUl742dXW/dWqRvndjdr8++oq+6kZ3v+6DhL6EH3i/nA98vjzteL9NDG++CbB5v4L+Yb7iZ3q/zeZUvr4Ue7/CxUe+mLZ7v/ObOr5nTXy/9WktviXZfL9cMCC+y1l9v7vvEr5Vz32/qKgFvrw5fr9zt/C9/Zh+vwQT1r0S7X6/M2W7vfk1f78qr6C9r3N/vxPyhb0vpn+/Ol5WvXnNf7/nziC9i+l/vwpx1rxj+n+/v3VWvAAAgL8AMA2lY/p/v791VjyL6X+/CnHWPHnNf7/nziA9L6Z/vzpeVj2vc3+/E/KFPfk1f78qr6A9Eu1+vzNluz39mH6/BBPWPbw5fr9zt/A9Vc99v6ioBT7LWX2/u+8SPiXZfL9cMCA+Z018v/VpLT6Ytnu/85s6Pr4Ue7/CxUc+4md6v83mVD4JsHm/gv5hPjzteL9NDG8+hB94v5wPfD7qRne/7oOEPndjdr8++oo+NnV1v3VqkT4wfHS/TNSXPnF4c796N54+A2pyv7eTpD70UHG/vOiqPk8tcL9BNrE+If9uvwF8tz52xm2/tLm9Pl6DbL8V78M+5zVrv94byj4e3mm/yT/QPhJ8aL+SWtY+1A9nv/Nr3D50mWW/qnPiPgEZZL9xceg+jY5ivwdl7j4o+mC/J070PuZbX7+QLPo+17NdvwAAAD8PAly/G+QCP6BGWr93wgU/noFYv/aaCD8ds1a/d20LPzHbVL/aOQ4/7/lSvwAAET9sD1G/yr8TP70bT78YeRY/+B5Nv80rGT80GUu/ytcbP4gKSb/xfB4/CvNGvyQbIT/R0kS/RrIjP/epQr86QiY/k3hAv+PKKD+9Pj6/JUwrP4/8O7/jxS0/IrI5vwE4MD+QXze/ZaIyP/MENb/zBDU/ZaIyv5BfNz8BODC/IrI5P+PFLb+P/Ds/JUwrv70+Pj/jyii/k3hAPzpCJr/3qUI/RrIjv9HSRD8kGyG/CvNGP/F8Hr+ICkk/ytcbvzQZSz/NKxm/+B5NPxh5Fr+9G08/yr8Tv2wPUT8AABG/7/lSP9o5Dr8x21Q/d20Lvx2zVj/2mgi/noFYP3fCBb+gRlo/G+QCvw8CXD8AAAC/17NdP5As+r7mW18/J070vij6YD8HZe6+jY5iP3Fx6L4BGWQ/qnPivnSZZT/za9y+1A9nP5Ja1r4SfGg/yT/Qvh7eaT/eG8q+5zVrPxXvw75eg2w/tLm9vnbGbT8BfLe+If9uP0E2sb5PLXA/vOiqvvRQcT+3k6S+A2pyP3o3nr5xeHM/TNSXvjB8dD91apG+NnV1Pz76ir53Y3Y/7oOEvupGdz+cD3y+hB94P00Mb7487Xg/gv5hvgmweT/N5lS+4md6P8LFR76+FHs/85s6vpi2ez/1aS2+Z018P1wwIL4l2Xw/u+8SvstZfT+oqAW+Vc99P3O38L28OX4/BBPWvf2Yfj8zZbu9Eu1+PyqvoL35NX8/E/KFva9zfz86Xla9L6Z/P+fOIL15zX8/CnHWvIvpfz+/dVa8Y/p/PwDIU6UAAIA/v3VWPGP6fz8KcdY8i+l/P+fOID15zX8/Ol5WPS+mfz8T8oU9r3N/PyqvoD35NX8/M2W7PRLtfj8EE9Y9/Zh+P3O38D28OX4/qKgFPlXPfT+77xI+y1l9P1wwID4l2Xw/9WktPmdNfD/zmzo+mLZ7P8LFRz6+FHs/zeZUPuJnej+C/mE+CbB5P00Mbz487Xg/nA98PoQfeD/ug4Q+6kZ3Pz76ij53Y3Y/dWqRPjZ1dT9M1Jc+MHx0P3o3nj5xeHM/t5OkPgNqcj+86Ko+9FBxP0E2sT5PLXA/AXy3PiH/bj+0ub0+dsZtPxXvwz5eg2w/3hvKPuc1az/JP9A+Ht5pP5Ja1j4SfGg/82vcPtQPZz+qc+I+dJllP3Fx6D4BGWQ/B2XuPo2OYj8nTvQ+KPpgP5As+j7mW18/AAAAP9ezXT8b5AI/DwJcP3fCBT+gRlo/9poIP56BWD93bQs/HbNWP9o5Dj8x21Q/AAARP+/5Uj/KvxM/bA9RPxh5Fj+9G08/zSsZP/geTT/K1xs/NBlLP/F8Hj+ICkk/JBshPwrzRj9GsiM/0dJEPzpCJj/3qUI/48ooP5N4QD8lTCs/vT4+P+PFLT+P/Ds/ATgwPyKyOT9lojI/kF83P/MENT/zBDU/kF83P2WiMj8isjk/ATgwP4/8Oz/jxS0/vT4+PyVMKz+TeEA/48ooP/epQj86QiY/0dJEP0ayIz8K80Y/JBshP4gKST/xfB4/NBlLP8rXGz/4Hk0/zSsZP70bTz8YeRY/bA9RP8q/Ez/v+VI/AAARPzHbVD/aOQ4/HbNWP3dtCz+egVg/9poIP6BGWj93wgU/DwJcPxvkAj/Xs10/AAAAP+ZbXz+QLPo+KPpgPydO9D6NjmI/B2XuPgEZZD9xceg+dJllP6pz4j7UD2c/82vcPhJ8aD+SWtY+Ht5pP8k/0D7nNWs/3hvKPl6DbD8V78M+dsZtP7S5vT4h/24/AXy3Pk8tcD9BNrE+9FBxP7zoqj4DanI/t5OkPnF4cz96N54+MHx0P0zUlz42dXU/dWqRPndjdj8++oo+6kZ3P+6DhD6EH3g/nA98PjzteD9NDG8+CbB5P4L+YT7iZ3o/zeZUPr4Uez/CxUc+mLZ7P/ObOj5nTXw/9WktPiXZfD9cMCA+y1l9P7vvEj5Vz30/qKgFPrw5fj9zt/A9/Zh+PwQT1j0S7X4/M2W7Pfk1fz8qr6A9r3N/PxPyhT0vpn8/Ol5WPXnNfz/nziA9i+l/Pwpx1jxj+n8/v3VWPAAAMABgAJAAwAAQAEAAcACgANAAIABQAIAAsADgAAQANABkAJQAxAAUAEQAdACkANQAJABUAIQAtADkAAgAOABoAJgAyAAYAEgAeACoANgAKABYAIgAuADoAAwAPABsAJwAzAAcAEwAfACsANwALABcAIwAvADsAAEAMQBhAJEAwQARAEEAcQChANEAIQBRAIEAsQDhAAUANQBlAJUAxQAVAEUAdQClANUAJQBVAIUAtQDlAAkAOQBpAJkAyQAZAEkAeQCpANkAKQBZAIkAuQDpAA0APQBtAJ0AzQAdAE0AfQCtAN0ALQBdAI0AvQDtAAIAMgBiAJIAwgASAEIAcgCiANIAIgBSAIIAsgDiAAYANgBmAJYAxgAWAEYAdgCmANYAJgBWAIYAtgDmAAoAOgBqAJoAygAaAEoAegCqANoAKgBaAIoAugDqAA4APgBuAJ4AzgAeAE4AfgCuAN4ALgBeAI4AvgDuAAMAMwBjAJMAwwATAEMAcwCjANMAIwBTAIMAswDjAAcANwBnAJcAxwAXAEcAdwCnANcAJwBXAIcAtwDnAAsAOwBrAJsAywAbAEsAewCrANsAKwBbAIsAuwDrAA8APwBvAJ8AzwAfAE8AfwCvAN8ALwBfAI8AvwDvAPAAAACJiIg7AQAAAAUAMAADABAABAAEAAQAAQBBrKYCCwYgkQAAIIIAQcKmAguJAhgAMABIAGAACAAgADgAUABoABAAKABAAFgAcAAEABwANABMAGQADAAkADwAVABsABQALABEAFwAdAABABkAMQBJAGEACQAhADkAUQBpABEAKQBBAFkAcQAFAB0ANQBNAGUADQAlAD0AVQBtABUALQBFAF0AdQACABoAMgBKAGIACgAiADoAUgBqABIAKgBCAFoAcgAGAB4ANgBOAGYADgAmAD4AVgBuABYALgBGAF4AdgADABsAMwBLAGMACwAjADsAUwBrABMAKwBDAFsAcwAHAB8ANwBPAGcADwAnAD8AVwBvABcALwBHAF8AdwB4AAAAiIgIPAIAAAAFABgAAwAIAAIABAAEAAEAQdyoAgsGQJMAACCCAEHyqAILjQEMABgAJAAwAAQAEAAcACgANAAIABQAIAAsADgAAQANABkAJQAxAAUAEQAdACkANQAJABUAIQAtADkAAgAOABoAJgAyAAYAEgAeACoANgAKABYAIgAuADoAAwAPABsAJwAzAAcAEwAfACsANwALABcAIwAvADsAPAAAAImIiDwDAAAABQAMAAMABAAEAAEAQZSqAguQAXCUAAAgggAAAAAAAJWLAAA3mAAA/6UAAAS1AABnxQAARdcAAMHqAAD//wAAAADOQAAAyEAAALhAAACqQAAAokAAAJpAAACQQAAAjEAAAJxAAACWQAAAkkAAAI5AAACcQAAAlEAAAIpAAACQQAAAjEAAAJRAAACYQAAAjkAAAHBAAABwQAAAcEAAAHBAAABwQABBsKsCC/ICSH9BgUKAQYBAgD6AQIBAgFxOXE9cTlpPdClzKHIohBqEGpERoQywCrELGLMwijaH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";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}var binary=tryParseAsDataURI(file);if(binary){return binary}if(readBinary){return readBinary(file)}else{throw"sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)"}}catch(err){abort(err)}}function instantiateSync(file,info){var instance;var module;var binary;try{binary=getBinary(file);module=new WebAssembly.Module(binary);instance=new WebAssembly.Instance(module,info)}catch(e){var str=e.toString();err("failed to compile wasm module: "+str);if(str.includes("imported Memory")||str.includes("memory import")){err("Memory size incompatibility issues may be due to changing INITIAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set INITIAL_MEMORY at runtime to something smaller than it was at compile time).")}throw e}return[instance,module]}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["g"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["r"];addOnInit(Module["asm"]["h"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}var result=instantiateSync(wasmBinaryFile,info);receiveInstance(result[0]);return Module["asm"]}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){wasmTable.get(func)()}else{wasmTable.get(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function _abort(){abort("")}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function abortOnCannotGrowMemory(requestedSize){abort("OOM")}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;abortOnCannotGrowMemory(requestedSize)}var SYSCALLS={mappings:{},buffers:[null,[],[]],printChar:function(stream,curr){var buffer=SYSCALLS.buffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},get64:function(low,high){return low}};function _fd_close(fd){return 0}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){}function _fd_write(fd,iov,iovcnt,pnum){var num=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j>2]=num;return 0}var ASSERTIONS=false;function intArrayToString(array){var ret=[];for(var i=0;i255){if(ASSERTIONS){assert(false,"Character code "+chr+" ("+String.fromCharCode(chr)+") at offset "+i+" not in 0x00-0xFF.")}chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}var decodeBase64=typeof atob==="function"?atob:function(input){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();null;const OggOpusEncoder=function(config,Module){if(!Module){throw new Error("Module with exports required to initialize an encoder instance")}this.config=Object.assign({encoderApplication:2049,encoderFrameSize:20,encoderSampleRate:48e3,maxFramesPerPage:40,numberOfChannels:1,originalSampleRate:44100,resampleQuality:3,serial:Math.floor(Math.random()*4294967296)},config);this._opus_encoder_create=Module._opus_encoder_create;this._opus_encoder_destroy=Module._opus_encoder_destroy;this._opus_encoder_ctl=Module._opus_encoder_ctl;this._speex_resampler_process_interleaved_float=Module._speex_resampler_process_interleaved_float;this._speex_resampler_init=Module._speex_resampler_init;this._speex_resampler_destroy=Module._speex_resampler_destroy;this._opus_encode_float=Module._opus_encode_float;this._free=Module._free;this._malloc=Module._malloc;this.HEAPU8=Module.HEAPU8;this.HEAP32=Module.HEAP32;this.HEAPF32=Module.HEAPF32;this.pageIndex=0;this.granulePosition=0;this.segmentData=new Uint8Array(65025);this.segmentDataIndex=0;this.segmentTable=new Uint8Array(255);this.segmentTableIndex=0;this.framesInPage=0;this.initChecksumTable();this.initCodec();this.initResampler();if(this.config.numberOfChannels===1){this.interleave=function(buffers){return buffers[0]}}};OggOpusEncoder.prototype.encode=function(buffers){if(!this.bufferLength){this.bufferLength=buffers[0].length;this.interleavedBuffers=new Float32Array(this.bufferLength*this.config.numberOfChannels)}var samples=this.interleave(buffers);var sampleIndex=0;var exportPages=[];while(sampleIndex=this.config.maxFramesPerPage){exportPages.push(this.generatePage())}}}return exportPages};OggOpusEncoder.prototype.destroy=function(){if(this.encoder){this._free(this.encoderSamplesPerChannelPointer);delete this.encoderSamplesPerChannelPointer;this._free(this.encoderBufferPointer);delete this.encoderBufferPointer;this._free(this.encoderOutputPointer);delete this.encoderOutputPointer;this._free(this.resampleSamplesPerChannelPointer);delete this.resampleSamplesPerChannelPointer;this._free(this.resampleBufferPointer);delete this.resampleBufferPointer;this._speex_resampler_destroy(this.resampler);delete this.resampler;this._opus_encoder_destroy(this.encoder);delete this.encoder}};OggOpusEncoder.prototype.flush=function(){var exportPage;if(this.framesInPage){exportPage=this.generatePage()}this.resampleBufferIndex=0;return exportPage};OggOpusEncoder.prototype.encodeFinalFrame=function(){var exportPages=[];if(this.resampleBufferIndex>0){const dataToFill=(this.resampleBufferLength-this.resampleBufferIndex)/this.config.numberOfChannels;const numBuffers=Math.ceil(dataToFill/this.bufferLength);for(var i=0;i>>24&255^data[i]]}return checksum>>>0};OggOpusEncoder.prototype.generateCommentPage=function(){var segmentDataView=new DataView(this.segmentData.buffer);segmentDataView.setUint32(0,1937076303,true);segmentDataView.setUint32(4,1936154964,true);segmentDataView.setUint32(8,10,true);segmentDataView.setUint32(12,1868784978,true);segmentDataView.setUint32(16,1919247474,true);segmentDataView.setUint16(20,21322,true);segmentDataView.setUint32(22,0,true);this.segmentTableIndex=1;this.segmentDataIndex=this.segmentTable[0]=26;this.headerType=0;return this.generatePage()};OggOpusEncoder.prototype.generateIdPage=function(){var segmentDataView=new DataView(this.segmentData.buffer);segmentDataView.setUint32(0,1937076303,true);segmentDataView.setUint32(4,1684104520,true);segmentDataView.setUint8(8,1,true);segmentDataView.setUint8(9,this.config.numberOfChannels,true);segmentDataView.setUint16(10,3840,true);segmentDataView.setUint32(12,this.config.originalSampleRateOverride||this.config.originalSampleRate,true);segmentDataView.setUint16(16,0,true);segmentDataView.setUint8(18,0,true);this.segmentTableIndex=1;this.segmentDataIndex=this.segmentTable[0]=19;this.headerType=2;return this.generatePage()};OggOpusEncoder.prototype.generatePage=function(){var granulePosition=this.lastPositiveGranulePosition===this.granulePosition?-1:this.granulePosition;var pageBuffer=new ArrayBuffer(27+this.segmentTableIndex+this.segmentDataIndex);var pageBufferView=new DataView(pageBuffer);var page=new Uint8Array(pageBuffer);pageBufferView.setUint32(0,1399285583,true);pageBufferView.setUint8(4,0,true);pageBufferView.setUint8(5,this.headerType,true);pageBufferView.setUint32(6,granulePosition,true);if(granulePosition<0){pageBufferView.setInt32(10,Math.ceil(granulePosition/4294967297)-1,true)}else{pageBufferView.setInt32(10,Math.floor(granulePosition/4294967296),true)}pageBufferView.setUint32(14,this.config.serial,true);pageBufferView.setUint32(18,this.pageIndex++,true);pageBufferView.setUint8(26,this.segmentTableIndex,true);page.set(this.segmentTable.subarray(0,this.segmentTableIndex),27);page.set(this.segmentData.subarray(0,this.segmentDataIndex),27+this.segmentTableIndex);pageBufferView.setUint32(22,this.getChecksum(page),true);var exportPage={message:"page",page:page,samplePosition:this.granulePosition};this.segmentTableIndex=0;this.segmentDataIndex=0;this.framesInPage=0;if(granulePosition>0){this.lastPositiveGranulePosition=granulePosition}return exportPage};OggOpusEncoder.prototype.initChecksumTable=function(){this.checksumTable=[];for(var i=0;i<256;i++){var r=i<<24;for(var j=0;j<8;j++){r=(r&2147483648)!=0?r<<1^79764919:r<<1}this.checksumTable[i]=r&4294967295}};OggOpusEncoder.prototype.setOpusControl=function(control,value){var location=this._malloc(4);this.HEAP32[location>>2]=value;this._opus_encoder_ctl(this.encoder,control,location);this._free(location)};OggOpusEncoder.prototype.initCodec=function(){var errLocation=this._malloc(4);this.encoder=this._opus_encoder_create(this.config.encoderSampleRate,this.config.numberOfChannels,this.config.encoderApplication,errLocation);this._free(errLocation);if(this.config.encoderBitRate){this.setOpusControl(4002,this.config.encoderBitRate)}if(this.config.encoderComplexity){this.setOpusControl(4010,this.config.encoderComplexity)}this.encoderSamplesPerChannel=this.config.encoderSampleRate*this.config.encoderFrameSize/1e3;this.encoderSamplesPerChannelPointer=this._malloc(4);this.HEAP32[this.encoderSamplesPerChannelPointer>>2]=this.encoderSamplesPerChannel;this.encoderBufferLength=this.encoderSamplesPerChannel*this.config.numberOfChannels;this.encoderBufferPointer=this._malloc(this.encoderBufferLength*4);this.encoderBuffer=this.HEAPF32.subarray(this.encoderBufferPointer>>2,(this.encoderBufferPointer>>2)+this.encoderBufferLength);this.encoderOutputMaxLength=4e3;this.encoderOutputPointer=this._malloc(this.encoderOutputMaxLength);this.encoderOutputBuffer=this.HEAPU8.subarray(this.encoderOutputPointer,this.encoderOutputPointer+this.encoderOutputMaxLength)};OggOpusEncoder.prototype.initResampler=function(){var errLocation=this._malloc(4);this.resampler=this._speex_resampler_init(this.config.numberOfChannels,this.config.originalSampleRate,this.config.encoderSampleRate,this.config.resampleQuality,errLocation);this._free(errLocation);this.resampleBufferIndex=0;this.resampleSamplesPerChannel=this.config.originalSampleRate*this.config.encoderFrameSize/1e3;this.resampleSamplesPerChannelPointer=this._malloc(4);this.HEAP32[this.resampleSamplesPerChannelPointer>>2]=this.resampleSamplesPerChannel;this.resampleBufferLength=this.resampleSamplesPerChannel*this.config.numberOfChannels;this.resampleBufferPointer=this._malloc(this.resampleBufferLength*4);this.resampleBuffer=this.HEAPF32.subarray(this.resampleBufferPointer>>2,(this.resampleBufferPointer>>2)+this.resampleBufferLength)};OggOpusEncoder.prototype.interleave=function(buffers){for(var i=0;i=0){if(this.segmentTableIndex===255){exportPages.push(this.generatePage());this.headerType=1}var segmentLength=Math.min(packetLength,255);this.segmentTable[this.segmentTableIndex++]=segmentLength;this.segmentData.set(this.encoderOutputBuffer.subarray(packetIndex,packetIndex+segmentLength),this.segmentDataIndex);this.segmentDataIndex+=segmentLength;packetIndex+=segmentLength;packetLength-=255}this.granulePosition+=48*this.config.encoderFrameSize;if(this.segmentTableIndex===255){exportPages.push(this.generatePage());this.headerType=0}return exportPages};if(typeof registerProcessor==="function"){class EncoderWorklet extends AudioWorkletProcessor{constructor(){super();this.continueProcess=true;this.port.onmessage=(({data:data})=>{if(this.encoder){switch(data["command"]){case"getHeaderPages":this.postPage(this.encoder.generateIdPage());this.postPage(this.encoder.generateCommentPage());break;case"done":this.encoder.encodeFinalFrame().forEach(pageData=>this.postPage(pageData));this.encoder.destroy();delete this.encoder;this.port.postMessage({message:"done"});break;case"flush":this.postPage(this.encoder.flush());this.port.postMessage({message:"flushed"});break;default:}}switch(data["command"]){case"close":this.continueProcess=false;break;case"init":this.encoder=new OggOpusEncoder(data,Module);this.port.postMessage({message:"ready"});break;default:}})}process(inputs){if(this.encoder&&inputs[0]&&inputs[0].length&&inputs[0][0]&&inputs[0][0].length){this.encoder.encode(inputs[0]).forEach(pageData=>this.postPage(pageData))}return this.continueProcess}postPage(pageData){if(pageData){this.port.postMessage(pageData,[pageData.page.buffer])}}}registerProcessor("encoder-worklet",EncoderWorklet)}else{var encoder;var postPageGlobal=pageData=>{if(pageData){postMessage(pageData,[pageData.page.buffer])}};onmessage=(({data:data})=>{if(encoder){switch(data["command"]){case"encode":encoder.encode(data["buffers"]).forEach(pageData=>postPageGlobal(pageData));break;case"getHeaderPages":postPageGlobal(encoder.generateIdPage());postPageGlobal(encoder.generateCommentPage());break;case"done":encoder.encodeFinalFrame().forEach(pageData=>postPageGlobal(pageData));encoder.destroy();encoder=null;postMessage({message:"done"});break;case"flush":postPageGlobal(encoder.flush());postMessage({message:"flushed"});break;default:}}switch(data["command"]){case"close":close();break;case"init":encoder=new OggOpusEncoder(data,Module);postMessage({message:"ready"});break;default:}})}var module=module||{};module.exports={Module:Module,OggOpusEncoder:OggOpusEncoder}; diff --git a/main/manager-web/public/index.html b/main/manager-web/public/index.html index 40f0613c..23f19907 100644 --- a/main/manager-web/public/index.html +++ b/main/manager-web/public/index.html @@ -1,17 +1,33 @@ - - - - - - 小智-智控台 - - - -

- - - + + + + + + + + <%= process.env.VUE_APP_TITLE %> + + <% if (htmlWebpackPlugin.options.cdn) { %> + <% for (var i in htmlWebpackPlugin.options.cdn.css) { %> + + <% } %> + <% } %> + + + + +
+ + <% if (htmlWebpackPlugin.options.cdn) { %> + <% for (var i in htmlWebpackPlugin.options.cdn.js) { %> + + <% } %> + <% } %> + + + \ No newline at end of file diff --git a/main/manager-web/src/App.vue b/main/manager-web/src/App.vue index 9c7e6db7..e6ebe913 100644 --- a/main/manager-web/src/App.vue +++ b/main/manager-web/src/App.vue @@ -27,6 +27,23 @@ nav { } } +.copyright { + text-align: center; + color:rgb(0, 0, 0); + font-size: 12px; + font-weight: 400; + margin-top: auto; + padding: 30px 0 20px; + position: absolute; + bottom: 0; + left: 50%; + transform: translateX(-50%); + width: 100%; +} +.el-message { + top: 45px !important; +} + - \ No newline at end of file diff --git a/main/manager-web/src/apis/api.js b/main/manager-web/src/apis/api.js index bb6ec96b..a2354e0e 100755 --- a/main/manager-web/src/apis/api.js +++ b/main/manager-web/src/apis/api.js @@ -1,13 +1,13 @@ // 引入各个模块的请求 import user from './module/user.js' - +import admin from './module/admin.js' /** * 接口地址 * 当前8002端口接口还没开发完成,暂时用 apifoxmock 接口代替 * 如果你想调用8002端口,就用'/xiaozhi-esp32-api/api/v1',请与vue.config.js的devServer配置相结合,方便跨域请求 * */ -const DEV_API_SERVICE = 'https://apifoxmock.com/m1/5931378-5618560-default' +const DEV_API_SERVICE = 'https://2662r3426b.vicp.fun/xiaozhi-esp32-api' // 8002开发完成完成后使用这个 // const DEV_API_SERVICE = '/xiaozhi-esp32-api' @@ -16,6 +16,7 @@ const DEV_API_SERVICE = 'https://apifoxmock.com/m1/5931378-5618560-default' * @returns {string} */ export function getServiceUrl() { + // return '/xiaozhi-esp32-api' return DEV_API_SERVICE } diff --git a/main/manager-web/src/apis/httpRequest.js b/main/manager-web/src/apis/httpRequest.js index 98f47bf7..44d939e7 100755 --- a/main/manager-web/src/apis/httpRequest.js +++ b/main/manager-web/src/apis/httpRequest.js @@ -105,11 +105,12 @@ function httpHandlerError(info, callBack) { /** 请求成功,退出该函数 可以根据项目需求来判断是否请求成功。这里判断的是status为200的时候是成功 */ let networkError = false if (info.status === 200) { - if (info.data.code === 'success' || info.data.code === 0 || info.data.code === undefined) { return networkError }else if (info.data.code === 401) { - goToPage(Constant.PAGE.LOGIN, true) + console.log('触发 401,清除 Token 并跳转登录页'); + store.commit('clearAuth'); + goToPage(Constant.PAGE.LOGIN, true); return true } else { showDanger(info.data.msg) diff --git a/main/manager-web/src/apis/module/admin.js b/main/manager-web/src/apis/module/admin.js new file mode 100644 index 00000000..83da3023 --- /dev/null +++ b/main/manager-web/src/apis/module/admin.js @@ -0,0 +1,61 @@ +import RequestService from '../httpRequest' +import {getServiceUrl} from '../api' + + +export default { + // 用户列表 + getUserList(params, callback) { + const queryParams = new URLSearchParams({ + page: params.page, + limit: params.limit, + mobile: params.mobile + }).toString(); + + RequestService.sendRequest() + .url(`${getServiceUrl()}/api/v1/admin/users?${queryParams}`) + .method('GET') + .success((res) => { + RequestService.clearRequestTime() + callback(res) + }) + .fail((err) => { + console.error('请求失败:', err) + RequestService.reAjaxFun(() => { + this.getUserList(callback) + }) + }).send() + }, + // 删除用户 + deleteUser(id, callback) { + RequestService.sendRequest() + .url(`${getServiceUrl()}/api/v1/admin/users/${id}`) + .method('DELETE') + .success((res) => { + RequestService.clearRequestTime() + callback(res) + }) + .fail((err) => { + console.error('删除失败:', err) + RequestService.reAjaxFun(() => { + this.deleteUser(id, callback) + }) + }).send() + }, + // 重置用户密码 + resetUserPassword(id, callback) { + RequestService.sendRequest() + .url(`${getServiceUrl()}/api/v1/admin/users/${id}`) + .method('PUT') + .success((res) => { + RequestService.clearRequestTime() + callback(res) + }) + .fail((err) => { + console.error('重置密码失败:', err) + RequestService.reAjaxFun(() => { + this.resetUserPassword(id, callback) + }) + }).send() + } + +} diff --git a/main/manager-web/src/apis/module/device.js b/main/manager-web/src/apis/module/device.js new file mode 100644 index 00000000..e8dc2c71 --- /dev/null +++ b/main/manager-web/src/apis/module/device.js @@ -0,0 +1,54 @@ +import RequestService from '../httpRequest' +import {getServiceUrl} from '../api' + +export default { + // 已绑设备 + getAgentBindDevices(agentId, callback) { + RequestService.sendRequest() + .url(`${getServiceUrl()}/api/v1/device/bind/${agentId}`) + .method('GET') + .success((res) => { + RequestService.clearRequestTime(); + callback(res); + }) + .fail((err) => { + console.error('获取设备列表失败:', err); + RequestService.reAjaxFun(() => { + this.getAgentBindDevices(agentId, callback); + }); + }).send(); + }, + // 解绑设备 + unbindDevice(device_id, callback) { + RequestService.sendRequest() + .url(`${getServiceUrl()}/api/v1/device/unbind`) + .method('POST') + .data({ deviceId: device_id }) + .success((res) => { + RequestService.clearRequestTime(); + callback(res); + }) + .fail((err) => { + console.error('解绑设备失败:', err); + RequestService.reAjaxFun(() => { + this.unbindDevice(device_id, callback); + }); + }).send(); + }, + // 绑定设备 + bindDevice(agentId, deviceCode, callback) { + RequestService.sendRequest() + .url(`${getServiceUrl()}/api/v1/device/bind/${agentId}/${deviceCode}`) + .method('POST') + .success((res) => { + RequestService.clearRequestTime(); + callback(res); + }) + .fail((err) => { + console.error('绑定设备失败:', err); + RequestService.reAjaxFun(() => { + this.bindDevice(agentId, deviceCode, callback); + }); + }).send(); + }, +} \ No newline at end of file diff --git a/main/manager-web/src/apis/module/model.js b/main/manager-web/src/apis/module/model.js new file mode 100644 index 00000000..2534bb5a --- /dev/null +++ b/main/manager-web/src/apis/module/model.js @@ -0,0 +1,30 @@ +import RequestService from '../httpRequest' +import {getServiceUrl} from '../api' + + +export default { + // 获取模型配置列表 + getModelList(params, callback) { + const queryParams = new URLSearchParams({ + modelType: params.modelType, + modelName: params.modelName || '', + page: params.page || 0, + limit: params.limit || 10 + }).toString(); + + RequestService.sendRequest() + .url(`${getServiceUrl()}/api/v1/models/models/list?${queryParams}`) + .method('GET') + .success((res) => { + RequestService.clearRequestTime() + callback(res) + }) + .fail((err) => { + console.error('获取模型列表失败:', err) + RequestService.reAjaxFun(() => { + this.getModelList(params, callback) + }) + }).send() + }, + +} diff --git a/main/manager-web/src/apis/module/user.js b/main/manager-web/src/apis/module/user.js index 5f5eb931..8464794c 100755 --- a/main/manager-web/src/apis/module/user.js +++ b/main/manager-web/src/apis/module/user.js @@ -21,7 +21,6 @@ export default { }, // 获取验证码 getCaptcha(uuid, callback) { - RequestService.sendRequest() .url(`${getServiceUrl()}/api/v1/user/captcha?uuid=${uuid}`) .method('GET') @@ -52,7 +51,6 @@ export default { .fail(() => { }).send() }, - // 保存设备配置 saveDeviceConfig(device_id, configData, callback) { RequestService.sendRequest() @@ -106,54 +104,4 @@ export default { }) .send(); }, - - // 已绑设备 - getAgentBindDevices(agentId, callback) { - RequestService.sendRequest() - .url(`${getServiceUrl()}/api/v1/user/agent/device/bind/${agentId}`) - .method('GET') - .success((res) => { - RequestService.clearRequestTime(); - callback(res); - }) - .fail((err) => { - console.error('获取设备列表失败:', err); - RequestService.reAjaxFun(() => { - this.getAgentBindDevices(agentId, callback); - }); - }).send(); - }, - // 解绑设备 - unbindDevice(device_id, callback) { - RequestService.sendRequest() - .url(`${getServiceUrl()}/api/v1/user/device/unbind/${device_id}`) - .method('PUT') - .success((res) => { - RequestService.clearRequestTime(); - callback(res); - }) - .fail((err) => { - console.error('解绑设备失败:', err); - RequestService.reAjaxFun(() => { - this.unbindDevice(device_id, callback); - }); - }).send(); - }, - // 绑定设备 - bindDevice(agentId, code, callback) { - RequestService.sendRequest() - .url(`${getServiceUrl()}/api/v1/user/agent/device/bind/${agentId}`) - .method('POST') - .data({ code }) - .success((res) => { - RequestService.clearRequestTime(); - callback(res); - }) - .fail((err) => { - console.error('绑定设备失败:', err); - RequestService.reAjaxFun(() => { - this.bindDevice(agentId, code, callback); - }); - }).send(); - }, } diff --git a/main/manager-web/src/assets/header/model_config.png b/main/manager-web/src/assets/header/model_config.png new file mode 100644 index 00000000..407e0a48 Binary files /dev/null and b/main/manager-web/src/assets/header/model_config.png differ diff --git a/main/manager-web/src/assets/header/robot.png b/main/manager-web/src/assets/header/robot.png new file mode 100644 index 00000000..a1d7f7c5 Binary files /dev/null and b/main/manager-web/src/assets/header/robot.png differ diff --git a/main/manager-web/src/assets/header/user_management.png b/main/manager-web/src/assets/header/user_management.png new file mode 100644 index 00000000..ce633674 Binary files /dev/null and b/main/manager-web/src/assets/header/user_management.png differ diff --git a/main/manager-web/src/assets/login/background.png b/main/manager-web/src/assets/login/background.png deleted file mode 100644 index e81d6ecc..00000000 Binary files a/main/manager-web/src/assets/login/background.png and /dev/null differ diff --git a/main/manager-web/src/assets/login/login-person.png b/main/manager-web/src/assets/login/login-person.png new file mode 100644 index 00000000..5a98a167 Binary files /dev/null and b/main/manager-web/src/assets/login/login-person.png differ diff --git a/main/manager-web/src/assets/model/inner_conf.png b/main/manager-web/src/assets/model/inner_conf.png new file mode 100644 index 00000000..d750d05a Binary files /dev/null and b/main/manager-web/src/assets/model/inner_conf.png differ diff --git a/main/manager-web/src/assets/model/model.png b/main/manager-web/src/assets/model/model.png new file mode 100644 index 00000000..f08ecb86 Binary files /dev/null and b/main/manager-web/src/assets/model/model.png differ diff --git a/main/manager-web/src/assets/model/output_conf.png b/main/manager-web/src/assets/model/output_conf.png new file mode 100644 index 00000000..f09b121e Binary files /dev/null and b/main/manager-web/src/assets/model/output_conf.png differ diff --git a/main/manager-web/src/assets/welcome/background.png b/main/manager-web/src/assets/welcome/background.png deleted file mode 100644 index b39cbebb..00000000 Binary files a/main/manager-web/src/assets/welcome/background.png and /dev/null differ diff --git a/main/manager-web/src/assets/welcome/github.png b/main/manager-web/src/assets/welcome/github.png deleted file mode 100644 index 0e984ec7..00000000 Binary files a/main/manager-web/src/assets/welcome/github.png and /dev/null differ diff --git a/main/manager-web/src/assets/welcome/more.png b/main/manager-web/src/assets/welcome/more.png deleted file mode 100644 index 5acbfa6a..00000000 Binary files a/main/manager-web/src/assets/welcome/more.png and /dev/null differ diff --git a/main/manager-web/src/assets/welcome/questions.png b/main/manager-web/src/assets/welcome/questions.png deleted file mode 100644 index 1fe2ab9b..00000000 Binary files a/main/manager-web/src/assets/welcome/questions.png and /dev/null differ diff --git a/main/manager-web/src/assets/xiaozhi-ai.png b/main/manager-web/src/assets/xiaozhi-ai.png index 008df015..ef3834af 100644 Binary files a/main/manager-web/src/assets/xiaozhi-ai.png and b/main/manager-web/src/assets/xiaozhi-ai.png differ diff --git a/main/manager-web/src/assets/xiaozhi-logo.png b/main/manager-web/src/assets/xiaozhi-logo.png index 33050397..9e664970 100644 Binary files a/main/manager-web/src/assets/xiaozhi-logo.png and b/main/manager-web/src/assets/xiaozhi-logo.png differ diff --git a/main/manager-web/src/components/ActivateDeviceDialog.vue b/main/manager-web/src/components/ActivateDeviceDialog.vue new file mode 100644 index 00000000..59384e79 --- /dev/null +++ b/main/manager-web/src/components/ActivateDeviceDialog.vue @@ -0,0 +1,98 @@ + + + + + \ No newline at end of file diff --git a/main/manager-web/src/components/AddDeviceDialog.vue b/main/manager-web/src/components/AddDeviceDialog.vue index e7ba492e..11189df7 100644 --- a/main/manager-web/src/components/AddDeviceDialog.vue +++ b/main/manager-web/src/components/AddDeviceDialog.vue @@ -33,16 +33,52 @@ export default { name: 'AddDeviceDialog', props: { - visible: { type: Boolean, required: true } + visible: { type: Boolean, required: true }, + agentId: { type: String, required: true } }, data() { - return { deviceCode: "" } + return { + deviceCode: "", + loading: false, + } }, methods: { confirm() { - this.$emit('update:visible', false) - this.$emit('added', this.deviceCode) - this.deviceCode = "" + if (!/^\d{6}$/.test(this.deviceCode)) { + this.$message.error('请输入6位数字验证码'); + return; + } + this.loading = true; + import('@/apis/module/device').then(({ default: deviceApi }) => { + deviceApi.bindDevice( + this.agentId, + this.deviceCode, ({data}) => { + this.loading = false; + if (data.code === 0) { + this.$emit('refresh'); + this.$message.success({ + message: '设备绑定成功', + showClose: true + }); + this.closeDialog(); + } else { + this.$message.error({ + message: data.msg || '绑定失败', + showClose: true + }); + } + } + ); + }).catch((err) => { + this.loading = false; + console.error('API模块加载失败:', err); + this.$message.error('绑定服务不可用'); + }); + }, + closeDialog() { + this.$emit('update:visible', false); + this.deviceCode = ''; + }, cancel() { this.$emit('update:visible', false) diff --git a/main/manager-web/src/components/AddModelDialog.vue b/main/manager-web/src/components/AddModelDialog.vue new file mode 100644 index 00000000..074be175 --- /dev/null +++ b/main/manager-web/src/components/AddModelDialog.vue @@ -0,0 +1,387 @@ + + + + + \ No newline at end of file diff --git a/main/manager-web/src/components/AddWisdomBodyDialog.vue b/main/manager-web/src/components/AddWisdomBodyDialog.vue index 5925470c..b0ace54f 100644 --- a/main/manager-web/src/components/AddWisdomBodyDialog.vue +++ b/main/manager-web/src/components/AddWisdomBodyDialog.vue @@ -2,7 +2,7 @@
- +
添加智能体
@@ -47,7 +47,10 @@ export default { return; } userApi.addAgent(this.wisdomBodyName, (res) => { - this.$message.success('添加成功'); + this.$message.success({ + message: '添加成功', + showClose: true + }); this.$emit('confirm', res); this.$emit('update:visible', false); this.wisdomBodyName = ""; diff --git a/main/manager-web/src/components/ChangePasswordDialog.vue b/main/manager-web/src/components/ChangePasswordDialog.vue new file mode 100644 index 00000000..a0bb1f7d --- /dev/null +++ b/main/manager-web/src/components/ChangePasswordDialog.vue @@ -0,0 +1,147 @@ + + + + + \ No newline at end of file diff --git a/main/manager-web/src/components/DeviceItem.vue b/main/manager-web/src/components/DeviceItem.vue index 912fd9d5..729b3d1f 100644 --- a/main/manager-web/src/components/DeviceItem.vue +++ b/main/manager-web/src/components/DeviceItem.vue @@ -6,7 +6,7 @@
+ style="width: 18px;height: 18px;margin-right: 10px;" @click.stop="handleDelete" />
@@ -17,16 +17,16 @@ 音色模型:{{ device.ttsVoiceName }}
-
+
配置角色
-
- 声纹识别 -
-
- 历史对话 -
-
+ + + + + + +
设备管理
@@ -44,6 +44,17 @@ export default { }, data() { return { switchValue: false } + }, + methods: { + handleDelete() { + this.$emit('delete', this.device.agentId) + }, + handleConfigure() { + this.$router.push({ path: '/role-config', query: { agentId: this.device.agentId } }); + }, + handleDeviceManage() { + this.$router.push({ path: '/device-management', query: { agentId: this.device.agentId } }); + } } } diff --git a/main/manager-web/src/components/EditVoiceDialog.vue b/main/manager-web/src/components/EditVoiceDialog.vue new file mode 100644 index 00000000..b7feb78d --- /dev/null +++ b/main/manager-web/src/components/EditVoiceDialog.vue @@ -0,0 +1,149 @@ + + + + + diff --git a/main/manager-web/src/components/HeaderBar.vue b/main/manager-web/src/components/HeaderBar.vue index acc0e981..df5dbc95 100644 --- a/main/manager-web/src/components/HeaderBar.vue +++ b/main/manager-web/src/components/HeaderBar.vue @@ -1,50 +1,85 @@ \ No newline at end of file diff --git a/main/manager-web/src/components/ModelEditDialog.vue b/main/manager-web/src/components/ModelEditDialog.vue new file mode 100644 index 00000000..09e5570c --- /dev/null +++ b/main/manager-web/src/components/ModelEditDialog.vue @@ -0,0 +1,159 @@ + + + + + diff --git a/main/manager-web/src/components/TtsModel.vue b/main/manager-web/src/components/TtsModel.vue new file mode 100644 index 00000000..14535592 --- /dev/null +++ b/main/manager-web/src/components/TtsModel.vue @@ -0,0 +1,201 @@ + + + + + diff --git a/main/manager-web/src/components/ViewPasswordDialog.vue b/main/manager-web/src/components/ViewPasswordDialog.vue new file mode 100644 index 00000000..26302c9f --- /dev/null +++ b/main/manager-web/src/components/ViewPasswordDialog.vue @@ -0,0 +1,97 @@ + + + + + diff --git a/main/manager-web/src/main.js b/main/manager-web/src/main.js index 2b6531df..12d672ca 100644 --- a/main/manager-web/src/main.js +++ b/main/manager-web/src/main.js @@ -5,8 +5,10 @@ import store from './store' import 'normalize.css/normalize.css' // A modern alternative to CSS resets import ElementUI from 'element-ui'; import 'element-ui/lib/theme-chalk/index.css'; +import './styles/global.scss' Vue.use(ElementUI); + Vue.config.productionTip = false new Vue({ diff --git a/main/manager-web/src/router/index.js b/main/manager-web/src/router/index.js index d3add00a..a6f2f2a6 100644 --- a/main/manager-web/src/router/index.js +++ b/main/manager-web/src/router/index.js @@ -39,19 +39,73 @@ const routes = [ return import('../views/register.vue') } }, - // 新增设备管理页面路由 + // 设备管理页面路由 { path: '/device-management', name: 'DeviceManagement', component: function () { return import('../views/DeviceManagement.vue') } + }, + // 添加用户管理路由 + { + path: '/user-management', + name: 'UserManagement', + component: function () { + return import('../views/UserManagement.vue') + } + }, + { + path: '/model-config', + name: 'ModelConfig', + component: function () { + return import('../views/ModelConfig.vue') + } + }, + { + path: '/test', + name: 'TestServer', + component: function () { + return import('../views/test.vue') + } + }, - } ] const router = new VueRouter({ routes }) +// 全局处理重复导航,改为刷新页面 +const originalPush = VueRouter.prototype.push +VueRouter.prototype.push = function push(location) { + return originalPush.call(this, location).catch(err => { + if (err.name === 'NavigationDuplicated') { + // 如果是重复导航,刷新页面 + window.location.reload() + } else { + // 其他错误正常抛出 + throw err + } + }) +} + +// 需要登录才能访问的路由 +const protectedRoutes = ['home', 'RoleConfig', 'DeviceManagement', 'UserManagement', 'ModelConfig'] + +// 路由守卫 +router.beforeEach((to, from, next) => { + // 检查是否是需要保护的路由 + if (protectedRoutes.includes(to.name)) { + // 从localStorage获取token + const token = localStorage.getItem('token') + if (!token) { + // 未登录,跳转到登录页 + next({ name: 'login', query: { redirect: to.fullPath } }) + return + } + } + next() +}) + export default router diff --git a/main/manager-web/src/store/index.js b/main/manager-web/src/store/index.js index 0f810894..15377c71 100644 --- a/main/manager-web/src/store/index.js +++ b/main/manager-web/src/store/index.js @@ -1,12 +1,15 @@ import Vue from 'vue' import Vuex from 'vuex' import Constant from '../utils/constant' +import {goToPage} from "@/utils"; Vue.use(Vuex) export default new Vuex.Store({ state: { - token: '' + token: '', + userInfo: {}, // 添加用户信息存储 + isSuperAdmin: false // 添加superAdmin状态 }, getters: { getToken(state) { @@ -14,16 +17,46 @@ export default new Vuex.Store({ state.token = localStorage.getItem('token') } return state.token + }, + getUserInfo(state) { + return state.userInfo + }, + getIsSuperAdmin(state) { + if (localStorage.getItem('isSuperAdmin') === null) { + return state.isSuperAdmin + } + return localStorage.getItem('isSuperAdmin') === 'true' } }, mutations: { setToken(state, token) { state.token = token - localStorage.token = token + localStorage.setItem('token', token) + }, + setUserInfo(state, userInfo) { + state.userInfo = userInfo + const isSuperAdmin = userInfo.superAdmin === 1 + state.isSuperAdmin = isSuperAdmin + localStorage.setItem('isSuperAdmin', isSuperAdmin) + }, + clearAuth(state) { + state.token = '' + state.userInfo = {} + state.isSuperAdmin = false + localStorage.removeItem('token') + localStorage.removeItem('isSuperAdmin') } }, actions: { + // 添加 logout action + logout({ commit }) { + return new Promise((resolve) => { + commit('clearAuth') + goToPage(Constant.PAGE.LOGIN,true); + window.location.reload(); // 彻底重置状态 + }) + } }, modules: { } -}) +}) \ No newline at end of file diff --git a/main/manager-web/src/styles/global.scss b/main/manager-web/src/styles/global.scss new file mode 100644 index 00000000..dfc8e51b --- /dev/null +++ b/main/manager-web/src/styles/global.scss @@ -0,0 +1,14 @@ +// 覆盖 autofill 样式 +input:-webkit-autofill, +input:-webkit-autofill:hover, +input:-webkit-autofill:focus, +textarea:-webkit-autofill, +textarea:-webkit-autofill:hover, +textarea:-webkit-autofill:focus, +select:-webkit-autofill, +select:-webkit-autofill:hover, +select:-webkit-autofill:focus { + -webkit-box-shadow: 0 0 0px 1000px transparent inset; + transition: background-color 5000s ease-in-out 0s; + background-color: transparent; +} \ No newline at end of file diff --git a/main/manager-web/src/utils/index.js b/main/manager-web/src/utils/index.js index b9c22fbc..aeb728b4 100755 --- a/main/manager-web/src/utils/index.js +++ b/main/manager-web/src/utils/index.js @@ -54,7 +54,8 @@ export function showDanger(msg) { } Message({ message: msg, - type: 'error' + type: 'error', + showClose: true }) } @@ -68,7 +69,8 @@ export function showWarning(msg) { } Message({ message: msg, - type: 'warning' + type: 'warning', + showClose: true }); } @@ -81,7 +83,8 @@ export function showWarning(msg) { export function showSuccess(msg) { Message({ message: msg, - type: 'success' + type: 'success', + showClose: true }) } diff --git a/main/manager-web/src/views/DeviceManagement.vue b/main/manager-web/src/views/DeviceManagement.vue index 06c4317c..ed3688ae 100644 --- a/main/manager-web/src/views/DeviceManagement.vue +++ b/main/manager-web/src/views/DeviceManagement.vue @@ -1,20 +1,20 @@