diff --git a/.DS_Store b/.DS_Store
index dae9c7d0dcdc21ba5d17ba2e3a4c0152f1cf5af3..7c151520d1ec9af8f44f958c18c4acaf27efe015 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/packages/check-file-name/main.js b/packages/check-file-name/main.js
new file mode 100644
index 0000000000000000000000000000000000000000..6b88848271172857a66582f8931ada937b282bb1
--- /dev/null
+++ b/packages/check-file-name/main.js
@@ -0,0 +1,28 @@
+var fs = require('fs-extra');
+var file = require('./util/file');
+
+module.exports = {
+    load() {
+    },
+
+    unload() {
+    },
+
+    replaceDirUuid: function (path, dbpath) {
+        Editor.log('开始检查:' + path);
+        file.findDirUuid(path);
+        Editor.log('资源检查完成');
+    },
+
+    messages: {
+        'checkFileName'() {
+            var uuids = Editor.Selection.curSelection('asset');
+            uuids.forEach((uuid) => {
+                var dir_path = Editor.assetdb._uuid2path[uuid];
+                if (fs.existsSync(dir_path)) {
+                    this.replaceDirUuid(dir_path, Editor.assetdb.uuidToUrl(uuid));
+                }
+            });
+        },
+    },
+}
\ No newline at end of file
diff --git a/packages/check-file-name/package-lock.json b/packages/check-file-name/package-lock.json
new file mode 100644
index 0000000000000000000000000000000000000000..d594378507d11c50af4a85363a384147245e859d
--- /dev/null
+++ b/packages/check-file-name/package-lock.json
@@ -0,0 +1,30 @@
+{
+    "name": "check-file-name",
+    "version": "0.0.1",
+    "lockfileVersion": 2,
+    "requires": true,
+    "packages": {
+        "": {
+            "version": "0.0.1",
+            "dependencies": {
+                "node-uuid": "1.4.8"
+            }
+        },
+        "node_modules/node-uuid": {
+            "version": "1.4.8",
+            "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz",
+            "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=",
+            "deprecated": "Use uuid module instead",
+            "bin": {
+                "uuid": "bin/uuid"
+            }
+        }
+    },
+    "dependencies": {
+        "node-uuid": {
+            "version": "1.4.8",
+            "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz",
+            "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc="
+        }
+    }
+}
diff --git a/packages/check-file-name/package.json b/packages/check-file-name/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..7aa059e7c7e14baf0c13afe51ff9d35cf9fe80d6
--- /dev/null
+++ b/packages/check-file-name/package.json
@@ -0,0 +1,15 @@
+{
+    "name": "check-file-name",
+    "version": "0.0.1",
+    "description": "check-file-name",
+    "author": "Cocos Creator",
+    "main": "main.js",
+    "main-menu": {
+        "i18n:MAIN_MENU.package.title/check-file-name": {
+            "message": "check-file-name:checkFileName"
+        }
+    },
+    "dependencies": {
+        "node-uuid": "1.4.8"
+    }
+}
diff --git a/packages/check-file-name/util/file.js b/packages/check-file-name/util/file.js
new file mode 100644
index 0000000000000000000000000000000000000000..d9cd1467ce432c25e38a9d86fb9389524c500386
--- /dev/null
+++ b/packages/check-file-name/util/file.js
@@ -0,0 +1,74 @@
+var fs = require("fs-extra");
+var path = require("path");
+var AppName = ""
+module.exports = {
+    /**
+     * 递归目录 检查文件名
+     * 参考 https://docs.cocos.com/creator/manual/zh/advanced-topics/meta.html
+     */
+    findDirUuid: function (dir) {
+        if(AppName == '') {
+            AppName  = this.getRootDirName(dir);
+            if(AppName != "") {
+                Editor.log("AppName: " + AppName);
+            }
+        }
+        var stat = fs.statSync(dir);
+        if (!stat.isDirectory()) {
+            return;
+        }
+        var subpaths = fs.readdirSync(dir),
+            subpath;
+        for (var i = 0; i < subpaths.length; ++i) {
+            if (subpaths[i][0] === ".") {
+                continue;
+            }
+            subpath = path.join(dir, subpaths[i]);
+            stat = fs.statSync(subpath);
+            if (stat.isDirectory()) {
+                this.findDirUuid(subpath);
+            } else if (stat.isFile()) {
+                var metastr = subpath.substr(subpath.length - 5, 5);
+                if (metastr != ".meta") {
+                    this.check(AppName, subpaths[i]);
+                }
+            }
+        }
+    },
+
+    getRootDirName: function (path) {
+        let pArr = path.split("/");
+        let assteIndex = -1;
+        pArr.find((item, index) => {
+            if(item == 'assets') {
+                assteIndex = index;
+                return true
+            } else {
+                return false
+            }
+        })
+        if(assteIndex > 0 && assteIndex<(pArr.length-1)) {
+            return pArr[assteIndex + 1];
+        } else {
+            return ""
+        }
+    },
+
+    check: (appName, filePath) => {
+        if(escape(filePath).indexOf("%u")>=0) {
+            Editor.log(`检测到[中文或中文符号]命名的文件: ${filePath}`);
+        }
+        
+        if (!/^\S*$/.test(filePath)) {
+            Editor.log(`检测到[包含空格]命名的文件: ${filePath}`);
+        }
+        
+        if (/[-]/.test(filePath)) {
+            Editor.log(`检测到存在[包含减号(-)]命名的文件: ${filePath}`);
+        }
+
+        if(filePath.indexOf(appName) == -1 && (filePath.endsWith(".js") ||  filePath.endsWith(".ts"))) {
+            Editor.log(`检测到[不包含包名(${appName})]的文件: ${filePath}`);
+        }
+    }
+};
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/.gitignore" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/.gitignore"
new file mode 100644
index 0000000000000000000000000000000000000000..baaf5317ebfe15a155b962d02056e1c8ef95cdda
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/.gitignore"
@@ -0,0 +1,2 @@
+# 配置文件
+config.json
\ No newline at end of file
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/CHANGELOG.md" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/CHANGELOG.md"
new file mode 100644
index 0000000000000000000000000000000000000000..c0ab77a8d778e2d09b48aaf869e422558e3fd89c
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/CHANGELOG.md"
@@ -0,0 +1,30 @@
+### 1.3.0.20210929
+
+1. 代码重构
+2. 引入 eazax 框架
+3. 查找性能大幅提升
+4. 文件解析优化,增强稳定性
+5. 去除「通过 uuid 查找」面板
+6. 加入检查更新机制
+
+
+
+### 1.2.0.20210405
+
+1. 修复“双开编辑器卡死”的问题
+2. 代码优化,提高查找速度
+3. 增加多语言(英语)支持
+4. 支持自定义快捷键(设置面板)
+
+
+
+### 1.1.0-20201112
+
+1. 增加“通过 uuid 查找”功能(新增面板)
+2. 优化代码
+
+
+
+### 1.0.0-20201103
+
+1. 首次发布
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/LICENSE" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/LICENSE"
new file mode 100644
index 0000000000000000000000000000000000000000..330185a8e7f1f998d8d9d979bfa9e8d1defbb5fc
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/LICENSE"
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 陈皮皮
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/README.en.md" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/README.en.md"
new file mode 100644
index 0000000000000000000000000000000000000000..60f8cbfbd07b640b231d4be0029b4a10bf87fc14
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/README.en.md"
@@ -0,0 +1,111 @@
+# References Finder
+
+## Introduction
+
+[Cocos Creator Editor Extension]
+
+**Find asset references in seconds by one press.**
+
+
+
+## Open Source
+
+This extension is an open source project, here is the git repository: [https://gitee.com/ifaswind/ccc-references-finder](https://gitee.com/ifaswind/ccc-references-finder)
+
+If you like this project, don't forget to star [![star](https://gitee.com/ifaswind/ccc-references-finder/badge/star.svg?theme=dark)](https://gitee.com/ifaswind/ccc-references-finder/stargazers)!
+
+*If you have any usage problems, just create an issue on Gitee or add my WeChat `im_chenpipi` and leave a message.*
+
+
+
+## Screenshots
+
+![screenshot-1](https://gitee.com/ifaswind/image-storage/raw/master/repositories/ccc-references-finder/screenshot-1.png)
+
+![screenshot-2](https://gitee.com/ifaswind/image-storage/raw/master/repositories/ccc-references-finder/screenshot-2.png)
+
+![settings-panel](https://gitee.com/ifaswind/image-storage/raw/master/repositories/ccc-references-finder/settings-panel.png)
+
+
+
+## Environment
+
+Platform: Windows、macOS
+
+Engine: Cocos Creator 2.x
+
+
+
+## Download & Installation
+
+### Install from Cocos Store
+
+You can find this extension in Cocos Store now, click on *Extension -> Cocos Store* option to open the Cocos Store.
+
+Enter "**References Finder**" in the search bar, find it and then install it.
+
+![cocos-store](https://gitee.com/ifaswind/image-storage/raw/master/repositories/ccc-references-finder/cocos-store.png)
+
+*References Finder: [https://store.cocos.com/app/detail/2531](https://store.cocos.com/app/detail/2531)*
+
+
+
+### Download from git repository
+
+Click [here](https://gitee.com/ifaswind/ccc-references-finder/releases) or go to the release panel, download the latest version package of this extension.
+
+And then unzip the package:
+
+- Windows: Unzip to `C:\Users\${your username}\.CocosCreator\packages\`
+- macOS: Unzip to `~/.CocosCreator/packages/`
+
+For example, on my Windows computer, the full path of `package.json` file should be `C:\Users\Shaun\.CocosCreator\packages\ccc-references-finder\package.json`.
+
+
+
+## Usage
+
+### Find Asset References
+
+1. Select any asset(s) in Asset Panel.
+
+2. Press the hotkey (The default is `F6`) or click on *Extension -> References Finder -> Find Selected* option to find references.
+
+3. Then all references of asset would be printed on Console Panel.
+
+
+
+### Settings
+
+Click on *Extension -> References Finder -> Setting* option to open the setting panel.
+
+- **Show Details**: Show more details(node, component, property)
+- **Fold Result**: Fold result in one log
+
+In the **Hotkey** option, you can choose a hotkey(shortcut, for finding references of current selected asset) in preset list, or you can customize one in **Custom** option by yourself.
+
+One thing you should know, not every keys/keys-combinations can be used, because some keys/keys-combinations have been used by the system or Cocos Creator.
+
+*Accelerator reference: [https://www.electronjs.org/docs/api/accelerator](https://www.electronjs.org/docs/api/accelerator)*
+
+🥳 Enjoy!
+
+
+
+---
+
+
+
+# 公众号
+
+## 菜鸟小栈
+
+😺 我是陈皮皮,一个还在不断学习的游戏开发者,一个热爱分享的 Cocos Star Writer。
+
+🎨 这是我的个人公众号,专注但不仅限于游戏开发和前端技术分享。
+
+💖 每一篇原创都非常用心,你的关注就是我原创的动力!
+
+> Input and output.
+
+![](https://gitee.com/ifaswind/image-storage/raw/master/weixin/official-account.png)
\ No newline at end of file
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/README.md" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/README.md"
new file mode 100644
index 0000000000000000000000000000000000000000..b24100111a22f99ba6eabdd0ae3da37fc15ae66d
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/README.md"
@@ -0,0 +1,115 @@
+# 引用查找器
+
+## 介绍
+
+[Cocos Creator 编辑器扩展]
+
+**一键查找资源的所有引用,可精确到预制体或场景中的节点、组件和属性(不包括代码中的动态引用)。**
+
+
+
+## 开源
+
+本扩展项目完全开源,仓库地址:[https://gitee.com/ifaswind/ccc-references-finder](https://gitee.com/ifaswind/ccc-references-finder)
+
+如果你觉得这个项目还不错,请不要忘记点 [![star](https://gitee.com/ifaswind/ccc-references-finder/badge/star.svg?theme=dark)](https://gitee.com/ifaswind/ccc-references-finder/stargazers)!
+
+*如有使用上的问题,可以在 Gitee 仓库中提 Issue 或者添加我的微信 `im_chenpipi` 并留言。*
+
+
+
+## 截图
+
+![screenshot-1](https://gitee.com/ifaswind/image-storage/raw/master/repositories/ccc-references-finder/screenshot-1.png)
+
+![screenshot-2](https://gitee.com/ifaswind/image-storage/raw/master/repositories/ccc-references-finder/screenshot-2.png)
+
+![settings-panel](https://gitee.com/ifaswind/image-storage/raw/master/repositories/ccc-references-finder/settings-panel.png)
+
+
+
+## 运行环境
+
+平台:Windows、macOS
+
+引擎:Cocos Creator 2.x
+
+
+
+## 下载 & 安装
+
+### 扩展商店安装
+
+本扩展已上架 Cocos 商店,点击 Cocos Creator 编辑器顶部菜单栏中的 *扩展 -> 扩展商店* 即可打开扩展商店。
+
+在页面上方的搜索栏中搜索“**引用查找器**”就可以找到本插件,进入详情页即可直接安装(建议安装到全局)。
+
+![cocos-store](https://gitee.com/ifaswind/image-storage/raw/master/repositories/ccc-references-finder/cocos-store.png)
+
+*引用查找器:[https://store.cocos.com/app/detail/2531](https://store.cocos.com/app/detail/2531)*
+
+
+
+### 自行下载安装
+
+在[此处](https://gitee.com/ifaswind/ccc-references-finder/releases)或仓库发行版处下载最新的扩展压缩包。
+
+下载完成后将压缩包解压:
+
+- Windows:解压到 `C:\Users\${你的用户名}\.CocosCreator\packages\` 目录下
+- macOS:解压到 `~/.CocosCreator/packages/` 目录下
+
+以 Windows 为例,扩展的 `package.json` 文件在我的电脑上的完整目录为 `C:\Users\Shaun\.CocosCreator\packages\ccc-references-finder\package.json`。
+
+
+
+## 使用说明
+
+### 一键查找资源引用
+
+安装本扩展后,在资源管理器中选中任意资源,按下快捷键(默认为 `F6`)即可获取该资源的所有引用(不包括代码中的动态引用),结果将在控制台中以文本的方式打印出来。
+
+> 查找快捷键可进入扩展的设置面板进行修改
+
+
+
+### 设置
+
+点击编辑器顶部菜单栏中的 *扩展 -> 引用查找器 -> 设置* 即可打开扩展的设置面板。
+
+- **自动展开结果**:切换不同的结果展示方式(自动展开或手动展开)
+- **精确到组件属性**:引用信息精确到预制体或场景中的节点上的组件和属性(有的话)
+
+在设置面板中你可以更换快速查找引用的快捷键,也可以自定义一个自己喜欢的快捷键。
+
+不过需要注意的是,并非所有的按键都可以使用,因为有些快捷键已被系统或 Cocos Creator 占用。
+
+*键盘快捷键参考:[https://www.electronjs.org/docs/api/accelerator](https://www.electronjs.org/docs/api/accelerator)*
+
+
+
+---
+
+
+
+# 公众号
+
+## 菜鸟小栈
+
+😺 我是陈皮皮,一个还在不断学习的游戏开发者,一个热爱分享的 Cocos Star Writer。
+
+🎨 这是我的个人公众号,专注但不仅限于游戏开发和前端技术分享。
+
+💖 每一篇原创都非常用心,你的关注就是我原创的动力!
+
+> Input and output.
+
+![](https://gitee.com/ifaswind/image-storage/raw/master/weixin/official-account.png)
+
+
+
+## 游戏开发交流群
+
+皮皮创建了一个**游戏开发交流群**,供小伙伴们交流开发经验、问题求助和摸鱼(划掉)。
+
+感兴趣的小伙伴可以添加我微信 `im_chenpipi` 并留言 `加群`。
\ No newline at end of file
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/i18n/en.js" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/i18n/en.js"
new file mode 100644
index 0000000000000000000000000000000000000000..3a0ba2940954ba9fd2156a09954b58d133e13794
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/i18n/en.js"
@@ -0,0 +1,55 @@
+module.exports = {
+    'name': 'References Finder',
+    'find': 'Find Current Selected',
+    'find-panel': 'Find Panel',
+    'settings': 'Settings',
+    'check-update': 'Check Update',
+    // update
+    'current-latest': 'Currently the latest version!',
+    'has-new-version': 'New version found!',
+    'local-version': 'Local version: ',
+    'latest-version': 'Latest version: ',
+    'git-releases': 'Releases: https://gitee.com/ifaswind/ccc-references-finder/releases',
+    'cocos-store': 'Cocos Store: https://store.cocos.com/app/detail/2531',
+    // main
+    'please-select-assets': 'Please select asset(s) in Asset Panel first',
+    'invalid-uuid': 'Invalid uuid',
+    'not-support-folder': 'Does not support folder',
+    'find-asset-refs': 'Find references',
+    'no-refs': 'No references found',
+    'scene': 'Scene',
+    'prefab': 'Prefab',
+    'animation': 'Animation',
+    'material': 'Material',
+    'font': 'Font',
+    'node': 'Node',
+    'component': 'Component',
+    'property': 'Property',
+    'result': 'Reference result',
+    'node-refs': 'Node References',
+    'asset-refs': 'Asset References',
+    'asset-info': 'Asset Info',
+    'asset-type': 'Type: ',
+    'asset-uuid': 'Uuid: ',
+    'asset-url': 'Url: ',
+    'asset-path': 'Path: ',
+    // settings
+    'none': 'None',
+    'select-key': 'Hotkey',
+    'select-key-tooltip': 'Chose a hotkey to open the search bar quickly',
+    'custom-key': 'Custom',
+    'custom-key-placeholder': 'Choose a hotkey above or customize one by yourself',
+    'custom-key-tooltip': 'You can also customize your own hotkey',
+    'auto-check-update': 'Auto Check Update',
+    'auto-check-update-tooltip': 'Check if there is a new version when the extension is loaded',
+    'reference': '· Hotkey customization reference: ',
+    'accelerator': 'Keyboard Shortcuts',
+    'repository': '· Git repository of this extension: ',
+    'apply': 'Apply',
+    'quote-error': 'Do not use double quotes!',
+    'custom-key-error': 'Please specify a hotkey!',
+    'print-details': 'Show Details',
+    'print-details-tooltip': 'Show more details(node, component, property)',
+    'print-folding': 'Fold Result',
+    'print-folding-tooltip': 'Fold result in one log',
+};
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/i18n/zh.js" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/i18n/zh.js"
new file mode 100644
index 0000000000000000000000000000000000000000..c37351655f87c9ca1cb7de755862ce4cbf3e2d68
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/i18n/zh.js"
@@ -0,0 +1,55 @@
+module.exports = {
+    'name': '引用查找器',
+    'find': '查找当前选中资源',
+    'find-panel': '查找面板',
+    'settings': '设置',
+    'check-update': '检查更新',
+    // update
+    'current-latest': '当前已是最新版本!',
+    'has-new-version': '发现新版本!',
+    'local-version': '本地版本:',
+    'latest-version': '最新版本:',
+    'git-releases': '发行版:https://gitee.com/ifaswind/ccc-references-finder/releases',
+    'cocos-store': 'Cocos 商店:https://store.cocos.com/app/detail/2531',
+    // main
+    'please-select-assets': '请先在资源管理器中选择需要查找引用的资源',
+    'invalid-uuid': '无效的 uuid',
+    'not-support-folder': '暂不支持查找文件夹',
+    'find-asset-refs': '查找资源引用',
+    'no-refs': '没有找到该资源的引用',
+    'scene': '场景',
+    'prefab': '预制体',
+    'animation': '动画',
+    'material': '材质',
+    'font': '字体',
+    'node': '节点',
+    'component': '组件',
+    'property': '属性',
+    'result': '引用查找结果',
+    'node-refs': '节点引用',
+    'asset-refs': '资源引用',
+    'asset-info': '资源信息',
+    'asset-type': 'Type:',
+    'asset-uuid': 'Uuid:',
+    'asset-url': 'Url:',
+    'asset-path': 'Path:',
+    // settings
+    'none': 'æ— ',
+    'select-key': '快捷键',
+    'select-key-tooltip': '选择一个快速打开搜索栏的快捷键',
+    'custom-key': '自定义',
+    'custom-key-placeholder': '在上方选择一个快捷键或自定义一个快捷键',
+    'custom-key-tooltip': '自定义快速打开搜索栏的快捷键',
+    'auto-check-update': '自动检查更新',
+    'auto-check-update-tooltip': '扩展启动时自动检查是否有新版本',
+    'reference': '· 快捷键自定义请参考:',
+    'accelerator': '键盘快捷键',
+    'repository': '· 本扩展的 Git 仓库:',
+    'apply': '应用',
+    'quote-error': '请勿使用双引号!',
+    'custom-key-error': '请指定一个快捷键!',
+    'print-details': '展示详情',
+    'print-details-tooltip': '引用查找结果精确到节点、组件和属性',
+    'print-folding': '折叠结果',
+    'print-folding-tooltip': '引用查找结果将需要手动展开,拯救你的控制台',
+};
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/images/search.png" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/images/search.png"
new file mode 100644
index 0000000000000000000000000000000000000000..e2e7521b9a4a5289ce24eea6eb2109829377a2a5
Binary files /dev/null and "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/images/search.png" differ
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/images/settings.png" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/images/settings.png"
new file mode 100644
index 0000000000000000000000000000000000000000..0ecfeec9c0f01184a72a463d7351961707750846
Binary files /dev/null and "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/images/settings.png" differ
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/images/update.png" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/images/update.png"
new file mode 100644
index 0000000000000000000000000000000000000000..6d11595bc4ab1de63a6791effc3e8b1fad099387
Binary files /dev/null and "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/images/update.png" differ
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/images/version.png" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/images/version.png"
new file mode 100644
index 0000000000000000000000000000000000000000..8f12e138cd648430ae52c2a63fa9e3fed0ac9456
Binary files /dev/null and "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/images/version.png" differ
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/jsconfig.json" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/jsconfig.json"
new file mode 100644
index 0000000000000000000000000000000000000000..08b2afb5884db4f17323bf4103734c9128bf789d
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/jsconfig.json"
@@ -0,0 +1,17 @@
+{
+    "compilerOptions": {
+        "target": "es5",
+        "module": "commonjs",
+        "moduleResolution": "node",
+        "resolveJsonModule": true,
+        "checkJs": false
+    },
+    "exclude": [
+        "node_modules"
+    ],
+    "include": [
+        "lib/**/*",
+        "src/**/*",
+        "typings/**/*"
+    ]
+}
\ No newline at end of file
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/lib/node-fetch.js" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/lib/node-fetch.js"
new file mode 100644
index 0000000000000000000000000000000000000000..4b241bfbf8bee961f077bf9574150660355928cd
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/lib/node-fetch.js"
@@ -0,0 +1,1649 @@
+'use strict';
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
+
+var Stream = _interopDefault(require('stream'));
+var http = _interopDefault(require('http'));
+var Url = _interopDefault(require('url'));
+var https = _interopDefault(require('https'));
+var zlib = _interopDefault(require('zlib'));
+
+// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js
+
+// fix for "Readable" isn't a named export issue
+const Readable = Stream.Readable;
+
+const BUFFER = Symbol('buffer');
+const TYPE = Symbol('type');
+
+class Blob {
+	constructor() {
+		this[TYPE] = '';
+
+		const blobParts = arguments[0];
+		const options = arguments[1];
+
+		const buffers = [];
+		let size = 0;
+
+		if (blobParts) {
+			const a = blobParts;
+			const length = Number(a.length);
+			for (let i = 0; i < length; i++) {
+				const element = a[i];
+				let buffer;
+				if (element instanceof Buffer) {
+					buffer = element;
+				} else if (ArrayBuffer.isView(element)) {
+					buffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength);
+				} else if (element instanceof ArrayBuffer) {
+					buffer = Buffer.from(element);
+				} else if (element instanceof Blob) {
+					buffer = element[BUFFER];
+				} else {
+					buffer = Buffer.from(typeof element === 'string' ? element : String(element));
+				}
+				size += buffer.length;
+				buffers.push(buffer);
+			}
+		}
+
+		this[BUFFER] = Buffer.concat(buffers);
+
+		let type = options && options.type !== undefined && String(options.type).toLowerCase();
+		if (type && !/[^\u0020-\u007E]/.test(type)) {
+			this[TYPE] = type;
+		}
+	}
+	get size() {
+		return this[BUFFER].length;
+	}
+	get type() {
+		return this[TYPE];
+	}
+	text() {
+		return Promise.resolve(this[BUFFER].toString());
+	}
+	arrayBuffer() {
+		const buf = this[BUFFER];
+		const ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
+		return Promise.resolve(ab);
+	}
+	stream() {
+		const readable = new Readable();
+		readable._read = function () {};
+		readable.push(this[BUFFER]);
+		readable.push(null);
+		return readable;
+	}
+	toString() {
+		return '[object Blob]';
+	}
+	slice() {
+		const size = this.size;
+
+		const start = arguments[0];
+		const end = arguments[1];
+		let relativeStart, relativeEnd;
+		if (start === undefined) {
+			relativeStart = 0;
+		} else if (start < 0) {
+			relativeStart = Math.max(size + start, 0);
+		} else {
+			relativeStart = Math.min(start, size);
+		}
+		if (end === undefined) {
+			relativeEnd = size;
+		} else if (end < 0) {
+			relativeEnd = Math.max(size + end, 0);
+		} else {
+			relativeEnd = Math.min(end, size);
+		}
+		const span = Math.max(relativeEnd - relativeStart, 0);
+
+		const buffer = this[BUFFER];
+		const slicedBuffer = buffer.slice(relativeStart, relativeStart + span);
+		const blob = new Blob([], { type: arguments[2] });
+		blob[BUFFER] = slicedBuffer;
+		return blob;
+	}
+}
+
+Object.defineProperties(Blob.prototype, {
+	size: { enumerable: true },
+	type: { enumerable: true },
+	slice: { enumerable: true }
+});
+
+Object.defineProperty(Blob.prototype, Symbol.toStringTag, {
+	value: 'Blob',
+	writable: false,
+	enumerable: false,
+	configurable: true
+});
+
+/**
+ * fetch-error.js
+ *
+ * FetchError interface for operational errors
+ */
+
+/**
+ * Create FetchError instance
+ *
+ * @param   String      message      Error message for human
+ * @param   String      type         Error type for machine
+ * @param   String      systemError  For Node.js system error
+ * @return  FetchError
+ */
+function FetchError(message, type, systemError) {
+  Error.call(this, message);
+
+  this.message = message;
+  this.type = type;
+
+  // when err.type is `system`, err.code contains system error code
+  if (systemError) {
+    this.code = this.errno = systemError.code;
+  }
+
+  // hide custom error implementation details from end-users
+  Error.captureStackTrace(this, this.constructor);
+}
+
+FetchError.prototype = Object.create(Error.prototype);
+FetchError.prototype.constructor = FetchError;
+FetchError.prototype.name = 'FetchError';
+
+let convert;
+try {
+	convert = require('encoding').convert;
+} catch (e) {}
+
+const INTERNALS = Symbol('Body internals');
+
+// fix an issue where "PassThrough" isn't a named export for node <10
+const PassThrough = Stream.PassThrough;
+
+/**
+ * Body mixin
+ *
+ * Ref: https://fetch.spec.whatwg.org/#body
+ *
+ * @param   Stream  body  Readable stream
+ * @param   Object  opts  Response options
+ * @return  Void
+ */
+function Body(body) {
+	var _this = this;
+
+	var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
+	    _ref$size = _ref.size;
+
+	let size = _ref$size === undefined ? 0 : _ref$size;
+	var _ref$timeout = _ref.timeout;
+	let timeout = _ref$timeout === undefined ? 0 : _ref$timeout;
+
+	if (body == null) {
+		// body is undefined or null
+		body = null;
+	} else if (isURLSearchParams(body)) {
+		// body is a URLSearchParams
+		body = Buffer.from(body.toString());
+	} else if (isBlob(body)) ; else if (Buffer.isBuffer(body)) ; else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {
+		// body is ArrayBuffer
+		body = Buffer.from(body);
+	} else if (ArrayBuffer.isView(body)) {
+		// body is ArrayBufferView
+		body = Buffer.from(body.buffer, body.byteOffset, body.byteLength);
+	} else if (body instanceof Stream) ; else {
+		// none of the above
+		// coerce to string then buffer
+		body = Buffer.from(String(body));
+	}
+	this[INTERNALS] = {
+		body,
+		disturbed: false,
+		error: null
+	};
+	this.size = size;
+	this.timeout = timeout;
+
+	if (body instanceof Stream) {
+		body.on('error', function (err) {
+			const error = err.name === 'AbortError' ? err : new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, 'system', err);
+			_this[INTERNALS].error = error;
+		});
+	}
+}
+
+Body.prototype = {
+	get body() {
+		return this[INTERNALS].body;
+	},
+
+	get bodyUsed() {
+		return this[INTERNALS].disturbed;
+	},
+
+	/**
+  * Decode response as ArrayBuffer
+  *
+  * @return  Promise
+  */
+	arrayBuffer() {
+		return consumeBody.call(this).then(function (buf) {
+			return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
+		});
+	},
+
+	/**
+  * Return raw response as Blob
+  *
+  * @return Promise
+  */
+	blob() {
+		let ct = this.headers && this.headers.get('content-type') || '';
+		return consumeBody.call(this).then(function (buf) {
+			return Object.assign(
+			// Prevent copying
+			new Blob([], {
+				type: ct.toLowerCase()
+			}), {
+				[BUFFER]: buf
+			});
+		});
+	},
+
+	/**
+  * Decode response as json
+  *
+  * @return  Promise
+  */
+	json() {
+		var _this2 = this;
+
+		return consumeBody.call(this).then(function (buffer) {
+			try {
+				return JSON.parse(buffer.toString());
+			} catch (err) {
+				return Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json'));
+			}
+		});
+	},
+
+	/**
+  * Decode response as text
+  *
+  * @return  Promise
+  */
+	text() {
+		return consumeBody.call(this).then(function (buffer) {
+			return buffer.toString();
+		});
+	},
+
+	/**
+  * Decode response as buffer (non-spec api)
+  *
+  * @return  Promise
+  */
+	buffer() {
+		return consumeBody.call(this);
+	},
+
+	/**
+  * Decode response as text, while automatically detecting the encoding and
+  * trying to decode to UTF-8 (non-spec api)
+  *
+  * @return  Promise
+  */
+	textConverted() {
+		var _this3 = this;
+
+		return consumeBody.call(this).then(function (buffer) {
+			return convertBody(buffer, _this3.headers);
+		});
+	}
+};
+
+// In browsers, all properties are enumerable.
+Object.defineProperties(Body.prototype, {
+	body: { enumerable: true },
+	bodyUsed: { enumerable: true },
+	arrayBuffer: { enumerable: true },
+	blob: { enumerable: true },
+	json: { enumerable: true },
+	text: { enumerable: true }
+});
+
+Body.mixIn = function (proto) {
+	for (const name of Object.getOwnPropertyNames(Body.prototype)) {
+		// istanbul ignore else: future proof
+		if (!(name in proto)) {
+			const desc = Object.getOwnPropertyDescriptor(Body.prototype, name);
+			Object.defineProperty(proto, name, desc);
+		}
+	}
+};
+
+/**
+ * Consume and convert an entire Body to a Buffer.
+ *
+ * Ref: https://fetch.spec.whatwg.org/#concept-body-consume-body
+ *
+ * @return  Promise
+ */
+function consumeBody() {
+	var _this4 = this;
+
+	if (this[INTERNALS].disturbed) {
+		return Body.Promise.reject(new TypeError(`body used already for: ${this.url}`));
+	}
+
+	this[INTERNALS].disturbed = true;
+
+	if (this[INTERNALS].error) {
+		return Body.Promise.reject(this[INTERNALS].error);
+	}
+
+	let body = this.body;
+
+	// body is null
+	if (body === null) {
+		return Body.Promise.resolve(Buffer.alloc(0));
+	}
+
+	// body is blob
+	if (isBlob(body)) {
+		body = body.stream();
+	}
+
+	// body is buffer
+	if (Buffer.isBuffer(body)) {
+		return Body.Promise.resolve(body);
+	}
+
+	// istanbul ignore if: should never happen
+	if (!(body instanceof Stream)) {
+		return Body.Promise.resolve(Buffer.alloc(0));
+	}
+
+	// body is stream
+	// get ready to actually consume the body
+	let accum = [];
+	let accumBytes = 0;
+	let abort = false;
+
+	return new Body.Promise(function (resolve, reject) {
+		let resTimeout;
+
+		// allow timeout on slow response body
+		if (_this4.timeout) {
+			resTimeout = setTimeout(function () {
+				abort = true;
+				reject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, 'body-timeout'));
+			}, _this4.timeout);
+		}
+
+		// handle stream errors
+		body.on('error', function (err) {
+			if (err.name === 'AbortError') {
+				// if the request was aborted, reject with this Error
+				abort = true;
+				reject(err);
+			} else {
+				// other errors, such as incorrect content-encoding
+				reject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, 'system', err));
+			}
+		});
+
+		body.on('data', function (chunk) {
+			if (abort || chunk === null) {
+				return;
+			}
+
+			if (_this4.size && accumBytes + chunk.length > _this4.size) {
+				abort = true;
+				reject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, 'max-size'));
+				return;
+			}
+
+			accumBytes += chunk.length;
+			accum.push(chunk);
+		});
+
+		body.on('end', function () {
+			if (abort) {
+				return;
+			}
+
+			clearTimeout(resTimeout);
+
+			try {
+				resolve(Buffer.concat(accum, accumBytes));
+			} catch (err) {
+				// handle streams that have accumulated too much data (issue #414)
+				reject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, 'system', err));
+			}
+		});
+	});
+}
+
+/**
+ * Detect buffer encoding and convert to target encoding
+ * ref: http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html#determining-the-character-encoding
+ *
+ * @param   Buffer  buffer    Incoming buffer
+ * @param   String  encoding  Target encoding
+ * @return  String
+ */
+function convertBody(buffer, headers) {
+	if (typeof convert !== 'function') {
+		throw new Error('The package `encoding` must be installed to use the textConverted() function');
+	}
+
+	const ct = headers.get('content-type');
+	let charset = 'utf-8';
+	let res, str;
+
+	// header
+	if (ct) {
+		res = /charset=([^;]*)/i.exec(ct);
+	}
+
+	// no charset in content type, peek at response body for at most 1024 bytes
+	str = buffer.slice(0, 1024).toString();
+
+	// html5
+	if (!res && str) {
+		res = /<meta.+?charset=(['"])(.+?)\1/i.exec(str);
+	}
+
+	// html4
+	if (!res && str) {
+		res = /<meta[\s]+?http-equiv=(['"])content-type\1[\s]+?content=(['"])(.+?)\2/i.exec(str);
+		if (!res) {
+			res = /<meta[\s]+?content=(['"])(.+?)\1[\s]+?http-equiv=(['"])content-type\3/i.exec(str);
+			if (res) {
+				res.pop(); // drop last quote
+			}
+		}
+
+		if (res) {
+			res = /charset=(.*)/i.exec(res.pop());
+		}
+	}
+
+	// xml
+	if (!res && str) {
+		res = /<\?xml.+?encoding=(['"])(.+?)\1/i.exec(str);
+	}
+
+	// found charset
+	if (res) {
+		charset = res.pop();
+
+		// prevent decode issues when sites use incorrect encoding
+		// ref: https://hsivonen.fi/encoding-menu/
+		if (charset === 'gb2312' || charset === 'gbk') {
+			charset = 'gb18030';
+		}
+	}
+
+	// turn raw buffers into a single utf-8 buffer
+	return convert(buffer, 'UTF-8', charset).toString();
+}
+
+/**
+ * Detect a URLSearchParams object
+ * ref: https://github.com/bitinn/node-fetch/issues/296#issuecomment-307598143
+ *
+ * @param   Object  obj     Object to detect by type or brand
+ * @return  String
+ */
+function isURLSearchParams(obj) {
+	// Duck-typing as a necessary condition.
+	if (typeof obj !== 'object' || typeof obj.append !== 'function' || typeof obj.delete !== 'function' || typeof obj.get !== 'function' || typeof obj.getAll !== 'function' || typeof obj.has !== 'function' || typeof obj.set !== 'function') {
+		return false;
+	}
+
+	// Brand-checking and more duck-typing as optional condition.
+	return obj.constructor.name === 'URLSearchParams' || Object.prototype.toString.call(obj) === '[object URLSearchParams]' || typeof obj.sort === 'function';
+}
+
+/**
+ * Check if `obj` is a W3C `Blob` object (which `File` inherits from)
+ * @param  {*} obj
+ * @return {boolean}
+ */
+function isBlob(obj) {
+	return typeof obj === 'object' && typeof obj.arrayBuffer === 'function' && typeof obj.type === 'string' && typeof obj.stream === 'function' && typeof obj.constructor === 'function' && typeof obj.constructor.name === 'string' && /^(Blob|File)$/.test(obj.constructor.name) && /^(Blob|File)$/.test(obj[Symbol.toStringTag]);
+}
+
+/**
+ * Clone body given Res/Req instance
+ *
+ * @param   Mixed  instance  Response or Request instance
+ * @return  Mixed
+ */
+function clone(instance) {
+	let p1, p2;
+	let body = instance.body;
+
+	// don't allow cloning a used body
+	if (instance.bodyUsed) {
+		throw new Error('cannot clone body after it is used');
+	}
+
+	// check that body is a stream and not form-data object
+	// note: we can't clone the form-data object without having it as a dependency
+	if (body instanceof Stream && typeof body.getBoundary !== 'function') {
+		// tee instance body
+		p1 = new PassThrough();
+		p2 = new PassThrough();
+		body.pipe(p1);
+		body.pipe(p2);
+		// set instance body to teed body and return the other teed body
+		instance[INTERNALS].body = p1;
+		body = p2;
+	}
+
+	return body;
+}
+
+/**
+ * Performs the operation "extract a `Content-Type` value from |object|" as
+ * specified in the specification:
+ * https://fetch.spec.whatwg.org/#concept-bodyinit-extract
+ *
+ * This function assumes that instance.body is present.
+ *
+ * @param   Mixed  instance  Any options.body input
+ */
+function extractContentType(body) {
+	if (body === null) {
+		// body is null
+		return null;
+	} else if (typeof body === 'string') {
+		// body is string
+		return 'text/plain;charset=UTF-8';
+	} else if (isURLSearchParams(body)) {
+		// body is a URLSearchParams
+		return 'application/x-www-form-urlencoded;charset=UTF-8';
+	} else if (isBlob(body)) {
+		// body is blob
+		return body.type || null;
+	} else if (Buffer.isBuffer(body)) {
+		// body is buffer
+		return null;
+	} else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {
+		// body is ArrayBuffer
+		return null;
+	} else if (ArrayBuffer.isView(body)) {
+		// body is ArrayBufferView
+		return null;
+	} else if (typeof body.getBoundary === 'function') {
+		// detect form data input from form-data module
+		return `multipart/form-data;boundary=${body.getBoundary()}`;
+	} else if (body instanceof Stream) {
+		// body is stream
+		// can't really do much about this
+		return null;
+	} else {
+		// Body constructor defaults other things to string
+		return 'text/plain;charset=UTF-8';
+	}
+}
+
+/**
+ * The Fetch Standard treats this as if "total bytes" is a property on the body.
+ * For us, we have to explicitly get it with a function.
+ *
+ * ref: https://fetch.spec.whatwg.org/#concept-body-total-bytes
+ *
+ * @param   Body    instance   Instance of Body
+ * @return  Number?            Number of bytes, or null if not possible
+ */
+function getTotalBytes(instance) {
+	const body = instance.body;
+
+
+	if (body === null) {
+		// body is null
+		return 0;
+	} else if (isBlob(body)) {
+		return body.size;
+	} else if (Buffer.isBuffer(body)) {
+		// body is buffer
+		return body.length;
+	} else if (body && typeof body.getLengthSync === 'function') {
+		// detect form data input from form-data module
+		if (body._lengthRetrievers && body._lengthRetrievers.length == 0 || // 1.x
+		body.hasKnownLength && body.hasKnownLength()) {
+			// 2.x
+			return body.getLengthSync();
+		}
+		return null;
+	} else {
+		// body is stream
+		return null;
+	}
+}
+
+/**
+ * Write a Body to a Node.js WritableStream (e.g. http.Request) object.
+ *
+ * @param   Body    instance   Instance of Body
+ * @return  Void
+ */
+function writeToStream(dest, instance) {
+	const body = instance.body;
+
+
+	if (body === null) {
+		// body is null
+		dest.end();
+	} else if (isBlob(body)) {
+		body.stream().pipe(dest);
+	} else if (Buffer.isBuffer(body)) {
+		// body is buffer
+		dest.write(body);
+		dest.end();
+	} else {
+		// body is stream
+		body.pipe(dest);
+	}
+}
+
+// expose Promise
+Body.Promise = global.Promise;
+
+/**
+ * headers.js
+ *
+ * Headers class offers convenient helpers
+ */
+
+const invalidTokenRegex = /[^\^_`a-zA-Z\-0-9!#$%&'*+.|~]/;
+const invalidHeaderCharRegex = /[^\t\x20-\x7e\x80-\xff]/;
+
+function validateName(name) {
+	name = `${name}`;
+	if (invalidTokenRegex.test(name) || name === '') {
+		throw new TypeError(`${name} is not a legal HTTP header name`);
+	}
+}
+
+function validateValue(value) {
+	value = `${value}`;
+	if (invalidHeaderCharRegex.test(value)) {
+		throw new TypeError(`${value} is not a legal HTTP header value`);
+	}
+}
+
+/**
+ * Find the key in the map object given a header name.
+ *
+ * Returns undefined if not found.
+ *
+ * @param   String  name  Header name
+ * @return  String|Undefined
+ */
+function find(map, name) {
+	name = name.toLowerCase();
+	for (const key in map) {
+		if (key.toLowerCase() === name) {
+			return key;
+		}
+	}
+	return undefined;
+}
+
+const MAP = Symbol('map');
+class Headers {
+	/**
+  * Headers class
+  *
+  * @param   Object  headers  Response headers
+  * @return  Void
+  */
+	constructor() {
+		let init = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined;
+
+		this[MAP] = Object.create(null);
+
+		if (init instanceof Headers) {
+			const rawHeaders = init.raw();
+			const headerNames = Object.keys(rawHeaders);
+
+			for (const headerName of headerNames) {
+				for (const value of rawHeaders[headerName]) {
+					this.append(headerName, value);
+				}
+			}
+
+			return;
+		}
+
+		// We don't worry about converting prop to ByteString here as append()
+		// will handle it.
+		if (init == null) ; else if (typeof init === 'object') {
+			const method = init[Symbol.iterator];
+			if (method != null) {
+				if (typeof method !== 'function') {
+					throw new TypeError('Header pairs must be iterable');
+				}
+
+				// sequence<sequence<ByteString>>
+				// Note: per spec we have to first exhaust the lists then process them
+				const pairs = [];
+				for (const pair of init) {
+					if (typeof pair !== 'object' || typeof pair[Symbol.iterator] !== 'function') {
+						throw new TypeError('Each header pair must be iterable');
+					}
+					pairs.push(Array.from(pair));
+				}
+
+				for (const pair of pairs) {
+					if (pair.length !== 2) {
+						throw new TypeError('Each header pair must be a name/value tuple');
+					}
+					this.append(pair[0], pair[1]);
+				}
+			} else {
+				// record<ByteString, ByteString>
+				for (const key of Object.keys(init)) {
+					const value = init[key];
+					this.append(key, value);
+				}
+			}
+		} else {
+			throw new TypeError('Provided initializer must be an object');
+		}
+	}
+
+	/**
+  * Return combined header value given name
+  *
+  * @param   String  name  Header name
+  * @return  Mixed
+  */
+	get(name) {
+		name = `${name}`;
+		validateName(name);
+		const key = find(this[MAP], name);
+		if (key === undefined) {
+			return null;
+		}
+
+		return this[MAP][key].join(', ');
+	}
+
+	/**
+  * Iterate over all headers
+  *
+  * @param   Function  callback  Executed for each item with parameters (value, name, thisArg)
+  * @param   Boolean   thisArg   `this` context for callback function
+  * @return  Void
+  */
+	forEach(callback) {
+		let thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
+
+		let pairs = getHeaders(this);
+		let i = 0;
+		while (i < pairs.length) {
+			var _pairs$i = pairs[i];
+			const name = _pairs$i[0],
+			      value = _pairs$i[1];
+
+			callback.call(thisArg, value, name, this);
+			pairs = getHeaders(this);
+			i++;
+		}
+	}
+
+	/**
+  * Overwrite header values given name
+  *
+  * @param   String  name   Header name
+  * @param   String  value  Header value
+  * @return  Void
+  */
+	set(name, value) {
+		name = `${name}`;
+		value = `${value}`;
+		validateName(name);
+		validateValue(value);
+		const key = find(this[MAP], name);
+		this[MAP][key !== undefined ? key : name] = [value];
+	}
+
+	/**
+  * Append a value onto existing header
+  *
+  * @param   String  name   Header name
+  * @param   String  value  Header value
+  * @return  Void
+  */
+	append(name, value) {
+		name = `${name}`;
+		value = `${value}`;
+		validateName(name);
+		validateValue(value);
+		const key = find(this[MAP], name);
+		if (key !== undefined) {
+			this[MAP][key].push(value);
+		} else {
+			this[MAP][name] = [value];
+		}
+	}
+
+	/**
+  * Check for header name existence
+  *
+  * @param   String   name  Header name
+  * @return  Boolean
+  */
+	has(name) {
+		name = `${name}`;
+		validateName(name);
+		return find(this[MAP], name) !== undefined;
+	}
+
+	/**
+  * Delete all header values given name
+  *
+  * @param   String  name  Header name
+  * @return  Void
+  */
+	delete(name) {
+		name = `${name}`;
+		validateName(name);
+		const key = find(this[MAP], name);
+		if (key !== undefined) {
+			delete this[MAP][key];
+		}
+	}
+
+	/**
+  * Return raw headers (non-spec api)
+  *
+  * @return  Object
+  */
+	raw() {
+		return this[MAP];
+	}
+
+	/**
+  * Get an iterator on keys.
+  *
+  * @return  Iterator
+  */
+	keys() {
+		return createHeadersIterator(this, 'key');
+	}
+
+	/**
+  * Get an iterator on values.
+  *
+  * @return  Iterator
+  */
+	values() {
+		return createHeadersIterator(this, 'value');
+	}
+
+	/**
+  * Get an iterator on entries.
+  *
+  * This is the default iterator of the Headers object.
+  *
+  * @return  Iterator
+  */
+	[Symbol.iterator]() {
+		return createHeadersIterator(this, 'key+value');
+	}
+}
+Headers.prototype.entries = Headers.prototype[Symbol.iterator];
+
+Object.defineProperty(Headers.prototype, Symbol.toStringTag, {
+	value: 'Headers',
+	writable: false,
+	enumerable: false,
+	configurable: true
+});
+
+Object.defineProperties(Headers.prototype, {
+	get: { enumerable: true },
+	forEach: { enumerable: true },
+	set: { enumerable: true },
+	append: { enumerable: true },
+	has: { enumerable: true },
+	delete: { enumerable: true },
+	keys: { enumerable: true },
+	values: { enumerable: true },
+	entries: { enumerable: true }
+});
+
+function getHeaders(headers) {
+	let kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'key+value';
+
+	const keys = Object.keys(headers[MAP]).sort();
+	return keys.map(kind === 'key' ? function (k) {
+		return k.toLowerCase();
+	} : kind === 'value' ? function (k) {
+		return headers[MAP][k].join(', ');
+	} : function (k) {
+		return [k.toLowerCase(), headers[MAP][k].join(', ')];
+	});
+}
+
+const INTERNAL = Symbol('internal');
+
+function createHeadersIterator(target, kind) {
+	const iterator = Object.create(HeadersIteratorPrototype);
+	iterator[INTERNAL] = {
+		target,
+		kind,
+		index: 0
+	};
+	return iterator;
+}
+
+const HeadersIteratorPrototype = Object.setPrototypeOf({
+	next() {
+		// istanbul ignore if
+		if (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) {
+			throw new TypeError('Value of `this` is not a HeadersIterator');
+		}
+
+		var _INTERNAL = this[INTERNAL];
+		const target = _INTERNAL.target,
+		      kind = _INTERNAL.kind,
+		      index = _INTERNAL.index;
+
+		const values = getHeaders(target, kind);
+		const len = values.length;
+		if (index >= len) {
+			return {
+				value: undefined,
+				done: true
+			};
+		}
+
+		this[INTERNAL].index = index + 1;
+
+		return {
+			value: values[index],
+			done: false
+		};
+	}
+}, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())));
+
+Object.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, {
+	value: 'HeadersIterator',
+	writable: false,
+	enumerable: false,
+	configurable: true
+});
+
+/**
+ * Export the Headers object in a form that Node.js can consume.
+ *
+ * @param   Headers  headers
+ * @return  Object
+ */
+function exportNodeCompatibleHeaders(headers) {
+	const obj = Object.assign({ __proto__: null }, headers[MAP]);
+
+	// http.request() only supports string as Host header. This hack makes
+	// specifying custom Host header possible.
+	const hostHeaderKey = find(headers[MAP], 'Host');
+	if (hostHeaderKey !== undefined) {
+		obj[hostHeaderKey] = obj[hostHeaderKey][0];
+	}
+
+	return obj;
+}
+
+/**
+ * Create a Headers object from an object of headers, ignoring those that do
+ * not conform to HTTP grammar productions.
+ *
+ * @param   Object  obj  Object of headers
+ * @return  Headers
+ */
+function createHeadersLenient(obj) {
+	const headers = new Headers();
+	for (const name of Object.keys(obj)) {
+		if (invalidTokenRegex.test(name)) {
+			continue;
+		}
+		if (Array.isArray(obj[name])) {
+			for (const val of obj[name]) {
+				if (invalidHeaderCharRegex.test(val)) {
+					continue;
+				}
+				if (headers[MAP][name] === undefined) {
+					headers[MAP][name] = [val];
+				} else {
+					headers[MAP][name].push(val);
+				}
+			}
+		} else if (!invalidHeaderCharRegex.test(obj[name])) {
+			headers[MAP][name] = [obj[name]];
+		}
+	}
+	return headers;
+}
+
+const INTERNALS$1 = Symbol('Response internals');
+
+// fix an issue where "STATUS_CODES" aren't a named export for node <10
+const STATUS_CODES = http.STATUS_CODES;
+
+/**
+ * Response class
+ *
+ * @param   Stream  body  Readable stream
+ * @param   Object  opts  Response options
+ * @return  Void
+ */
+class Response {
+	constructor() {
+		let body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
+		let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+		Body.call(this, body, opts);
+
+		const status = opts.status || 200;
+		const headers = new Headers(opts.headers);
+
+		if (body != null && !headers.has('Content-Type')) {
+			const contentType = extractContentType(body);
+			if (contentType) {
+				headers.append('Content-Type', contentType);
+			}
+		}
+
+		this[INTERNALS$1] = {
+			url: opts.url,
+			status,
+			statusText: opts.statusText || STATUS_CODES[status],
+			headers,
+			counter: opts.counter
+		};
+	}
+
+	get url() {
+		return this[INTERNALS$1].url || '';
+	}
+
+	get status() {
+		return this[INTERNALS$1].status;
+	}
+
+	/**
+  * Convenience property representing if the request ended normally
+  */
+	get ok() {
+		return this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300;
+	}
+
+	get redirected() {
+		return this[INTERNALS$1].counter > 0;
+	}
+
+	get statusText() {
+		return this[INTERNALS$1].statusText;
+	}
+
+	get headers() {
+		return this[INTERNALS$1].headers;
+	}
+
+	/**
+  * Clone this response
+  *
+  * @return  Response
+  */
+	clone() {
+		return new Response(clone(this), {
+			url: this.url,
+			status: this.status,
+			statusText: this.statusText,
+			headers: this.headers,
+			ok: this.ok,
+			redirected: this.redirected
+		});
+	}
+}
+
+Body.mixIn(Response.prototype);
+
+Object.defineProperties(Response.prototype, {
+	url: { enumerable: true },
+	status: { enumerable: true },
+	ok: { enumerable: true },
+	redirected: { enumerable: true },
+	statusText: { enumerable: true },
+	headers: { enumerable: true },
+	clone: { enumerable: true }
+});
+
+Object.defineProperty(Response.prototype, Symbol.toStringTag, {
+	value: 'Response',
+	writable: false,
+	enumerable: false,
+	configurable: true
+});
+
+const INTERNALS$2 = Symbol('Request internals');
+
+// fix an issue where "format", "parse" aren't a named export for node <10
+const parse_url = Url.parse;
+const format_url = Url.format;
+
+const streamDestructionSupported = 'destroy' in Stream.Readable.prototype;
+
+/**
+ * Check if a value is an instance of Request.
+ *
+ * @param   Mixed   input
+ * @return  Boolean
+ */
+function isRequest(input) {
+	return typeof input === 'object' && typeof input[INTERNALS$2] === 'object';
+}
+
+function isAbortSignal(signal) {
+	const proto = signal && typeof signal === 'object' && Object.getPrototypeOf(signal);
+	return !!(proto && proto.constructor.name === 'AbortSignal');
+}
+
+/**
+ * Request class
+ *
+ * @param   Mixed   input  Url or Request instance
+ * @param   Object  init   Custom options
+ * @return  Void
+ */
+class Request {
+	constructor(input) {
+		let init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+		let parsedURL;
+
+		// normalize input
+		if (!isRequest(input)) {
+			if (input && input.href) {
+				// in order to support Node.js' Url objects; though WHATWG's URL objects
+				// will fall into this branch also (since their `toString()` will return
+				// `href` property anyway)
+				parsedURL = parse_url(input.href);
+			} else {
+				// coerce input to a string before attempting to parse
+				parsedURL = parse_url(`${input}`);
+			}
+			input = {};
+		} else {
+			parsedURL = parse_url(input.url);
+		}
+
+		let method = init.method || input.method || 'GET';
+		method = method.toUpperCase();
+
+		if ((init.body != null || isRequest(input) && input.body !== null) && (method === 'GET' || method === 'HEAD')) {
+			throw new TypeError('Request with GET/HEAD method cannot have body');
+		}
+
+		let inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null;
+
+		Body.call(this, inputBody, {
+			timeout: init.timeout || input.timeout || 0,
+			size: init.size || input.size || 0
+		});
+
+		const headers = new Headers(init.headers || input.headers || {});
+
+		if (inputBody != null && !headers.has('Content-Type')) {
+			const contentType = extractContentType(inputBody);
+			if (contentType) {
+				headers.append('Content-Type', contentType);
+			}
+		}
+
+		let signal = isRequest(input) ? input.signal : null;
+		if ('signal' in init) signal = init.signal;
+
+		if (signal != null && !isAbortSignal(signal)) {
+			throw new TypeError('Expected signal to be an instanceof AbortSignal');
+		}
+
+		this[INTERNALS$2] = {
+			method,
+			redirect: init.redirect || input.redirect || 'follow',
+			headers,
+			parsedURL,
+			signal
+		};
+
+		// node-fetch-only options
+		this.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20;
+		this.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true;
+		this.counter = init.counter || input.counter || 0;
+		this.agent = init.agent || input.agent;
+	}
+
+	get method() {
+		return this[INTERNALS$2].method;
+	}
+
+	get url() {
+		return format_url(this[INTERNALS$2].parsedURL);
+	}
+
+	get headers() {
+		return this[INTERNALS$2].headers;
+	}
+
+	get redirect() {
+		return this[INTERNALS$2].redirect;
+	}
+
+	get signal() {
+		return this[INTERNALS$2].signal;
+	}
+
+	/**
+  * Clone this request
+  *
+  * @return  Request
+  */
+	clone() {
+		return new Request(this);
+	}
+}
+
+Body.mixIn(Request.prototype);
+
+Object.defineProperty(Request.prototype, Symbol.toStringTag, {
+	value: 'Request',
+	writable: false,
+	enumerable: false,
+	configurable: true
+});
+
+Object.defineProperties(Request.prototype, {
+	method: { enumerable: true },
+	url: { enumerable: true },
+	headers: { enumerable: true },
+	redirect: { enumerable: true },
+	clone: { enumerable: true },
+	signal: { enumerable: true }
+});
+
+/**
+ * Convert a Request to Node.js http request options.
+ *
+ * @param   Request  A Request instance
+ * @return  Object   The options object to be passed to http.request
+ */
+function getNodeRequestOptions(request) {
+	const parsedURL = request[INTERNALS$2].parsedURL;
+	const headers = new Headers(request[INTERNALS$2].headers);
+
+	// fetch step 1.3
+	if (!headers.has('Accept')) {
+		headers.set('Accept', '*/*');
+	}
+
+	// Basic fetch
+	if (!parsedURL.protocol || !parsedURL.hostname) {
+		throw new TypeError('Only absolute URLs are supported');
+	}
+
+	if (!/^https?:$/.test(parsedURL.protocol)) {
+		throw new TypeError('Only HTTP(S) protocols are supported');
+	}
+
+	if (request.signal && request.body instanceof Stream.Readable && !streamDestructionSupported) {
+		throw new Error('Cancellation of streamed requests with AbortSignal is not supported in node < 8');
+	}
+
+	// HTTP-network-or-cache fetch steps 2.4-2.7
+	let contentLengthValue = null;
+	if (request.body == null && /^(POST|PUT)$/i.test(request.method)) {
+		contentLengthValue = '0';
+	}
+	if (request.body != null) {
+		const totalBytes = getTotalBytes(request);
+		if (typeof totalBytes === 'number') {
+			contentLengthValue = String(totalBytes);
+		}
+	}
+	if (contentLengthValue) {
+		headers.set('Content-Length', contentLengthValue);
+	}
+
+	// HTTP-network-or-cache fetch step 2.11
+	if (!headers.has('User-Agent')) {
+		headers.set('User-Agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)');
+	}
+
+	// HTTP-network-or-cache fetch step 2.15
+	if (request.compress && !headers.has('Accept-Encoding')) {
+		headers.set('Accept-Encoding', 'gzip,deflate');
+	}
+
+	let agent = request.agent;
+	if (typeof agent === 'function') {
+		agent = agent(parsedURL);
+	}
+
+	if (!headers.has('Connection') && !agent) {
+		headers.set('Connection', 'close');
+	}
+
+	// HTTP-network fetch step 4.2
+	// chunked encoding is handled by Node.js
+
+	return Object.assign({}, parsedURL, {
+		method: request.method,
+		headers: exportNodeCompatibleHeaders(headers),
+		agent
+	});
+}
+
+/**
+ * abort-error.js
+ *
+ * AbortError interface for cancelled requests
+ */
+
+/**
+ * Create AbortError instance
+ *
+ * @param   String      message      Error message for human
+ * @return  AbortError
+ */
+function AbortError(message) {
+  Error.call(this, message);
+
+  this.type = 'aborted';
+  this.message = message;
+
+  // hide custom error implementation details from end-users
+  Error.captureStackTrace(this, this.constructor);
+}
+
+AbortError.prototype = Object.create(Error.prototype);
+AbortError.prototype.constructor = AbortError;
+AbortError.prototype.name = 'AbortError';
+
+// fix an issue where "PassThrough", "resolve" aren't a named export for node <10
+const PassThrough$1 = Stream.PassThrough;
+const resolve_url = Url.resolve;
+
+/**
+ * Fetch function
+ *
+ * @param   Mixed    url   Absolute url or Request instance
+ * @param   Object   opts  Fetch options
+ * @return  Promise
+ */
+function fetch(url, opts) {
+
+	// allow custom promise
+	if (!fetch.Promise) {
+		throw new Error('native promise missing, set fetch.Promise to your favorite alternative');
+	}
+
+	Body.Promise = fetch.Promise;
+
+	// wrap http.request into fetch
+	return new fetch.Promise(function (resolve, reject) {
+		// build request object
+		const request = new Request(url, opts);
+		const options = getNodeRequestOptions(request);
+
+		const send = (options.protocol === 'https:' ? https : http).request;
+		const signal = request.signal;
+
+		let response = null;
+
+		const abort = function abort() {
+			let error = new AbortError('The user aborted a request.');
+			reject(error);
+			if (request.body && request.body instanceof Stream.Readable) {
+				request.body.destroy(error);
+			}
+			if (!response || !response.body) return;
+			response.body.emit('error', error);
+		};
+
+		if (signal && signal.aborted) {
+			abort();
+			return;
+		}
+
+		const abortAndFinalize = function abortAndFinalize() {
+			abort();
+			finalize();
+		};
+
+		// send request
+		const req = send(options);
+		let reqTimeout;
+
+		if (signal) {
+			signal.addEventListener('abort', abortAndFinalize);
+		}
+
+		function finalize() {
+			req.abort();
+			if (signal) signal.removeEventListener('abort', abortAndFinalize);
+			clearTimeout(reqTimeout);
+		}
+
+		if (request.timeout) {
+			req.once('socket', function (socket) {
+				reqTimeout = setTimeout(function () {
+					reject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout'));
+					finalize();
+				}, request.timeout);
+			});
+		}
+
+		req.on('error', function (err) {
+			reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err));
+			finalize();
+		});
+
+		req.on('response', function (res) {
+			clearTimeout(reqTimeout);
+
+			const headers = createHeadersLenient(res.headers);
+
+			// HTTP fetch step 5
+			if (fetch.isRedirect(res.statusCode)) {
+				// HTTP fetch step 5.2
+				const location = headers.get('Location');
+
+				// HTTP fetch step 5.3
+				const locationURL = location === null ? null : resolve_url(request.url, location);
+
+				// HTTP fetch step 5.5
+				switch (request.redirect) {
+					case 'error':
+						reject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${request.url}`, 'no-redirect'));
+						finalize();
+						return;
+					case 'manual':
+						// node-fetch-specific step: make manual redirect a bit easier to use by setting the Location header value to the resolved URL.
+						if (locationURL !== null) {
+							// handle corrupted header
+							try {
+								headers.set('Location', locationURL);
+							} catch (err) {
+								// istanbul ignore next: nodejs server prevent invalid response headers, we can't test this through normal request
+								reject(err);
+							}
+						}
+						break;
+					case 'follow':
+						// HTTP-redirect fetch step 2
+						if (locationURL === null) {
+							break;
+						}
+
+						// HTTP-redirect fetch step 5
+						if (request.counter >= request.follow) {
+							reject(new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect'));
+							finalize();
+							return;
+						}
+
+						// HTTP-redirect fetch step 6 (counter increment)
+						// Create a new Request object.
+						const requestOpts = {
+							headers: new Headers(request.headers),
+							follow: request.follow,
+							counter: request.counter + 1,
+							agent: request.agent,
+							compress: request.compress,
+							method: request.method,
+							body: request.body,
+							signal: request.signal,
+							timeout: request.timeout,
+							size: request.size
+						};
+
+						// HTTP-redirect fetch step 9
+						if (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) {
+							reject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect'));
+							finalize();
+							return;
+						}
+
+						// HTTP-redirect fetch step 11
+						if (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === 'POST') {
+							requestOpts.method = 'GET';
+							requestOpts.body = undefined;
+							requestOpts.headers.delete('content-length');
+						}
+
+						// HTTP-redirect fetch step 15
+						resolve(fetch(new Request(locationURL, requestOpts)));
+						finalize();
+						return;
+				}
+			}
+
+			// prepare response
+			res.once('end', function () {
+				if (signal) signal.removeEventListener('abort', abortAndFinalize);
+			});
+			let body = res.pipe(new PassThrough$1());
+
+			const response_options = {
+				url: request.url,
+				status: res.statusCode,
+				statusText: res.statusMessage,
+				headers: headers,
+				size: request.size,
+				timeout: request.timeout,
+				counter: request.counter
+			};
+
+			// HTTP-network fetch step 12.1.1.3
+			const codings = headers.get('Content-Encoding');
+
+			// HTTP-network fetch step 12.1.1.4: handle content codings
+
+			// in following scenarios we ignore compression support
+			// 1. compression support is disabled
+			// 2. HEAD request
+			// 3. no Content-Encoding header
+			// 4. no content response (204)
+			// 5. content not modified response (304)
+			if (!request.compress || request.method === 'HEAD' || codings === null || res.statusCode === 204 || res.statusCode === 304) {
+				response = new Response(body, response_options);
+				resolve(response);
+				return;
+			}
+
+			// For Node v6+
+			// Be less strict when decoding compressed responses, since sometimes
+			// servers send slightly invalid responses that are still accepted
+			// by common browsers.
+			// Always using Z_SYNC_FLUSH is what cURL does.
+			const zlibOptions = {
+				flush: zlib.Z_SYNC_FLUSH,
+				finishFlush: zlib.Z_SYNC_FLUSH
+			};
+
+			// for gzip
+			if (codings == 'gzip' || codings == 'x-gzip') {
+				body = body.pipe(zlib.createGunzip(zlibOptions));
+				response = new Response(body, response_options);
+				resolve(response);
+				return;
+			}
+
+			// for deflate
+			if (codings == 'deflate' || codings == 'x-deflate') {
+				// handle the infamous raw deflate response from old servers
+				// a hack for old IIS and Apache servers
+				const raw = res.pipe(new PassThrough$1());
+				raw.once('data', function (chunk) {
+					// see http://stackoverflow.com/questions/37519828
+					if ((chunk[0] & 0x0F) === 0x08) {
+						body = body.pipe(zlib.createInflate());
+					} else {
+						body = body.pipe(zlib.createInflateRaw());
+					}
+					response = new Response(body, response_options);
+					resolve(response);
+				});
+				return;
+			}
+
+			// for br
+			if (codings == 'br' && typeof zlib.createBrotliDecompress === 'function') {
+				body = body.pipe(zlib.createBrotliDecompress());
+				response = new Response(body, response_options);
+				resolve(response);
+				return;
+			}
+
+			// otherwise, use response as-is
+			response = new Response(body, response_options);
+			resolve(response);
+		});
+
+		writeToStream(req, request);
+	});
+}
+/**
+ * Redirect code matching
+ *
+ * @param   Number   code  Status code
+ * @return  Boolean
+ */
+fetch.isRedirect = function (code) {
+	return code === 301 || code === 302 || code === 303 || code === 307 || code === 308;
+};
+
+// expose Promise
+fetch.Promise = global.Promise;
+
+module.exports = exports = fetch;
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.default = exports;
+exports.Headers = Headers;
+exports.Request = Request;
+exports.Response = Response;
+exports.FetchError = FetchError;
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/lib/vue.global.prod.js" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/lib/vue.global.prod.js"
new file mode 100644
index 0000000000000000000000000000000000000000..1dd6b677ddb46b1f0dffa280b0e6a1ab3b8d196b
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/lib/vue.global.prod.js"
@@ -0,0 +1,7 @@
+// Vue 3.2.4
+// https://cdn.jsdelivr.net/npm/vue@3.2.4/dist/vue.global.prod.js
+// converted to es5 (babel)
+// minified (babel)
+// exported for node modules
+function _inherits(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(n&&n.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),n&&_setPrototypeOf(e,n)}function _setPrototypeOf(e,n){return _setPrototypeOf=Object.setPrototypeOf||function(e,n){return e.__proto__=n,e},_setPrototypeOf(e,n)}function _createSuper(e){var n=_isNativeReflectConstruct();return function(){var t,o=_getPrototypeOf(e);if(n){var s=_getPrototypeOf(this).constructor;t=Reflect.construct(o,arguments,s)}else t=o.apply(this,arguments);return _possibleConstructorReturn(this,t)}}function _possibleConstructorReturn(e,n){if(n&&("object"===_typeof(n)||"function"==typeof n))return n;if(void 0!==n)throw new TypeError("Derived constructors may only return object or undefined");return _assertThisInitialized(e)}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function _isNativeReflectConstruct(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(n){return!1}}function _getPrototypeOf(e){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},_getPrototypeOf(e)}function _createForOfIteratorHelper(e,n){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!t){if(Array.isArray(e)||(t=_unsupportedIterableToArray(e))||n&&e&&"number"==typeof e.length){t&&(e=t);var s=0,a=function(){};return{s:a,n:function(){return s>=e.length?{done:!0}:{done:!1,value:e[s++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,d=!0,l=!1;return{s:function(){t=t.call(e)},n:function(){var e=t.next();return d=e.done,e},e:function(e){l=!0,r=e},f:function(){try{d||null==t["return"]||t["return"]()}finally{if(l)throw r}}}}function _classCallCheck(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,n){for(var t,o=0;o<n.length;o++)t=n[o],t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(e,t.key,t)}function _createClass(e,n,t){return n&&_defineProperties(e.prototype,n),t&&_defineProperties(e,t),e}function _typeof(e){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_typeof(e)}function _defineProperty(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function _slicedToArray(e,n){return _arrayWithHoles(e)||_iterableToArrayLimit(e,n)||_unsupportedIterableToArray(e,n)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _iterableToArrayLimit(e,n){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var o,s,a=[],r=!0,i=!1;try{for(t=t.call(e);!(r=(o=t.next()).done)&&(a.push(o.value),!(n&&a.length===n));r=!0);}catch(e){i=!0,s=e}finally{try{r||null==t["return"]||t["return"]()}finally{if(i)throw s}}return a}}function _arrayWithHoles(e){if(Array.isArray(e))return e}function _toConsumableArray(e){return _arrayWithoutHoles(e)||_iterableToArray(e)||_unsupportedIterableToArray(e)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(e,t){if(e){if("string"==typeof e)return _arrayLikeToArray(e,t);var o=Object.prototype.toString.call(e).slice(8,-1);return"Object"===o&&e.constructor&&(o=e.constructor.name),"Map"===o||"Set"===o?Array.from(e):"Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o)?_arrayLikeToArray(e,t):void 0}}function _iterableToArray(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}function _arrayWithoutHoles(e){if(Array.isArray(e))return _arrayLikeToArray(e)}function _arrayLikeToArray(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,o=Array(n);t<n;t++)o[t]=e[t];return o}var Vue=function(Re){var Nl=Math.max;function e(s,e){for(var t=Object.create(null),n=s.split(","),o=0;o<n.length;o++)t[n[o]]=!0;return e?function(n){return!!t[n.toLowerCase()]}:function(n){return!!t[n]}}function Qe(n){return!!n||""===n}function r(n){if(Gl(n)){for(var e={},t=0;t<n.length;t++){var o=n[t],a=N(o)?s(o):r(o);if(a)for(var i in a)e[i]=a[i]}return e}return N(n)||R(n)?n:void 0}function s(s){var a={};return s.split(n).forEach(function(n){if(n){var e=n.split(o);1<e.length&&(a[e[0].trim()]=e[1].trim())}}),a}function c(n){var e="";if(N(n))e=n;else if(Gl(n))for(var o,s=0;s<n.length;s++)o=c(n[s]),o&&(e+=o+" ");else if(R(n))for(var a in n)n[a]&&(e+=a+" ");return e.trim()}function a(s,e){if(s===e)return!0;var t=T(s),r=T(e);if(t||r)return t&&r&&s.getTime()===e.getTime();if(t=Gl(s),r=Gl(e),t||r)return t&&r&&function(o,e){if(o.length!==e.length)return!1;for(var t=!0,s=0;t&&s<o.length;s++)t=a(o[s],e[s]);return t}(s,e);if(t=R(s),r=R(e),t||r){if(!t||!r)return!1;if(Object.keys(s).length!==Object.keys(e).length)return!1;for(var i in s){var d=s.hasOwnProperty(i),l=e.hasOwnProperty(i);if(d&&!l||!d&&l||!a(s[i],e[i]))return!1}}return s+""===e+""}function d(n,o){return n.findIndex(function(n){return a(n,o)})}function h(n,e){(e=e||Ml)&&e.active&&e.effects.push(n)}function t(n){var e=n.deps;if(e.length){for(var t=0;t<e.length;t++)e[t]["delete"](n);e.length=0}}function te(){ue.push(pe),pe=!1}function de(){var n=ue.pop();pe=void 0===n||n}function ge(s,e,t){if(ye()){var n=Z.get(s);n||Z.set(s,n=new Map);var a=n.get(t);a||n.set(t,a=J()),ve(a)}}function ye(){return pe&&void 0!==Ul}function ve(t){var e=!1;30>=ee?Y(t)||(t.n|=ne,e=!Q(t)):e=!t.has(Ul),e&&(t.add(Ul),Ul.deps.push(t))}function _e(s,e,t,n){var o=Z.get(s);if(o){var a=[];if("clear"===e)a=_toConsumableArray(o.values());else if("length"===t&&Gl(s))o.forEach(function(o,e){("length"==e||e>=n)&&a.push(o)});else switch(void 0!==t&&a.push(o.get(t)),e){case"add":Gl(s)?V(t)&&a.push(o.get("length")):(a.push(o.get(se)),S(s)&&a.push(o.get(re)));break;case"delete":Gl(s)||(a.push(o.get(se)),S(s)&&a.push(o.get(re)));break;case"set":S(s)&&a.push(o.get(se));}if(1===a.length)a[0]&&be(a[0]);else{var r,i=[],d=_createForOfIteratorHelper(a);try{for(d.s();!(r=d.n()).done;){var c=r.value;c&&i.push.apply(i,_toConsumableArray(c))}}catch(e){d.e(e)}finally{d.f()}be(J(i))}}}function be(n){var e,t=_createForOfIteratorHelper(Gl(n)?n:_toConsumableArray(n));try{for(t.s();!(e=t.n()).done;){var o=e.value;(o!==Ul||o.allowRecurse)&&(o.scheduler?o.scheduler():o.run())}}catch(e){t.e(e)}finally{t.f()}}function xe(){var a=!!(0<arguments.length&&arguments[0]!==void 0)&&arguments[0],e=!!(1<arguments.length&&arguments[1]!==void 0)&&arguments[1];return function(t,n,o){if("__v_isReactive"===n)return!a;if("__v_isReadonly"===n)return a;if("__v_raw"===n&&o===(a?e?at:ct:e?lt:it).get(t))return t;var r=Gl(t);if(!a&&r&&C(Ne,n))return Reflect.get(Ne,n,o);var s=Reflect.get(t,n,o);return(E(n)?me.has(n):fe(n))?s:(a||ge(t,0,n),e)?s:xt(s)?r&&V(n)?s:s.value:R(s)?a?dt(s):nt(s):s}}function Se(){var a=!!(0<arguments.length&&arguments[0]!==void 0)&&arguments[0];return function(e,t,n,d){var r=e[t];if(!a&&(n=yt(n),r=yt(r),!Gl(e)&&xt(r)&&!xt(n)))return r.value=n,!0;var c=Gl(e)&&V(t)?+t<e.length:C(e,t),i=Reflect.set(e,t,n,d);return e===yt(d)&&(c?$(n,r)&&_e(e,"set",t,n):_e(e,"add",t,n)),i}}function Fe(a,d){var t=!!(2<arguments.length&&arguments[2]!==void 0)&&arguments[2],n=!!(3<arguments.length&&arguments[3]!==void 0)&&arguments[3],o=yt(a=a.__v_raw),r=yt(d);d===r||t||ge(o,0,d),t||ge(o,0,r);var s=Le(o),c=s.has,i=n?Be:t?Ve:Ie;return c.call(o,d)?i(a.get(d)):c.call(o,r)?i(a.get(r)):void(a!==o&&a.get(d))}function Ae(s){var e=!!(1<arguments.length&&arguments[1]!==void 0)&&arguments[1],t=this.__v_raw,n=yt(t),o=yt(s);return s!==o&&!e&&ge(n,0,s),!e&&ge(n,0,o),s===o?t.has(s):t.has(s)||t.has(o)}function Ue(n){var o=!!(1<arguments.length&&arguments[1]!==void 0)&&arguments[1];return n=n.__v_raw,!o&&ge(yt(n),0,se),Reflect.get(n,"size",n)}function He(n){n=yt(n);var o=yt(this);return Le(o).has.call(o,n)||(o.add(n),_e(o,"add",n,n)),this}function De(a,d){d=yt(d);var l=yt(this),n=Le(l),c=n.has,o=n.get,r=c.call(l,a);r||(a=yt(a),r=c.call(l,a));var p=o.call(l,a);return l.set(a,d),r?$(d,p)&&_e(l,"set",a,d):_e(l,"add",a,d),this}function We(a){var i=yt(this),t=Le(i),d=t.has,n=t.get,o=d.call(i,a);o||(a=yt(a),o=d.call(i,a)),n&&n.call(i,a);var l=i["delete"](a);return o&&_e(i,"delete",a,void 0),l}function Ke(){var o=yt(this),e=0!==o.size,t=o.clear();return e&&_e(o,"clear",void 0,void 0),t}function ze(a,e){return function(d,n){var o=this,t=o.__v_raw,s=yt(t),r=e?Be:a?Ve:Ie;return!a&&ge(s,0,se),t.forEach(function(s,e){return d.call(n,r(s),r(e),o)})}}function Ge(o,e,t){return function(){var n=this.__v_raw,r=yt(n),s=S(r),i="entries"===o||o===Symbol.iterator&&s,d=n[o].apply(n,arguments),a=t?Be:e?Ve:Ie;return!e&&ge(r,0,"keys"===o&&s?re:se),_defineProperty({next:function(){var n=d.next(),o=n.value,e=n.done;return e?{value:o,done:e}:{value:i?[a(o[0]),a(o[1])]:a(o),done:e}}},Symbol.iterator,function(){return this})}}function qe(n){return function(){return"delete"!==n&&this}}function Je(s,e){var a=e?s?et:Ye:s?Xe:ql;return function(e,n,t){return"__v_isReactive"===n?!s:"__v_isReadonly"===n?s:"__v_raw"===n?e:Reflect.get(C(a,n)&&n in e?a:e,n,t)}}function Ze(n){return n.__v_skip||!Object.isExtensible(n)?0:function(n){return"Object"===n||"Array"===n?1:"Map"===n||"Set"===n||"WeakMap"===n||"WeakSet"===n?2:0}(function(n){return I(n).slice(8,-1)}(n))}function nt(n){return n&&n.__v_isReadonly?n:ht(n,!1,Ee,tt,it)}function pt(n){return ht(n,!1,Oe,ot,lt)}function dt(n){return ht(n,!0,Me,rt,ct)}function ht(a,e,t,n,o){if(!R(a))return a;if(a.__v_raw&&(!e||!a.__v_isReactive))return a;var r=o.get(a);if(r)return r;var s=Ze(a);if(0===s)return a;var i=new Proxy(a,2===s?n:t);return o.set(a,i),i}function ft(n){return gt(n)?ft(n.__v_raw):n&&n.__v_isReactive}function gt(n){return n&&n.__v_isReadonly}function mt(n){return ft(n)||gt(n)}function yt(n){var e=n&&n.__v_raw;return e?yt(e):n}function vt(n){return W(n,"__v_skip",!0),n}function _t(n){ye()&&((n=yt(n)).dep||(n.dep=J()),ve(n.dep))}function bt(n){(n=yt(n)).dep&&be(n.dep)}function xt(n){return!!(n&&!0===n.__v_isRef)}function St(n){return kt(n)}function kt(n){var e=!!(1<arguments.length&&arguments[1]!==void 0)&&arguments[1];return xt(n)?n:new Ct(n,e)}function wt(n){return xt(n)?n.value:n}function Nt(n){return ft(n)?n:new Proxy(n,Tt)}function Et(o,e){var t=o[e];return xt(t)?t:new Ft(o,e)}function Rt(t){var e,s;return w(t)?(e=t,s=Wl):(e=t.get,s=t.set),new At(e,s,w(t)||!t.set)}function Pt(d,e){for(var t=d.vnode.props||Kl,o=arguments.length,p=Array(2<o?o-2:0),n=2;n<o;n++)p[n-2]=arguments[n];var u=p,h=e.startsWith("update:"),s=h&&e.slice(7);if(s&&s in t){var i="".concat("modelValue"===s?"model":s,"Modifiers"),f=t[i]||Kl,g=f.number,m=f.trim;m?u=p.map(function(n){return n.trim()}):g&&(u=p.map(z))}var y,v=t[y=j(e)]||t[y=j(O(e))];!v&&h&&(v=t[y=j(H(e))]),v&&_r(v,d,6,u);var _=t[y+"Once"];if(_){if(!d.emitted)d.emitted={};else if(d.emitted[y])return;d.emitted[y]=!0,_r(_,d,6,u)}}function It(a,d){var e=!!(2<arguments.length&&arguments[2]!==void 0)&&arguments[2],n=d.emitsCache,t=n.get(a);if(void 0!==t)return t;var o=a.emits,s={},r=!1;if(!w(a)){var i=function(t){var e=It(t,d,!0);e&&(r=!0,zl(s,e))};!e&&d.mixins.length&&d.mixins.forEach(i),a["extends"]&&i(a["extends"]),a.mixins&&a.mixins.forEach(i)}return o||r?(Gl(o)?o.forEach(function(n){return s[n]=null}):zl(s,o),n.set(a,s),s):(n.set(a,null),null)}function Vt(n,e){return n&&_(e)&&(e=e.slice(2).replace(/Once$/,""),C(n,e[0].toLowerCase()+e.slice(1))||C(n,H(e))||C(n,e))}function Mt(n){var e=Ot;return Ot=n,Jl=n&&n.type.__scopeId||null,e}function Bt(a){var e=1<arguments.length&&arguments[1]!==void 0?arguments[1]:Ot,t=2<arguments.length?arguments[2]:void 0;if(!e)return a;if(a._n)return a;var n=function n(){n._d&&No(-1);var t=Mt(e),o=a.apply(void 0,arguments);return Mt(t),n._d&&No(1),o};return n._n=!0,n._c=!0,n._d=!0,n}function Ut(_){var e,y=_.type,t=_.vnode,n=_.proxy,o=_.withProxy,r=_.props,s=_slicedToArray(_.propsOptions,1),b=s[0],i=_.slots,l=_.attrs,c=_.emit,a=_.render,u=_.renderCache,p=_.data,f=_.setupState,d=_.ctx,h=_.inheritAttrs,m=Mt(_);try{var x;if(4&t.shapeFlag){var C=o||n;e=Wo(a.call(C,C,u,r,f,p,d)),x=l}else{var S=y;0,e=Wo(S(r,1<S.length?{attrs:l,slots:i,emit:c}:null)),x=y.props?l:Ql(l)}var k=e;if(x&&!1!==h){var T=Object.keys(x),w=k,N=w.shapeFlag;T.length&&7&N&&(b&&T.some(v)&&(x=zt(x,b)),k=jo(k,x))}0,t.dirs&&(k.dirs=k.dirs?k.dirs.concat(t.dirs):t.dirs),t.transition&&(k.transition=t.transition),e=k}catch(n){Oo.length=0,br(n,_,1),e=Go(Ao)}return Mt(m),e}function Ht(n){for(var e,o,s=0;s<n.length;s++){if(o=n[s],!Bo(o))return;if(o.type!==Ao||"v-if"===o.children){if(e)return;e=o}}return e}function Dt(s,e,t){var n=Object.keys(e);if(n.length!==Object.keys(s).length)return!0;for(var o,a=0;a<n.length;a++)if(o=n[a],e[o]!==s[o]&&!Vt(t,o))return!0;return!1}function Wt(o,s){for(var n=o.vnode,a=o.parent;a&&a.subTree===n;)(n=a.vnode).el=s,a=a.parent}function Gt(o,e){var t=o.props&&o.props[e];w(t)&&t()}function qt(_,e,b,n,t,o,x,C,S,s){var a=!!(10<arguments.length&&arguments[10]!==void 0)&&arguments[10],l=s.p,c=s.m,p=s.um,d=s.n,r=s.o,i=r.parentNode,u=r.remove,h=z(_.props&&_.props.timeout),f={vnode:_,parent:e,parentComponent:b,isSVG:x,container:n,hiddenContainer:t,anchor:o,deps:0,pendingId:0,timeout:"number"==typeof h?h:-1,activeBranch:null,pendingBranch:null,isInFallback:!0,isHydrating:a,isUnmounted:!1,effects:[],resolve:function(){var u=!!(0<arguments.length&&arguments[0]!==void 0)&&arguments[0],e=f.vnode,t=f.activeBranch,n=f.pendingBranch,o=f.pendingId,r=f.effects,s=f.parentComponent,i=f.container;if(f.isHydrating)f.isHydrating=!1;else if(!u){var l=t&&n.transition&&"out-in"===n.transition.mode;l&&(t.transition.afterLeave=function(){o===f.pendingId&&c(n,i,h,0)});var h=f.anchor;t&&(h=d(t),p(t,s,f,!0)),l||c(n,i,h,0)}Xt(f,n),f.pendingBranch=null,f.isInFallback=!1;for(var g=f.parent,m=!1;g;){if(g.pendingBranch){var y;(y=g.effects).push.apply(y,_toConsumableArray(r)),m=!0;break}g=g.parent}m||Nr(r),f.effects=[],Gt(e,"onResolve")},fallback:function(c){if(f.pendingBranch){var e=f.vnode,t=f.activeBranch,n=f.parentComponent,o=f.container,r=f.isSVG;Gt(e,"onFallback");var s=d(t),i=function(){f.isInFallback&&(l(null,c,o,s,n,null,r,C,S),Xt(f,c))},a=c.transition&&"out-in"===c.transition.mode;a&&(t.transition.afterLeave=i),f.isInFallback=!0,p(t,n,null,!0),a||i()}},move:function(o,e,t){f.activeBranch&&c(f.activeBranch,o,e,t),f.container=o},next:function(){return f.activeBranch&&d(f.activeBranch)},registerDep:function(a,e){var t=!!f.pendingBranch;t&&f.deps++;var n=a.vnode.el;a.asyncDep["catch"](function(e){br(e,a,0)}).then(function(o){if(!(a.isUnmounted||f.isUnmounted||f.pendingId!==a.suspenseId)){a.asyncResolved=!0;var r=a.vnode;ms(a,o),n&&(r.el=n);var s=!n&&a.subTree.el;e(a,r,i(n||a.subTree.el),n?null:d(a.subTree),f,x,S),s&&u(s),Wt(a,r.el),t&&0==--f.deps&&f.resolve()}})},unmount:function(n,e){f.isUnmounted=!0,f.activeBranch&&p(f.activeBranch,b,n,e),f.pendingBranch&&p(f.pendingBranch,b,n,e)}};return f}function Jt(n){var o;if(w(n)){var s=n._c;s&&(n._d=!1,ko()),n=n(),s&&(n._d=!0,o=Po,To())}if(Gl(n)){var a=Ht(n);n=a}return n=Wo(n),o&&!n.dynamicChildren&&(n.dynamicChildren=o.filter(function(e){return e!==n})),n}function Qt(n,e){var t;e&&e.pendingBranch?Gl(n)?(t=e.effects).push.apply(t,_toConsumableArray(n)):e.effects.push(n):Nr(n)}function Xt(s,e){s.activeBranch=e;var t=s.vnode,n=s.parentComponent,o=t.el=e.el;n&&n.subTree===t&&(n.vnode.el=o,Wt(n,o))}function en(n,e){if(ac){var t=ac.provides,o=ac.parent&&ac.parent.provides;o===t&&(t=ac.provides=Object.create(o)),t[n]=e}else;}function tn(s,e){var t=!!(2<arguments.length&&arguments[2]!==void 0)&&arguments[2],n=ac||Ot;if(n){var o=null==n.parent?n.vnode.appContext&&n.vnode.appContext.provides:n.parent.provides;if(o&&s in o)return o[s];if(1<arguments.length)return t&&w(e)?e.call(n.proxy):e}}function nn(){var n={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Nn(function(){n.isMounted=!0}),Rn(function(){n.isUnmounting=!0}),n}function on(s,e){var t=s.leavingVNodes,n=t.get(e.type);return n||(n=Object.create(null),t.set(e.type,n)),n}function ln(C,i,k,n){var e=i.appear,t=i.mode,o=i.persisted,r=i.onBeforeEnter,T=i.onEnter,c=i.onAfterEnter,a=i.onEnterCancelled,l=i.onBeforeLeave,p=i.onLeave,u=i.onAfterLeave,d=i.onLeaveCancelled,s=i.onBeforeAppear,h=i.onAppear,f=i.onAfterAppear,g=i.onAppearCancelled,m=C.key+"",y=on(k,C),v=function(o,e){o&&_r(o,n,9,e)},_={mode:t,persisted:void 0!==o&&o,beforeEnter:function(n){var t=r;if(!k.isMounted){if(!e)return;t=s||r}n._leaveCb&&n._leaveCb(!0);var a=y[m];a&&Uo(C,a)&&a.el._leaveCb&&a.el._leaveCb(),v(t,[n])},enter:function(n){var r=T,d=c,p=a;if(!k.isMounted){if(!e)return;r=h||T,d=f||c,p=g||a}var u=!1,m=n._enterCb=function(e){u||(u=!0,v(e?p:d,[n]),_.delayedLeave&&_.delayedLeave(),n._enterCb=void 0)};r?(r(n,m),1>=r.length&&m()):m()},leave:function(e,t){var o=C.key+"";if(e._enterCb&&e._enterCb(!0),k.isUnmounting)return t();v(l,[e]);var a=!1,n=e._leaveCb=function(s){a||(a=!0,t(),v(s?d:u,[e]),e._leaveCb=void 0,y[o]===C&&delete y[o])};y[o]=C,p?(p(e,n),1>=p.length&&n()):n()},clone:function(t){return ln(t,i,k,n)}};return _}function cn(n){if(hn(n))return(n=jo(n)).children=null,n}function an(n){return hn(n)?n.children?n.children[0]:void 0:n}function un(n,e){6&n.shapeFlag&&n.component?un(n.component.subTree,e):128&n.shapeFlag?(n.ssContent.transition=e.clone(n.ssContent),n.ssFallback.transition=e.clone(n.ssFallback)):n.transition=e}function pn(s){for(var e,a=!!(1<arguments.length&&arguments[1]!==void 0)&&arguments[1],t=[],r=0,i=0;i<s.length;i++)e=s[i],e.type===Eo?(128&e.patchFlag&&r++,t=t.concat(pn(e.children,a))):(a||e.type!==Ao)&&t.push(e);if(1<r)for(var d=0;d<t.length;d++)t[d].patchFlag=-2;return t}function fn(n){return w(n)?{setup:n,name:n.name}:n}function dn(s,e){var a=e.vnode,i=a.ref,t=a.props,n=a.children,o=Go(s,t,n);return o.ref=i,o}function mn(n,o){return Gl(n)?n.some(function(n){return mn(n,o)}):N(n)?-1<n.split(",").indexOf(o):!!n.test&&n.test(o)}function yn(n,e){_n(n,"a",e)}function bn(n,e){_n(n,"da",e)}function _n(s,e){var a=2<arguments.length&&arguments[2]!==void 0?arguments[2]:ac,n=s.__wdc||(s.__wdc=function(){for(var e=a;e;){if(e.isDeactivated)return;e=e.parent}s()});if(wn(e,n,a),a)for(var t=a.parent;t&&t.parent;)hn(t.parent.vnode)&&Sn(n,e,a,t),t=t.parent}function Sn(s,e,t,n){var o=wn(e,s,n,!0);Fn(function(){b(n[e],o)},t)}function xn(n){var e=n.shapeFlag;256&e&&(e-=256),512&e&&(e-=512),n.shapeFlag=e}function Cn(n){return 128&n.shapeFlag?n.ssContent:n}function wn(s,e){var t=2<arguments.length&&arguments[2]!==void 0?arguments[2]:ac,n=!!(3<arguments.length&&arguments[3]!==void 0)&&arguments[3];if(t){var o=t[s]||(t[s]=[]),a=e.__weh||(e.__weh=function(){if(!t.isUnmounted){te(),pr(t);for(var n=arguments.length,a=Array(n),o=0;o<n;o++)a[o]=arguments[o];var i=_r(e,t,s,a);return fr(),de(),i}});return n?o.unshift(a):o.push(a),a}}function kn(n){var e=1<arguments.length&&arguments[1]!==void 0?arguments[1]:ac;wn("ec",n,e)}function In(y){function e(n,e){Gl(e)?e.forEach(function(e){return n(e.bind(I))}):e&&n(e.bind(I))}var N=jn(y),I=y.proxy,n=y.ctx;Pn=!1,N.beforeCreate&&Bn(N.beforeCreate,y,"bc");var t=N.data,o=N.computed,s=N.methods,r=N.watch,i=N.provide,l=N.inject,a=N.created,c=N.beforeMount,p=N.mounted,u=N.beforeUpdate,d=N.updated,h=N.activated,f=N.deactivated,g=N.beforeUnmount,m=N.unmounted,v=N.render,_=N.renderTracked,b=N.renderTriggered,x=N.errorCaptured,C=N.serverPrefetch,S=N.expose,k=N.inheritAttrs,T=N.components,E=N.directives;if(l&&function(a,r){var t=2<arguments.length&&arguments[2]!==void 0?arguments[2]:Wl,i=!!(3<arguments.length&&arguments[3]!==void 0)&&arguments[3];Gl(a)&&(a=Wn(a));var n=function(e){var t=a[e],n=void 0;n=R(t)?"default"in t?tn(t.from||e,t["default"],!0):tn(t.from||e):tn(t),xt(n)&&i?Object.defineProperty(r,e,{enumerable:!0,configurable:!0,get:function(){return n.value},set:function(t){return n.value=t}}):r[e]=n};for(var o in a)n(o)}(l,n,null,y.appContext.config.unwrapInjectedRef),s)for(var P in s){var F=s[P];w(F)&&(n[P]=F.bind(I))}if(t){var A=t.call(I,I);R(A)&&(y.data=nt(A))}if(Pn=!0,o){var V=function(s){var a=o[s],r=Rt({get:w(a)?a.bind(I,I):w(a.get)?a.get.bind(I,I):Wl,set:!w(a)&&w(a.set)?a.set.bind(I):Wl});Object.defineProperty(n,s,{enumerable:!0,configurable:!0,get:function(){return r.value},set:function(n){return r.value=n}})};for(var M in o)V(M)}if(r)for(var B in r)Ln(r[B],n,I,B);if(i){var L=w(i)?i.call(I):i;Reflect.ownKeys(L).forEach(function(e){en(e,L[e])})}if(a&&Bn(a,y,"c"),e(Tn,c),e(Nn,p),e(En,u),e($n,d),e(yn,h),e(bn,f),e(kn,x),e(On,_),e(Mn,b),e(Rn,g),e(Fn,m),e(An,C),Gl(S))if(S.length){var O=y.exposed||(y.exposed={});S.forEach(function(n){Object.defineProperty(O,n,{get:function(){return I[n]},set:function(e){return I[n]=e}})})}else y.exposed||(y.exposed={});v&&y.render===Wl&&(y.render=v),null!=k&&(y.inheritAttrs=k),T&&(y.components=T),E&&(y.directives=E)}function Bn(o,s,e){_r(Gl(o)?o.map(function(n){return n.bind(s.proxy)}):o.bind(s.proxy),s,e)}function Ln(s,a,t,n){var e=n.includes(".")?ss(t,n):function(){return t[n]};if(N(s)){var o=a[s];w(o)&&ts(e,o)}else if(w(s))ts(e,s.bind(t));else if(R(s))if(Gl(s))s.forEach(function(o){return Ln(o,a,t,n)});else{var r=w(s.handler)?s.handler.bind(t):a[s.handler];w(r)&&ts(e,r,s)}}function jn(a){var d,e=a.type,t=e.mixins,n=e["extends"],o=a.appContext,p=o.mixins,r=o.optionsCache,s=o.config.optionMergeStrategies,i=r.get(e);return i?d=i:p.length||t||n?(d={},p.length&&p.forEach(function(n){return Un(d,n,s,!0)}),Un(d,e,s)):d=e,r.set(e,d),d}function Un(a,e,i){var n=!!(3<arguments.length&&void 0!==arguments[3])&&arguments[3],t=e.mixins,o=e["extends"];for(var s in o&&Un(a,o,i,!0),t&&t.forEach(function(e){return Un(a,e,i,!0)}),e)if(n&&"expose"===s);else{var r=Yl[s]||i&&i[s];a[s]=r?r(a[s],e[s]):e[s]}return a}function Hn(n,e){return e?n?function(){return zl(w(n)?n.call(this,this):n,w(e)?e.call(this,this):e)}:e:n}function Wn(n){if(Gl(n)){for(var e={},t=0;t<n.length;t++)e[n[t]]=n[t];return e}return n}function zn(n,e){return n?_toConsumableArray(new Set([].concat(n,e))):e}function Kn(n,e){return n?zl(zl(Object.create(null),n),e):e}function Gn(a,e,t,n){var o,d=_slicedToArray(a.propsOptions,2),c=d[0],r=d[1],s=!1;if(e)for(var p in e)if(!M(p)){var u=e[p],h=void 0;c&&C(c,h=O(p))?r&&r.includes(h)?(o||(o={}))[h]=u:t[h]=u:Vt(a.emitsOptions,p)||u!==n[p]&&(n[p]=u,s=!0)}if(r)for(var f,g=yt(t),m=o||Kl,y=0;y<r.length;y++)f=r[y],t[f]=qn(c,g,f,m[f],a,!C(m,f));return s}function qn(a,e,t,n,d,r){var s=a[t];if(null!=s){var i=C(s,"default");if(i&&void 0===n){var l=s["default"];if(s.type!==Function&&w(l)){var c=d.propsDefaults;t in c?n=c[t]:(pr(d),n=c[t]=l.call(null,e),fr())}else n=l}s[0]&&(r&&!i?n=!1:!s[1]||""!==n&&n!==H(t)||(n=!0))}return n}function Jn(d,p){var e=!!(2<arguments.length&&arguments[2]!==void 0)&&arguments[2],n=p.propsCache,t=n.get(d);if(t)return t;var o=d.props,s={},r=[],i=!1;if(!w(d)){var l=function(t){i=!0;var e=Jn(t,p,!0),a=_slicedToArray(e,2),d=a[0],n=a[1];zl(s,d),n&&r.push.apply(r,_toConsumableArray(n))};!e&&p.mixins.length&&p.mixins.forEach(l),d["extends"]&&l(d["extends"]),d.mixins&&d.mixins.forEach(l)}if(!o&&!i)return n.set(d,g),g;if(Gl(o))for(var u,h=0;h<o.length;h++)u=O(o[h]),Zn(u)&&(s[u]=Kl);else if(o)for(var f in o){var m=O(f);if(Zn(m)){var y=o[f],v=s[m]=Gl(y)||w(y)?{type:y}:y;if(v){var _=Yn(Boolean,v.type),b=Yn(String,v.type);v[0]=-1<_,v[1]=0>b||_<b,(-1<_||C(v,"default"))&&r.push(m)}}}var x=[s,r];return n.set(d,x),x}function Zn(n){return"$"!==n[0]}function Qn(n){var e=n&&n.toString().match(/^\s*function (\w+)/);return e?e[1]:null===n?"null":""}function Xn(n,e){return Qn(n)===Qn(e)}function Yn(n,e){return Gl(e)?e.findIndex(function(e){return Xn(e,n)}):w(e)&&Xn(e,n)?0:-1}function Yt(a,e,t,n){for(var o,i=a.dirs,r=e&&e.dirs,s=0;s<i.length;s++){o=i[s],r&&(o.oldValue=r[s].value);var d=o.dir[n];d&&(te(),_r(d,t,8,[a.el,o,a,e]),de())}}function Zt(){return{app:null,config:{isNativeTag:m,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}function eo(d,e){return function(t){var n=1<arguments.length&&arguments[1]!==void 0?arguments[1]:null;null==n||R(n)||(n=null);var p=Zt(),a=new Set,r=!1,u=p.app={_uid:so++,_component:t,_props:n,_container:null,_context:p,_instance:null,version:us,get config(){return p.config},set config(n){},use:function(n){for(var e=arguments.length,o=Array(1<e?e-1:0),t=1;t<e;t++)o[t-1]=arguments[t];return a.has(n)||(n&&w(n.install)?(a.add(n),n.install.apply(n,[u].concat(o))):w(n)&&(a.add(n),n.apply(void 0,[u].concat(o)))),u},mixin:function(n){return p.mixins.includes(n)||p.mixins.push(n),u},component:function(n,e){return e?(p.components[n]=e,u):p.components[n]},directive:function(n,e){return e?(p.directives[n]=e,u):p.directives[n]},mount:function(o,s,i){if(!r){var a=Go(t,n);return a.appContext=p,s&&e?e(a,o):d(a,o,i),r=!0,u._container=o,o.__vue_app__=u,a.component.proxy}},unmount:function(){r&&(d(null,u._container),delete u._container.__vue_app__)},provide:function(n,e){return p.provides[n]=e,u}};return u}}function ao(b){var e=b.mt,g=b.p,n=b.o,m=n.patchProp,C=n.nextSibling,r=n.parentNode,s=n.remove,y=n.insert,l=n.createComment,v=function s(u,n,o,i,l){var c=!!(5<arguments.length&&arguments[5]!==void 0)&&arguments[5],h=po(u)&&"["===u.data,f=function(){return a(u,n,o,i,l,h)},g=n.type,m=n.ref,y=n.shapeFlag,v=u.nodeType;n.el=u;var _=null;switch(g){case Fo:3===v?(u.data!==n.children&&(Zl=!0,u.data=n.children),_=C(u)):_=f();break;case Ao:_=8!==v||h?f():C(u);break;case Mo:if(1===v){_=u;for(var S=!n.children.length,T=0;T<n.staticCount;T++)S&&(n.children+=_.outerHTML),T===n.staticCount-1&&(n.anchor=_),_=C(_);return _}_=f();break;case Eo:_=h?p(u,n,o,i,l,c):f();break;default:if(1&y)_=1!==v||n.type.toLowerCase()!==u.tagName.toLowerCase()?f():t(u,n,o,i,l,c);else if(6&y){n.slotScopeIds=l;var w=r(u);if(e(n,w,null,o,i,ec(w),c),_=h?d(u):C(u),sn(n)){var N;h?(N=Go(Eo),N.anchor=_?_.previousSibling:w.lastChild):N=3===u.nodeType?$o(""):Go("div"),N.el=u,n.component.subTree=N}}else 64&y?_=8===v?n.type.hydrate(u,n,o,i,l,c,b,k):f():128&y&&(_=n.type.hydrate(u,n,o,i,ec(r(u)),l,c,b,s));}return null!=m&&go(m,null,i,n),_},t=function(o,e,t,n,r,i){i=i||!!e.dynamicChildren;var p=e.type,c=e.props,a=e.patchFlag,u=e.shapeFlag,f=e.dirs,d="input"===p&&f||"option"===p;if(d||-1!==a){if(f&&Yt(e,null,t,"created"),c)if(d||!i||48&a)for(var h in c)(d&&h.endsWith("value")||_(h)&&!M(h))&&m(o,h,null,c[h]);else c.onClick&&m(o,"onClick",null,c.onClick);var g;if((g=c&&c.onVnodeBeforeMount)&&yo(g,t,e),f&&Yt(e,null,t,"beforeMount"),((g=c&&c.onVnodeMounted)||f)&&Qt(function(){g&&yo(g,t,e),f&&Yt(e,null,t,"mounted")},n),16&u&&(!c||!c.innerHTML&&!c.textContent))for(var y=k(o.firstChild,e,o,t,n,r,i);y;){Zl=!0;var v=y;y=y.nextSibling,s(v)}else 8&u&&o.textContent!==e.children&&(Zl=!0,o.textContent=e.children)}return o.nextSibling},k=function(n,a,t,o,r,s,i){i=i||!!a.dynamicChildren;for(var d,p=a.children,c=p.length,u=0;u<c;u++)if(d=i?p[u]:p[u]=Wo(p[u]),n)n=v(n,d,o,r,s,i);else{if(d.type===Fo&&!d.children)continue;Zl=!0,g(null,d,t,null,o,r,ec(t),s)}return n},p=function(s,e,t,n,o,c){var a=e.slotScopeIds;a&&(o=o?o.concat(a):a);var p=r(s),u=k(C(s),e,p,t,n,o,c);return u&&po(u)&&"]"===u.data?C(e.anchor=u):(Zl=!0,y(e.anchor=l("]"),p,u),u)},a=function(n,e,t,o,i,l){if(Zl=!0,e.el=null,l)for(var a,c=d(n);;){if(a=C(n),!a||a===c)break;s(a)}var h=C(n),u=r(n);return s(n),g(null,e,u,h,t,o,ec(u),i),h},d=function(n){for(var o=0;n;)if((n=C(n))&&po(n)&&("["===n.data&&o++,"]"===n.data)){if(0===o)return C(n);o--}return n};return[function(n,e){return e.hasChildNodes()?void(Zl=!1,v(e.firstChild,n,null,null,null),Rr(),Zl&&console.error("Hydration completed but contains mismatches.")):(g(null,n,e),void Rr())},v]}function io(n){return ho(n)}function lo(n){return ho(n,ao)}function ho(y,e){var t,v,T,P,D=y.insert,j=y.remove,z=y.patchProp,n=y.createElement,J=y.createText,s=y.createComment,o=y.setText,Z=y.setElementText,a=y.parentNode,i=y.nextSibling,r=y.setScopeId,l=void 0===r?Wl:r,ee=y.cloneNode,d=y.insertStaticContent,h=function(d,h,t){var n=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null,g=4<arguments.length&&arguments[4]!==void 0?arguments[4]:null,r=5<arguments.length&&arguments[5]!==void 0?arguments[5]:null,s=!!(6<arguments.length&&arguments[6]!==void 0)&&arguments[6],i=7<arguments.length&&arguments[7]!==void 0?arguments[7]:null,l=8<arguments.length&&arguments[8]!==void 0?arguments[8]:!!h.dynamicChildren;if(d!==h){d&&!Uo(d,h)&&(n=Q(d),$(d,g,r,!0),d=null),-2===h.patchFlag&&(l=!1,h.dynamicChildren=null);var y=h.type,a=h.ref,u=h.shapeFlag;y===Fo?f(d,h,t,n):y===Ao?m(d,h,t,n):y===Mo?null==d&&_(h,t,n,s):y===Eo?N(d,h,t,n,g,r,s,i,l):1&u?b(d,h,t,n,g,r,s,i,l):6&u?E(d,h,t,n,g,r,s,i,l):(64&u||128&u)&&y.process(d,h,t,n,g,r,s,i,l,Y),null!=a&&g&&go(a,d&&d.ref,r,h||d,!h)}},f=function(n,e,t,s){if(null==n)D(e.el=J(e.children),t,s);else{var a=e.el=n.el;e.children!==n.children&&o(a,e.children)}},m=function(n,e,t,o){null==n?D(e.el=s(e.children||""),t,o):e.el=n.el},_=function(s,e,t,n){var o=d(s.children,e,t,n),a=_slicedToArray(o,2);s.el=a[0],s.anchor=a[1]},b=function(a,e,t,n,o,r,s,d,l){s=s||"svg"===e.type,null==a?p(e,t,n,o,r,s,d,l):u(a,e,o,r,s,d,l)},p=function(s,e,t,o,a,r,i,d){var l,c,p=s.type,u=s.props,g=s.shapeFlag,m=s.transition,y=s.patchFlag,v=s.dirs;if(s.el&&void 0!==ee&&-1===y)l=s.el=ee(s.el);else{if(l=s.el=n(s.type,r,u&&u.is,u),8&g?Z(l,s.children):16&g&&S(s.children,l,null,o,a,r&&"foreignObject"!==p,i,d),v&&Yt(s,null,o,"created"),u){for(var _ in u)"value"===_||M(_)||z(l,_,null,u[_],r,s.children,o,a,re);"value"in u&&z(l,"value",null,u.value),(c=u.onVnodeBeforeMount)&&yo(c,o,s)}x(l,s,s.scopeId,i,o)}v&&Yt(s,null,o,"beforeMount");var b=(!a||a&&!a.pendingBranch)&&m&&!m.persisted;b&&m.beforeEnter(l),D(l,e,t),((c=u&&u.onVnodeMounted)||b||v)&&fo(function(){c&&yo(c,o,s),b&&m.enter(l),v&&Yt(s,null,o,"mounted")},a)},x=function s(a,e,t,n,o){if(t&&l(a,t),n)for(var r=0;r<n.length;r++)l(a,n[r]);if(o&&e===o.subTree){var i=o.vnode;s(a,i,i.scopeId,i.slotScopeIds,o.parent)}},S=function(a,e,t,n,o,r,s,i){for(var d,l=8<arguments.length&&arguments[8]!==void 0?arguments[8]:0,c=l;c<a.length;c++)d=a[c]=i?qo(a[c]):Wo(a[c]),h(null,d,e,t,n,o,r,s,i)},u=function(a,e,t,n,o,s,r){var i=e.el=a.el,l=e.patchFlag,c=e.dynamicChildren,p=e.dirs;l|=16&a.patchFlag;var f,g=a.props||Kl,d=e.props||Kl;(f=d.onVnodeBeforeUpdate)&&yo(f,t,e,a),p&&Yt(e,a,t,"beforeUpdate");var h=o&&"foreignObject"!==e.type;if(c?k(a.dynamicChildren,c,i,t,n,h,s):r||V(a,e,i,null,t,n,h,s,!1),0<l){if(16&l)w(i,e,g,d,t,n,o);else if(2&l&&g["class"]!==d["class"]&&z(i,"class",null,d["class"],o),4&l&&z(i,"style",g.style,d.style,o),8&l)for(var y=e.dynamicProps,v=0;v<y.length;v++){var _=y[v],b=g[_],x=d[_];x===b&&"value"!==_||z(i,_,b,x,o,a.children,t,n,re)}1&l&&a.children!==e.children&&Z(i,e.children)}else r||null!=c||w(i,e,g,d,t,n,o);((f=d.onVnodeUpdated)||p)&&fo(function(){f&&yo(f,t,e,a),p&&Yt(e,a,t,"updated")},n)},k=function(d,e,t,n,o,r,s){for(var i=0;i<e.length;i++){var l=d[i],c=e[i],p=l.el&&(l.type===Eo||!Uo(l,c)||70&l.shapeFlag)?a(l.el):t;h(l,c,p,null,n,o,r,s,!0)}},w=function(a,e,t,n,o,s,r){if(t!==n){for(var i in n)if(!M(i)){var d=n[i],l=t[i];d!==l&&"value"!==i&&z(a,i,l,d,r,e.children,o,s,re)}if(t!==Kl)for(var c in t)M(c)||c in n||z(a,c,t[c],null,r,e.children,o,s,re);"value"in n&&z(a,"value",t.value,n.value)}},N=function(n,e,t,o,r,s,i,l,c){var u=e.el=n?n.el:J(""),p=e.anchor=n?n.anchor:J(""),f=e.patchFlag,d=e.dynamicChildren,h=e.slotScopeIds;h&&(l=l?l.concat(h):h),null==n?(D(u,t,o),D(p,t,o),S(e.children,t,p,r,s,i,l,c)):0<f&&64&f&&d&&n.dynamicChildren?(k(n.dynamicChildren,d,t,r,s,i,l),(null!=e.key||r&&e===r.subTree)&&vo(n,e,!0)):V(n,e,t,p,r,s,i,l,c)},E=function(a,e,t,n,o,r,s,i,d){e.slotScopeIds=i,null==a?512&e.shapeFlag?o.ctx.activate(e,t,n,s,d):R(e,t,n,o,r,s,d):A(a,e,d)},R=function(a,e,t,n,o,r,s){var i=a.component=function(a,e,t){var n=a.type,o=(e?e.appContext:a.appContext)||lr,r={uid:cr++,vnode:a,type:n,parent:e,appContext:o,root:null,next:null,subTree:null,update:null,scope:new q(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:e?e.provides:Object.create(o.provides),accessCache:null,renderCache:[],components:null,directives:null,propsOptions:Jn(n,o),emitsOptions:It(n,o),emit:null,emitted:null,propsDefaults:Kl,inheritAttrs:n.inheritAttrs,ctx:Kl,data:Kl,props:Kl,attrs:Kl,slots:Kl,refs:Kl,setupState:Kl,setupContext:null,suspense:t,suspenseId:t?t.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return r.ctx={_:r},r.root=e?e.root:r,r.emit=Pt.bind(null,r),a.ce&&a.ce(r),r}(a,n,o);if(!(hn(a)&&(i.ctx.renderer=Y),function(s){var e=!!(1<arguments.length&&arguments[1]!==void 0)&&arguments[1];dr=e;var t=s.vnode,a=t.props,n=t.children,o=Zo(s);(function(a,e,t){var n=!!(3<arguments.length&&void 0!==arguments[3])&&arguments[3],o={},r={};for(var s in W(r,tc,1),a.propsDefaults=Object.create(null),Gn(a,e,o,r),a.propsOptions[0])s in o||(o[s]=void 0);a.props=t?n?o:pt(o):a.type.props?o:r,a.attrs=r})(s,a,o,e),function(n,e){if(32&n.vnode.shapeFlag){var t=e._;t?(n.slots=yt(e),W(e,"_",t)):oo(e,n.slots={})}else n.slots={},e&&ro(n,e);W(n.slots,tc,1)}(s,n);o?function(s,e){var t=s.type;s.accessCache=Object.create(null),s.proxy=vt(new Proxy(s.ctx,sr));var n=t.setup;if(n){var o=s.setupContext=1<n.length?Ps(s):null;pr(s),te();var a=yr(n,s,0,[s.props,o]);if(de(),fr(),F(a)){if(a.then(fr,fr),e)return a.then(function(e){ms(s,e)})["catch"](function(e){br(e,s,0)});s.asyncDep=a}else ms(s,a)}else Is(s)}(s,e):void 0;dr=!1}(i),i.asyncDep))c(i,a,e,t,o,r,s);else if(o&&o.registerDep(i,c),!a.el){var d=i.subTree=Go(Ao);m(null,d,e,t)}},A=function(s,e,t){var n=e.component=s.component;if(function(d,e,t){var n=d.props,o=d.children,r=d.component,s=e.props,i=e.children,l=e.patchFlag,c=r.emitsOptions;if(e.dirs||e.transition)return!0;if(!(t&&0<=l))return(o||i)&&(!i||!i.$stable)||n!==s&&(n?!s||Dt(n,s,c):!!s);if(1024&l)return!0;if(16&l)return n?Dt(n,s,c):!!s;if(8&l)for(var a,p=e.dynamicProps,u=0;u<p.length;u++)if(a=p[u],s[a]!==n[a]&&!Vt(c,a))return!0;return!1}(s,e,t)){if(n.asyncDep&&!n.asyncResolved)return void I(n,e,t);n.next=e,function(n){var e=pc.indexOf(n);e>Pr&&pc.splice(e,1)}(n.update),n.update()}else e.component=s.component,e.el=s.el,n.vnode=e},c=function(d,e,p,u,f,r,s){var i=new ce(function(){if(d.isMounted){var n,t=d.next,o=d.bu,l=d.u,c=d.parent,g=d.vnode,m=t;i.allowRecurse=!1,t?(t.el=g.el,I(d,t,s)):t=g,o&&K(o),(n=t.props&&t.props.onVnodeBeforeUpdate)&&yo(n,c,t,g),i.allowRecurse=!0;var y=Ut(d),v=d.subTree;d.subTree=y,h(v,y,a(v.el),Q(v),d,f,r),t.el=y.el,null===m&&Wt(d,y.el),l&&fo(l,f),(n=t.props&&t.props.onVnodeUpdated)&&fo(function(){return yo(n,c,t,g)},f)}else{var _,b=e,x=b.el,C=b.props,S=d.bm,k=d.m,T=d.parent,w=sn(e);if(i.allowRecurse=!1,S&&K(S),!w&&(_=C&&C.onVnodeBeforeMount)&&yo(_,T,e),i.allowRecurse=!0,x&&P){var N=function(){d.subTree=Ut(d),P(x,d.subTree,d,f,null)};w?e.type.__asyncLoader().then(function(){return!d.isUnmounted&&N()}):N()}else{var E=d.subTree=Ut(d);h(null,E,p,u,d,f,r),e.el=E.el}if(k&&fo(k,f),!w&&(_=C&&C.onVnodeMounted)){var R=e;fo(function(){return yo(_,T,R)},f)}256&e.shapeFlag&&d.a&&fo(d.a,f),d.isMounted=!0,e=p=u=null}},function(){return Sr(d.update)},d.scope),l=d.update=i.run.bind(i);l.id=d.uid,i.allowRecurse=l.allowRecurse=!0,l()},I=function(s,e,t){e.component=s;var n=s.vnode.props;s.vnode=e,s.next=null,function(d,e,t,n){var o=d.props,r=d.attrs,s=d.vnode.patchFlag,i=yt(o),l=_slicedToArray(d.propsOptions,1),p=l[0],c=!1;if(!(n||0<s)||16&s){var u;for(var h in Gn(d,e,o,r)&&(c=!0),i)e&&(C(e,h)||(u=H(h))!==h&&C(e,u))||(p?!t||void 0===t[h]&&void 0===t[u]||(o[h]=qn(p,i,h,void 0,d,!0)):delete o[h]);if(r!==i)for(var f in r)e&&C(e,f)||(delete r[f],c=!0)}else if(8&s)for(var g=d.vnode.dynamicProps,m=0;m<g.length;m++){var y=g[m],v=e[y];if(!p)v!==r[y]&&(r[y]=v,c=!0);else if(C(r,y))v!==r[y]&&(r[y]=v,c=!0);else{var _=O(y);o[_]=qn(p,i,_,v,d,!1)}}c&&_e(d,"set","$attrs")}(s,e.props,n,t),function(a,e,t){var n=a.vnode,o=a.slots,r=!0,d=Kl;if(32&n.shapeFlag){var l=e._;l?t&&1===l?r=!1:(zl(o,e),t||1!==l||delete o._):(r=!e.$stable,oo(e,o)),d=e}else e&&(ro(a,e),d={default:1});if(r)for(var c in o)Dn(c)||c in d||delete o[c]}(s,e.children,t),te(),Er(void 0,s.update),de()},V=function(a,e,t,n,o,r,s,i){var l=!!(8<arguments.length&&arguments[8]!==void 0)&&arguments[8],c=a&&a.children,u=a?a.shapeFlag:0,p=e.children,f=e.patchFlag,d=e.shapeFlag;if(0<f){if(128&f)return void L(c,p,t,n,o,r,s,i,l);if(256&f)return void B(c,p,t,n,o,r,s,i,l)}8&d?(16&u&&re(c,o,r),p!==c&&Z(t,p)):16&u?16&d?L(c,p,t,n,o,r,s,i,l):re(c,o,r,!0):(8&u&&Z(t,""),16&d&&S(p,t,n,o,r,s,i,l))},B=function(d,m,y,n,o,r,s,i,l){var c,v=(d=d||g).length,a=(m=m||g).length,u=Math.min(v,a);for(c=0;c<u;c++){var p=m[c]=l?qo(m[c]):Wo(m[c]);h(d[c],p,y,null,o,r,s,i,l)}v>a?re(d,o,r,!0,!1,u):S(m,y,n,o,r,s,i,l,u)},L=function(d,e,t,n,o,r,s,i,l){for(var c=0,m=e.length,u=d.length-1,y=m-1;c<=u&&c<=y;){var v=d[c],_=e[c]=l?qo(e[c]):Wo(e[c]);if(!Uo(v,_))break;h(v,_,t,null,o,r,s,i,l),c++}for(;c<=u&&c<=y;){var b=d[u],x=e[y]=l?qo(e[y]):Wo(e[y]);if(!Uo(b,x))break;h(b,x,t,null,o,r,s,i,l),u--,y--}if(c>u){if(c<=y)for(var C=y+1,S=C<m?e[C].el:n;c<=y;)h(null,e[c]=l?qo(e[c]):Wo(e[c]),t,S,o,r,s,i,l),c++;}else if(c>y)for(;c<=u;)$(d[c],o,r,!0),c++;else{var k=c,T=c,w=new Map;for(c=T;c<=y;c++){var N=e[c]=l?qo(e[c]):Wo(e[c]);null!=N.key&&w.set(N.key,c)}var E,R=0,I=y-T+1,P=!1,F=0,A=Array(I);for(c=0;c<I;c++)A[c]=0;for(c=k;c<=u;c++){var V=d[c];if(R>=I){$(V,o,r,!0);continue}var M=void 0;if(null!=V.key)M=w.get(V.key);else for(E=T;E<=y;E++)if(0===A[E-T]&&Uo(V,e[E])){M=E;break}void 0===M?$(V,o,r,!0):(A[M-T]=c+1,M>=F?F=M:P=!0,h(V,e[M],t,null,o,r,s,i,l),R++)}var B=P?function(a){var e,d,p,u,h,f=a.slice(),t=[0],n=a.length;for(e=0;e<n;e++){var c=a[e];if(0!==c){if(d=t[t.length-1],a[d]<c){f[e]=d,t.push(e);continue}for(p=0,u=t.length-1;p<u;)h=p+u>>1,a[t[h]]<c?p=h+1:u=h;c<a[t[p]]&&(0<p&&(f[e]=t[p-1]),t[p]=e)}}for(p=t.length,u=t[p-1];0<p--;)t[p]=u,u=f[u];return t}(A):g;for(E=B.length-1,c=I-1;0<=c;c--){var L=T+c,O=e[L],H=L+1<m?e[L+1].el:n;0===A[c]?h(null,O,t,H,o,r,s,i,l):P&&(0>E||c!==B[E]?U(O,t,H,2):E--)}}},U=function n(d,e,t,o){var r=4<arguments.length&&arguments[4]!==void 0?arguments[4]:null,s=d.el,p=d.type,l=d.transition,c=d.children,a=d.shapeFlag;if(6&a)return void n(d.component.subTree,e,t,o);if(128&a)return void d.suspense.move(e,t,o);if(64&a)return void p.move(d,e,t,Y);if(p===Eo){D(s,e,t);for(var u=0;u<c.length;u++)n(c[u],e,t,o);return void D(d.anchor,e,t)}if(p===Mo)return void function(n,a,o){for(var r,d=n.el,l=n.anchor;d&&d!==l;)r=i(d),D(d,a,o),d=r;D(l,a,o)}(d,e,t);if(!(2!==o&&1&a&&l))D(s,e,t);else if(0===o)l.beforeEnter(s),D(s,e,t),fo(function(){return l.enter(s)},r);else{var h=l.leave,f=l.delayLeave,g=l.afterLeave,m=function(){return D(s,e,t)},y=function(){h(s,function(){m(),g&&g()})};f?f(s,m,y):y()}},$=function(g,e,t){var n=!!(3<arguments.length&&arguments[3]!==void 0)&&arguments[3],o=!!(4<arguments.length&&arguments[4]!==void 0)&&arguments[4],r=g.type,s=g.props,i=g.ref,l=g.children,c=g.dynamicChildren,a=g.shapeFlag,u=g.patchFlag,p=g.dirs;if(null!=i&&go(i,null,t,g,!0),256&a)return void e.ctx.deactivate(g);var f,y=1&a&&p,d=!sn(g);if(d&&(f=s&&s.onVnodeBeforeUnmount)&&yo(f,e,g),6&a)G(g.component,t,n);else{if(128&a)return void g.suspense.unmount(t,n);y&&Yt(g,null,e,"beforeUnmount"),64&a?g.type.remove(g,e,t,o,Y,n):c&&(r!==Eo||0<u&&64&u)?re(c,e,t,!1,!0):(r===Eo&&384&u||!o&&16&a)&&re(l,e,t),n&&se(g)}(d&&(f=s&&s.onVnodeUnmounted)||y)&&fo(function(){f&&yo(f,e,g),y&&Yt(g,null,e,"unmounted")},t)},se=function(o){var e=o.type,t=o.el,n=o.anchor,a=o.transition;if(e===Eo)return void ae(t,n);if(e===Mo)return void function(o){for(var s,a=o.el,r=o.anchor;a&&a!==r;)s=i(a),j(a),a=s;j(r)}(o);var s=function(){j(t),a&&!a.persisted&&a.afterLeave&&a.afterLeave()};if(1&o.shapeFlag&&a&&!a.persisted){var r=a.leave,d=a.delayLeave,l=function(){return r(t,s)};d?d(o.el,s,l):l()}else s()},ae=function(o,s){for(var t;o!==s;)t=i(o),j(o),o=t;j(s)},G=function(a,e,t){var n=a.bum,o=a.scope,r=a.update,s=a.subTree,i=a.um;n&&K(n),o.stop(),r&&(r.active=!1,$(s,a,e,t)),i&&fo(i,e),fo(function(){a.isUnmounted=!0},e),e&&e.pendingBranch&&!e.isUnmounted&&a.asyncDep&&!a.asyncResolved&&a.suspenseId===e.pendingId&&(e.deps--,0===e.deps&&e.resolve())},re=function(a,e,t){for(var n=!!(3<arguments.length&&arguments[3]!==void 0)&&arguments[3],o=!!(4<arguments.length&&arguments[4]!==void 0)&&arguments[4],r=5<arguments.length&&arguments[5]!==void 0?arguments[5]:0,s=r;s<a.length;s++)$(a[s],e,t,n,o)},Q=function n(t){return 6&t.shapeFlag?n(t.component.subTree):128&t.shapeFlag?t.suspense.next():i(t.anchor||t.el)},X=function(o,e,t){null==o?e._vnode&&$(e._vnode,null,null,!0):h(e._vnode||null,o,e,null,null,null,t),Rr(),e._vnode=o},Y={p:h,um:$,m:U,r:se,mt:R,mc:S,pc:V,pbc:k,n:Q,o:y};return e&&(t=e(Y),v=_slicedToArray(t,2),T=v[0],P=v[1],t),{render:X,hydrate:T,createApp:eo(X,T)}}function go(d,h,t,n){var o=!!(4<arguments.length&&arguments[4]!==void 0)&&arguments[4];if(Gl(d))return void d.forEach(function(a,e){return go(a,h&&(Gl(h)?h[e]:h),t,n,o)});if(!sn(n)||o){var e=4&n.shapeFlag?er(n.component)||n.component.proxy:n.el,s=o?null:e,r=d.i,i=d.r,l=h&&h.r,a=r.refs===Kl?r.refs={}:r.refs,c=r.setupState;if(null!=l&&l!==i&&(N(l)?(a[l]=null,C(c,l)&&(c[l]=null)):xt(l)&&(l.value=null)),N(i)){var p=function(){a[i]=s,C(c,i)&&(c[i]=s)};s?(p.id=-1,fo(p,t)):p()}else if(xt(i)){var u=function(){i.value=s};s?(u.id=-1,fo(u,t)):u()}else w(i)&&yr(i,r,12,[s,a])}}function yo(s,e,t){var n=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;_r(s,e,7,[t,n])}function vo(s,e){var t=!!(2<arguments.length&&arguments[2]!==void 0)&&arguments[2],n=s.children,o=e.children;if(Gl(n)&&Gl(o))for(var a=0;a<n.length;a++){var r=n[a],i=o[a];1&i.shapeFlag&&!i.dynamicChildren&&((0>=i.patchFlag||32===i.patchFlag)&&(i=o[a]=qo(o[a]),i.el=r.el),t||vo(r,i))}}function _o(d,e,t,n){var h=n.o.insert,o=n.m,r=4<arguments.length&&arguments[4]!==void 0?arguments[4]:2;0===r&&h(d.targetAnchor,e,t);var s=d.el,i=d.anchor,l=d.shapeFlag,c=d.children,a=d.props,u=2===r;if(u&&h(s,e,t),(!u||mo(a))&&16&l)for(var p=0;p<c.length;p++)o(c[p],e,t,2);u&&h(i,e,t)}function bo(s,e){var t=!(2<arguments.length&&arguments[2]!==void 0)||arguments[2],n=!!(3<arguments.length&&arguments[3]!==void 0)&&arguments[3],o=Ot||ac;if(o){var a=o.type;if(s==="components"){var r=nr(a);if(r&&(r===e||r===O(e)||r===D(O(e))))return a}var i=So(o[s]||a[s],e)||So(o.appContext[s],e);return!i&&n?a:i}}function So(n,e){return n&&(n[e]||n[O(e)]||n[D(O(e))])}function ko(){var n=!!(0<arguments.length&&arguments[0]!==void 0)&&arguments[0];Oo.push(Po=n?null:[])}function To(){Oo.pop(),Po=Oo[Oo.length-1]||null}function No(n){nc+=n}function Ro(n){return n.dynamicChildren=0<nc?Po||g:null,To(),0<nc&&Po&&Po.push(n),n}function Vo(s,e,t,n,o){return Ro(Go(s,e,t,n,o,!0))}function Bo(n){return!!n&&!0===n.__v_isVNode}function Uo(n,e){return n.type===e.type&&n.key===e.key}function Ho(a){var e=1<arguments.length&&arguments[1]!==void 0?arguments[1]:null,t=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null,n=3<arguments.length&&arguments[3]!==void 0?arguments[3]:0,o=4<arguments.length&&arguments[4]!==void 0?arguments[4]:null,r=5<arguments.length&&arguments[5]!==void 0?arguments[5]:a===Eo?0:1,s=!!(6<arguments.length&&arguments[6]!==void 0)&&arguments[6],i=!!(7<arguments.length&&arguments[7]!==void 0)&&arguments[7],d={__v_isVNode:!0,__v_skip:!0,type:a,props:e,key:e&&zo(e),ref:e&&Ko(e),scopeId:Jl,slotScopeIds:null,children:t,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:r,patchFlag:n,dynamicProps:o,dynamicChildren:null,appContext:null};return i?(Qo(d,t),128&r&&a.normalize(d)):t&&(d.shapeFlag|=N(t)?8:16),0<nc&&!s&&Po&&(0<d.patchFlag||6&r)&&32!==d.patchFlag&&Po.push(d),d}function Do(n){return n?mt(n)||"__vInternal"in n?zl({},n):n:null}function jo(a,e){var t=!!(2<arguments.length&&arguments[2]!==void 0)&&arguments[2],n=a.props,o=a.ref,r=a.patchFlag,s=a.children,i=e?Xo(n||{},e):n;return{__v_isVNode:!0,__v_skip:!0,type:a.type,props:i,key:i&&zo(i),ref:e&&e.ref?t&&o?Gl(o)?o.concat(Ko(e)):[o,Ko(e)]:Ko(e):o,scopeId:a.scopeId,slotScopeIds:a.slotScopeIds,children:s,target:a.target,targetAnchor:a.targetAnchor,staticCount:a.staticCount,shapeFlag:a.shapeFlag,patchFlag:e&&a.type!==Eo?-1===r?16:16|r:r,dynamicProps:a.dynamicProps,dynamicChildren:a.dynamicChildren,appContext:a.appContext,dirs:a.dirs,transition:a.transition,component:a.component,suspense:a.suspense,ssContent:a.ssContent&&jo(a.ssContent),ssFallback:a.ssFallback&&jo(a.ssFallback),el:a.el,anchor:a.anchor}}function $o(){var n=0<arguments.length&&arguments[0]!==void 0?arguments[0]:" ",e=1<arguments.length&&arguments[1]!==void 0?arguments[1]:0;return Go(Fo,null,n,e)}function Wo(n){return null==n||"boolean"==typeof n?Go(Ao):Gl(n)?Go(Eo,null,n.slice()):"object"==_typeof(n)?qo(n):Go(Fo,null,n+"")}function qo(n){return null===n.el||n.memo?n:jo(n)}function Qo(s,e){var a=0,r=s.shapeFlag;if(null==e)e=null;else if(Gl(e))a=16;else if("object"==_typeof(e)){if(65&r){var o=e["default"];return void(o&&(o._c&&(o._d=!1),Qo(s,o()),o._c&&(o._d=!0)))}{a=32;var i=e._;i||"__vInternal"in e?3===i&&Ot&&(1===Ot.slots._?e._=1:(e._=2,s.patchFlag|=1024)):e._ctx=Ot}}else w(e)?(e={default:e,_ctx:Ot},a=32):(e=e+"",64&r?(a=16,e=[$o(e)]):a=8);s.children=e,s.shapeFlag|=a}function Xo(){for(var e,n={},t=0;t<arguments.length;t++)for(var o in e=0>t||arguments.length<=t?void 0:arguments[t],e)if("class"===o)n["class"]!==e["class"]&&(n["class"]=c([n["class"],e["class"]]));else if("style"===o)n.style=r([n.style,e.style]);else if(_(o)){var s=n[o],a=e[o];s!==a&&(n[o]=s?[].concat(s,a):a)}else""!==o&&(n[o]=e[o]);return n}function Yo(n){return n.some(function(n){return!Bo(n)||n.type!==Ao&&(n.type!==Eo||Yo(n.children))})?n:null}function Zo(n){return 4&n.vnode.shapeFlag}function ms(n,e){w(e)?n.render=e:R(e)&&(n.setupState=Nt(e)),Is(n)}function _s(n){Hl=n,Dl=function(n){n.render._rc&&(n.withProxy=new Proxy(n.ctx,ir))}}function Is(n){var e=n.type;if(!n.render){if(Hl&&!e.render){var t=e.template;if(t){var o=n.appContext.config,s=o.isCustomElement,a=o.compilerOptions,r=e.delimiters,i=e.compilerOptions,d=zl(zl({isCustomElement:s,delimiters:r},a),i);e.render=Hl(t,d)}}n.render=e.render||Wl,Dl&&Dl(n)}pr(n),te(),In(n),de(),fr()}function Ps(t){var e;return{get attrs(){return e||(e=function(o){return new Proxy(o.attrs,{get:function(e,t){return ge(o,0,"$attrs"),e[t]}})}(t))},slots:t.slots,emit:t.emit,expose:function(e){t.exposed=e||{}}}}function er(o){if(o.exposed)return o.exposeProxy||(o.exposeProxy=new Proxy(Nt(vt(o.exposed)),{get:function(e,t){return t in e?e[t]:t in rr?rr[t](o):void 0}}))}function nr(n){return w(n)&&n.displayName||n.name}function tr(s,a){var e=!!(2<arguments.length&&arguments[2]!==void 0)&&arguments[2],n=nr(a);if(!n&&a.__file){var t=a.__file.match(/([^/\\]+)\.\w+$/);t&&(n=t[1])}if(!n&&s&&s.parent){var r=function(n){for(var e in n)if(n[e]===a)return e};n=r(s.components||s.parent.type.components)||r(s.appContext.components)}return n?n.replace(lc,function(n){return n.toUpperCase()}).replace(/[-_]/g,""):e?"App":"Anonymous"}function or(o){var e=[],t=Object.keys(o);return t.slice(0,3).forEach(function(t){e.push.apply(e,_toConsumableArray(hr(t,o[t])))}),3<t.length&&e.push(" ..."),e}function hr(o,e,s){return N(e)?(e=JSON.stringify(e),s?e:["".concat(o,"=").concat(e)]):"number"==typeof e||"boolean"==typeof e||null==e?s?e:["".concat(o,"=").concat(e)]:xt(e)?(e=hr(o,yt(e.value),!0),s?e:["".concat(o,"=Ref<"),e,">"]):w(e)?["".concat(o,"=fn").concat(e.name?"<".concat(e.name,">"):"")]:(e=yt(e),s?e:["".concat(o,"="),e])}function yr(s,e,t,n){var o;try{o=n?s.apply(void 0,_toConsumableArray(n)):s()}catch(n){br(n,e,t)}return o}function _r(s,a,t,e){if(w(s)){var n=yr(s,a,t,e);return n&&F(n)&&n["catch"](function(n){br(n,a,t)}),n}for(var o=[],r=0;r<s.length;r++)o.push(_r(s[r],a,t,e));return o}function br(s,e,t){var n=!(3<arguments.length&&arguments[3]!==void 0)||arguments[3];if(e){for(var o=e.parent,a=e.proxy,r=t;o;){var i=o.ec;if(i)for(var d=0;d<i.length;d++)if(!1===i[d](s,a,r))return;o=o.parent}var l=e.appContext.config.errorHandler;if(l)return void yr(l,null,10,[s,a,r])}!function(n){!(3<arguments.length&&arguments[3]!==void 0)||arguments[3];console.error(n)}(s,0,0,n)}function xr(n){var e=Dr||mc;return n?e.then(this?n.bind(this):n):e}function Sr(n){pc.length&&pc.includes(n,Tr&&n.allowRecurse?Pr+1:Pr)||n===yc||(null==n.id?pc.push(n):pc.splice(function(o){for(var e=Pr+1,s=pc.length;e<s;){var a=e+s>>>1;vc(pc[a])<o?e=a+1:s=a}return e}(n.id),0,n),kr())}function kr(){Tr||cc||(cc=!0,Dr=mc.then(Fr))}function wr(s,e,t,n){Gl(s)?t.push.apply(t,_toConsumableArray(s)):e&&e.includes(s,s.allowRecurse?n+1:n)||t.push(s),kr()}function Nr(n){wr(n,jr,fc,gc)}function Er(n){var e=1<arguments.length&&arguments[1]!==void 0?arguments[1]:null;if(uc.length){for(yc=e,Vr=_toConsumableArray(new Set(uc)),uc.length=0,hc=0;hc<Vr.length;hc++)Vr[hc]();Vr=null,hc=0,yc=null,Er(n,e)}}function Rr(){if(fc.length){var e,n=_toConsumableArray(new Set(fc));if(fc.length=0,jr)return void(e=jr).push.apply(e,_toConsumableArray(n));for(jr=n,jr.sort(function(n,e){return vc(n)-vc(e)}),gc=0;gc<jr.length;gc++)jr[gc]();jr=null,gc=0}}function Fr(n){cc=!1,Tr=!0,Er(n),pc.sort(function(n,e){return vc(n)-vc(e)});try{for(Pr=0;Pr<pc.length;Pr++){var e=pc[Pr];e&&!1!==e.active&&yr(e,null,14)}}finally{Pr=0,pc.length=0,Rr(),Tr=!1,Dr=null,(pc.length||uc.length||fc.length)&&Fr(n)}}function es(n){return os(n,null,{flush:"post"})}function ts(o,e,t){return os(o,e,t)}function os(g,e){var t,m,y=2<arguments.length&&arguments[2]!==void 0?arguments[2]:Kl,v=y.immediate,n=y.deep,_=y.flush,r=ac,s=!1,x=!1;if(xt(g)?(t=function(){return g.value},s=!!g._shallow):ft(g)?(t=function(){return g},n=!0):Gl(g)?(x=!0,s=g.some(ft),t=function(){return g.map(function(n){return xt(n)?n.value:ft(n)?is(n):w(n)?yr(n,r,2):void 0})}):t=w(g)?e?function(){return yr(g,r,2)}:function(){if(!r||!r.isUnmounted)return m&&m(),_r(g,r,3,[k])}:Wl,e&&n){var C=t;t=function(){return is(C())}}var S,k=function(n){m=f.onStop=function(){yr(n,r,4)}},u=x?[]:Yr,T=function(){if(f.active)if(e){var t=f.run();(n||s||(x?t.some(function(n,e){return $(n,u[e])}):$(t,u)))&&(m&&m(),_r(e,r,3,[t,u===Yr?void 0:u,k]),u=t)}else f.run()};T.allowRecurse=!!e,S="sync"===_?T:"post"===_?function(){return fo(T,r&&r.suspense)}:function(){!r||r.isMounted?function(n){wr(n,Vr,uc,hc)}(T):T()};var f=new ce(t,S);return e?v?T():u=f.run():"post"===_?fo(f.run.bind(f),r&&r.suspense):f.run(),function(){f.stop(),r&&r.scope&&b(r.scope.effects,f)}}function rs(a,e,t){var d,c=this.proxy,o=N(a)?a.includes(".")?ss(c,a):function(){return c[a]}:a.bind(c,c);w(e)?d=e:(d=e.handler,t=e);var r=ac;pr(this);var i=os(o,d.bind(c),t);return r?pr(r):fr(),i}function ss(o,e){var s=e.split(".");return function(){for(var e=o,n=0;n<s.length&&e;n++)e=e[s[n]];return e}}function is(n){var o=1<arguments.length&&arguments[1]!==void 0?arguments[1]:new Set;if(!R(n)||n.__v_skip)return n;if((o=o||new Set).has(n))return n;if(o.add(n),xt(n))is(n.value,o);else if(Gl(n))for(var e=0;e<n.length;e++)is(n[e],o);else if(k(n)||S(n))n.forEach(function(n){is(n,o)});else if(A(n))for(var s in n)is(n[s],o);return n}function ls(){var n=ic();return n.setupContext||(n.setupContext=Ps(n))}function cs(s,e,t){var a=arguments.length;return 2===a?R(e)&&!Gl(e)?Bo(e)?Go(s,null,[e]):Go(s,e):Go(s,null,e):(3<a?t=Array.prototype.slice.call(arguments,2):3===a&&Bo(t)&&(t=[t]),Go(s,e,t))}function as(o,e){var t=o.memo;if(t.length!=e.length)return!1;for(var n=0;n<t.length;n++)if(t[n]!==e[n])return!1;return 0<nc&&Po&&Po.push(o),!0}function ps(o,e,t){if(Gl(t))t.forEach(function(t){return ps(o,e,t)});else if(e.startsWith("--"))o.setProperty(e,t);else{var n=function(s,e){var t=ys[e];if(t)return t;var n=O(e);if("filter"!==n&&n in s)return ys[e]=n;n=D(n);for(var a,r=0;r<gs.length;r++)if(a=gs[r]+n,a in s)return ys[e]=a;return e}(o,e);hs.test(t)?o.setProperty(H(n),t.replace(hs,""),"important"):o[n]=t}}function vs(s,e,t,n){s.addEventListener(e,t,n)}function Ts(a,e,t,n){var o=4<arguments.length&&arguments[4]!==void 0?arguments[4]:null,r=a._vei||(a._vei={}),s=r[e];if(n&&s)s.value=n;else{var i=function(n){var o;if(ks.test(n)){var s;for(o={};s=n.match(ks);)n=n.slice(0,n.length-s[0].length),o[s[0].toLowerCase()]=!0}return[H(n.slice(2)),o]}(e),d=_slicedToArray(i,2),l=d[0],c=d[1];n?vs(a,l,r[e]=function(o,s){var e=function t(n){var e=n.timeStamp||bs();(_c||e>=t.attached-1)&&_r(function(n,e){if(Gl(e)){var t=n.stopImmediatePropagation;return n.stopImmediatePropagation=function(){t.call(n),n._stopped=!0},e.map(function(n){return function(e){return!e._stopped&&n(e)}})}return e}(n,t.value),s,5,[n])};return e.value=o,e.attached=function(){return xc||(Cc.then(ws),xc=bs())}(),e}(n,o),c):s&&(!function(s,e,t,n){s.removeEventListener(e,t,n)}(a,l,s,c),r[e]=void 0)}}function Ns(s,a){var t=fn(s),e=/*#__PURE__*/function(e){function n(s){return _classCallCheck(this,n),o.call(this,t,s,a)}_inherits(n,e);var o=_createSuper(n);return n}(Fs);return e.def=t,e}function Rs(n,o){if(128&n.shapeFlag){var t=n.suspense;n=t.activeBranch,t.pendingBranch&&!t.isHydrating&&t.effects.push(function(){Rs(t.activeBranch,o)})}for(;n.component;)n=n.component.subTree;if(1&n.shapeFlag&&n.el)Ms(n.el,o);else if(n.type===Eo)n.children.forEach(function(n){return Rs(n,o)});else if(n.type===Mo)for(var s=n,a=s.el,r=s.anchor;a&&(Ms(a,o),a!==r);)a=a.nextSibling}function Ms(n,e){if(1===n.nodeType){var t=n.style;for(var o in e)t.setProperty("--".concat(o),e[o])}}function Os(C){var e={};for(var t in C)t in Tc||(e[t]=C[t]);if(!1===C.css)return e;var I=C.name,P=void 0===I?"v":I,F=C.type,n=C.duration,o=C.enterFromClass,A=void 0===o?"".concat(P,"-enter-from"):o,s=C.enterActiveClass,r=void 0===s?"".concat(P,"-enter-active"):s,i=C.enterToClass,V=void 0===i?"".concat(P,"-enter-to"):i,l=C.appearFromClass,M=void 0===l?A:l,c=C.appearActiveClass,B=void 0===c?r:c,a=C.appearToClass,L=void 0===a?V:a,u=C.leaveFromClass,O=void 0===u?"".concat(P,"-leave-from"):u,p=C.leaveActiveClass,U=void 0===p?"".concat(P,"-leave-active"):p,f=C.leaveToClass,H=void 0===f?"".concat(P,"-leave-to"):f,d=function(n){if(null==n)return null;if(R(n))return[Hs(n.enter),Hs(n.leave)];{var e=Hs(n);return[e,e]}}(n),h=d&&d[0],m=d&&d[1],g=e.onBeforeEnter,v=e.onEnter,y=e.onEnterCancelled,b=e.onLeave,_=e.onLeaveCancelled,S=e.onBeforeAppear,D=void 0===S?g:S,x=e.onAppear,j=void 0===x?v:x,w=e.onAppearCancelled,$=void 0===w?y:w,k=function(o,e,t){Ws(o,e?L:V),Ws(o,e?B:r),t&&t()},T=function(n,e){Ws(n,H),Ws(n,U),e&&e()},N=function(o){return function(e,t){var n=o?j:v,s=function(){return k(e,o,t)};Ls(n,[e,s]),zs(function(){Ws(e,o?M:A),Ds(e,o?L:V),js(n)||Ks(e,F,h,s)})}};return zl(e,{onBeforeEnter:function(n){Ls(g,[n]),Ds(n,A),Ds(n,r)},onBeforeAppear:function(n){Ls(D,[n]),Ds(n,M),Ds(n,B)},onEnter:N(!1),onAppear:N(!0),onLeave:function(o,e){var t=function(){return T(o,e)};Ds(o,O),Qs(),Ds(o,U),zs(function(){Ws(o,O),Ds(o,H),js(b)||Ks(o,F,m,t)}),Ls(b,[o,t])},onEnterCancelled:function(n){k(n,!1),Ls(y,[n])},onAppearCancelled:function(n){k(n,!0),Ls($,[n])},onLeaveCancelled:function(n){T(n),Ls(_,[n])}})}function Hs(n){return z(n)}function Ds(n,e){e.split(/\s+/).forEach(function(e){return e&&n.classList.add(e)}),(n._vtc||(n._vtc=new Set)).add(e)}function Ws(o,e){e.split(/\s+/).forEach(function(e){return e&&o.classList.remove(e)});var t=o._vtc;t&&(t["delete"](e),t.size||(o._vtc=void 0))}function zs(n){requestAnimationFrame(function(){requestAnimationFrame(n)})}function Ks(d,e,t,n){var o=d._endId=++Us,r=function(){o===d._endId&&n()};if(t)return setTimeout(r,t);var s=qs(d,e),h=s.type,i=s.timeout,l=s.propCount;if(!h)return n();var c=h+"end",a=0,g=function(){d.removeEventListener(c,p),r()},p=function(e){e.target===d&&++a>=l&&g()};setTimeout(function(){a<l&&g()},i+1),d.addEventListener(c,p)}function qs(d,e){var t=window.getComputedStyle(d),n=function(n){return(t[n]||"").split(", ")},o=n("transitionDelay"),r=n("transitionDuration"),s=Js(o,r),i=n("animationDelay"),l=n("animationDuration"),c=Js(i,l),a=null,h=0,g=0;return"transition"===e?0<s&&(a="transition",h=s,g=r.length):"animation"===e?0<c&&(a="animation",h=c,g=l.length):(h=Nl(s,c),a=0<h?s>c?"transition":"animation":null,g=a?"transition"===a?r.length:l.length:0),{type:a,timeout:h,propCount:g,hasTransform:"transition"===a&&/\b(transform|all)(,|$)/.test(t.transitionProperty)}}function Js(o,n){for(;o.length<n.length;)o=o.concat(o);return Nl.apply(Math,_toConsumableArray(n.map(function(e,t){return Zs(e)+Zs(o[t])})))}function Zs(n){return 1e3*+n.slice(0,-1).replace(",",".")}function Qs(){return document.body.offsetHeight}function Xs(n){var e=n.el;e._moveCb&&e._moveCb(),e._enterCb&&e._enterCb()}function Ar(n){Ys.set(n,n.el.getBoundingClientRect())}function $r(s){var e=wc.get(s),t=Ys.get(s),n=e.left-t.left,o=e.top-t.top;if(n||o){var a=s.el.style;return a.transform=a.webkitTransform="translate(".concat(n,"px,").concat(o,"px)"),a.transitionDuration="0s",s}}function Kr(n){n.target.composing=!0}function Gr(n){var e=n.target;e.composing&&(e.composing=!1,function(o,e){var t=document.createEvent("HTMLEvents");t.initEvent(e,!0,!0),o.dispatchEvent(t)}(e,"input"))}function qr(s,e,r){var o=e.value,t=e.oldValue;s._modelValue=o,Gl(o)?s.checked=-1<d(o,r.props.value):k(o)?s.checked=o.has(r.props.value):o!==t&&(s.checked=a(o,Xr(s,!0)))}function Jr(o,e){var t=o.multiple;if(!t||Gl(e)||k(e)){for(var n=0,s=o.options.length;n<s;n++){var r=o.options[n],i=Qr(r);if(t)r.selected=Gl(e)?-1<d(e,i):e.has(i);else if(a(Qr(r),e))return void(o.selectedIndex!==n&&(o.selectedIndex=n))}t||-1===o.selectedIndex||(o.selectedIndex=-1)}}function Qr(n){return"_value"in n?n._value:n.value}function Xr(o,e){var t=e?"_trueValue":"_falseValue";return t in o?o[t]:e}function Zr(a,e,t,n,o){var r;switch(a.tagName){case"SELECT":r=pi;break;case"TEXTAREA":r=si;break;default:switch(t.props&&t.props.type){case"checkbox":r=ci;break;case"radio":r=ai;break;default:r=si;}}var d=r[o];d&&d(a,e,t,n)}function ni(n,e){n.style.display=e?n._vod:"none"}function oi(){return Vs||(Vs=io(_i))}function ri(){return Vs=Ci?Vs:lo(_i),Ci=!0,Vs}function ii(n){return N(n)?document.querySelector(n):n}function di(n){throw n}function li(){}function ui(n,e){var t=new SyntaxError(n+"");return t.code=n,t.loc=e,t}function hi(d,e,t,n,o,r,s){var i=!!(7<arguments.length&&arguments[7]!==void 0)&&arguments[7],l=!!(8<arguments.length&&arguments[8]!==void 0)&&arguments[8],c=!!(9<arguments.length&&arguments[9]!==void 0)&&arguments[9],a=10<arguments.length&&arguments[10]!==void 0?arguments[10]:_l;return d&&(i?(d.helper(Bi),d.helper(ld(d.inSSR,c))):d.helper(dd(d.inSSR,c)),s&&d.helper(Zi)),{type:13,tag:e,props:t,children:n,patchFlag:o,dynamicProps:r,directives:s,isBlock:i,disableTracking:l,isComponent:c,loc:a}}function gi(n){var e=1<arguments.length&&arguments[1]!==void 0?arguments[1]:_l;return{type:17,loc:e,elements:n}}function mi(n){var e=1<arguments.length&&arguments[1]!==void 0?arguments[1]:_l;return{type:15,loc:e,properties:n}}function vi(n,e){return{type:16,loc:_l,key:N(n)?xi(n,!0):n,value:e}}function xi(s){var e=!!(1<arguments.length&&arguments[1]!==void 0)&&arguments[1],t=2<arguments.length&&arguments[2]!==void 0?arguments[2]:_l,n=3<arguments.length&&arguments[3]!==void 0?arguments[3]:0;return{type:4,loc:t,content:s,isStatic:e,constType:e?3:n}}function Si(n){var e=1<arguments.length&&arguments[1]!==void 0?arguments[1]:_l;return{type:8,loc:e,children:n}}function Ti(o){var e=1<arguments.length&&arguments[1]!==void 0?arguments[1]:[],t=2<arguments.length&&arguments[2]!==void 0?arguments[2]:_l;return{type:14,loc:t,callee:o,arguments:e}}function Ni(s,e){var t=!!(2<arguments.length&&arguments[2]!==void 0)&&arguments[2],n=!!(3<arguments.length&&arguments[3]!==void 0)&&arguments[3],o=4<arguments.length&&arguments[4]!==void 0?arguments[4]:_l;return{type:18,params:s,returns:e,newline:t,isSlot:n,loc:o}}function Ri(s,e,t){var n=!(3<arguments.length&&arguments[3]!==void 0)||arguments[3];return{type:19,test:s,consequent:e,alternate:t,newline:n,loc:_l}}function Fi(n){return Fl(n,"Teleport")?Oi:Fl(n,"Suspense")?Pi:Fl(n,"KeepAlive")?Ii:Fl(n,"BaseTransition")?Vi:void 0}function Ai(s,e,t){var n={source:s.source.substr(e,t),start:Mi(s.start,s.source,e),end:s.end};return null!=t&&(n.end=Mi(s.start,s.source,e+t)),n}function Mi(o,e){var t=2<arguments.length&&arguments[2]!==void 0?arguments[2]:e.length;return ed(zl({},o),e,t)}function ed(s,e){for(var t=2<arguments.length&&arguments[2]!==void 0?arguments[2]:e.length,n=0,a=-1,i=0;i<t;i++)10===e.charCodeAt(i)&&(n++,a=i);return s.offset+=t,s.line+=n,s.column=-1===a?s.column+t:t-a,s}function nd(o,e){for(var t,s=!!(2<arguments.length&&void 0!==arguments[2])&&arguments[2],n=0;n<o.props.length;n++)if(t=o.props[n],7===t.type&&(s||t.exp)&&(N(e)?t.name===e:e.test(t.name)))return t}function td(s,e){for(var t,a=!!(2<arguments.length&&void 0!==arguments[2])&&arguments[2],n=!!(3<arguments.length&&void 0!==arguments[3])&&arguments[3],o=0;o<s.props.length;o++)if(t=s.props[o],6===t.type){if(a)continue;if(t.name===e&&(t.value||n))return t}else if("bind"===t.name&&(t.exp||n)&&od(t.arg,e))return t}function od(n,e){return n&&Sl(n)&&n.content===e}function sd(n){return 5===n.type||2===n.type}function ad(n){return 7===n.type&&"slot"===n.name}function rd(n){return 1===n.type&&3===n.tagType}function id(n){return 1===n.type&&2===n.tagType}function dd(n,e){return n||e?Ui:Hi}function ld(n,e){return n||e?Li:ji}function cd(n){var e=1<arguments.length&&arguments[1]!==void 0?arguments[1]:[];if(n&&!N(n)&&14===n.type){var t=n.callee;if(!N(t)&&Ll.has(t))return cd(n.arguments[0],e.concat(n))}return[n,e]}function pd(a,e,t){var n,d,l=13===a.type?a.props:a.arguments[2],c=[];if(l&&!N(l)&&14===l.type){var p=cd(l);l=p[0],c=p[1],d=c[c.length-1]}if(null==l||N(l))n=mi([e]);else if(14===l.type){var u=l.arguments[0];N(u)||15!==u.type?l.callee===il?n=Ti(t.helper(tl),[mi([e]),l]):l.arguments.unshift(mi([e])):u.properties.unshift(e),n||(n=l)}else if(15===l.type){var h=!1;if(4===e.key.type){var f=e.key.content;h=l.properties.some(function(n){return 4===n.key.type&&n.key.content===f})}h||l.properties.unshift(e),n=l}else n=Ti(t.helper(tl),[mi([e]),l]),d&&d.callee===sl&&(d=c[c.length-2]);13===a.type?d?d.arguments[0]=n:a.props=n:d?d.arguments[0]=n:a.arguments[2]=n}function ud(n,e){return"_".concat(e,"_").concat(n.replace(/[^\w]/g,"_"))}function hd(s,e){var a=e.helper,t=e.removeHelper,n=e.inSSR;s.isBlock||(s.isBlock=!0,t(dd(n,s.isComponent)),a(Bi),a(ld(n,s.isComponent)))}function fd(s){var e=1<arguments.length&&arguments[1]!==void 0?arguments[1]:{},t=function(s,e){var t,a=zl({},rc);for(t in e)a[t]=void 0===e[t]?rc[t]:e[t];return{options:a,column:1,line:1,offset:0,originalSource:s,source:s,inPre:!1,inVPre:!1,onWarn:a.onWarn}}(s,e),n=Nd(t);return function(n){var e=1<arguments.length&&arguments[1]!==void 0?arguments[1]:_l;return{type:0,children:n,helpers:[],components:[],directives:[],hoists:[],imports:[],cached:0,temps:0,codegenNode:void 0,loc:e}}(gd(t,0,[]),Ed(t,n))}function gd(a,e,t){for(var n=Rd(t),o=n?n.ns:0,r=[];!Vd(a,e,t);){var s=a.source,d=void 0;if(0===e||1===e)if(!a.inVPre&&Id(s,a.options.delimiters[0]))d=kd(a,e);else if(0===e&&"<"===s[0])if(1===s.length);else if("!"===s[1])d=Id(s,"<!--")?vd(a):Id(s,"<!DOCTYPE")?_d(a):Id(s,"<![CDATA[")&&0!==o?yd(a,t):_d(a);else if(!("/"===s[1]))/[a-z]/i.test(s[1])?d=bd(a,t):"?"===s[1]&&(d=_d(a));else if(2===s.length);else{if(">"===s[2]){Pd(a,3);continue}if(/[a-z]/i.test(s[2])){xd(a,1,n);continue}d=_d(a)}if(d||(d=Td(a,e)),Gl(d))for(var l=0;l<d.length;l++)md(r,d[l]);else md(r,d)}var c=!1;if(2!==e&&1!==e){for(var p,u="preserve"!==a.options.whitespace,h=0;h<r.length;h++)if(p=r[h],a.inPre||2!==p.type)3!==p.type||a.options.comments||(c=!0,r[h]=null);else if(/[^\t\r\n\f ]/.test(p.content))u&&(p.content=p.content.replace(/[\t\r\n\f ]+/g," "));else{var f=r[h-1],g=r[h+1];!f||!g||u&&(3===f.type||3===g.type||1===f.type&&1===g.type&&/[\r\n]/.test(p.content))?(c=!0,r[h]=null):p.content=" "}if(a.inPre&&n&&a.options.isPreTag(n.tag)){var m=r[0];m&&2===m.type&&(m.content=m.content.replace(/^\r?\n/,""))}}return c?r.filter(Boolean):r}function md(n,e){if(2===e.type){var t=Rd(n);if(t&&2===t.type&&t.loc.end.offset===e.loc.start.offset)return t.content+=e.content,t.loc.end=e.loc.end,void(t.loc.source+=e.loc.source)}n.push(e)}function yd(o,e){Pd(o,9);var t=gd(o,3,e);return 0===o.source.length||Pd(o,3),t}function vd(s){var e,a=Nd(s),t=/--(\!)?>/.exec(s.source);if(t){e=s.source.slice(4,t.index);for(var o=s.source.slice(0,t.index),r=1,i=0;-1!==(i=o.indexOf("<!--",r));)Pd(s,i-r+1),r=i+1;Pd(s,t.index+t[0].length-r+1)}else e=s.source.slice(4),Pd(s,s.source.length);return{type:3,content:e,loc:Ed(s,a)}}function _d(s){var e,a=Nd(s),t="?"===s.source[1]?1:2,n=s.source.indexOf(">");return-1===n?(e=s.source.slice(t),Pd(s,s.source.length)):(e=s.source.slice(t,n),Pd(s,n+1)),{type:3,content:e,loc:Ed(s,a)}}function bd(d,e){var t=d.inPre,n=d.inVPre,o=Rd(e),r=xd(d,0,o),s=d.inPre&&!t,i=d.inVPre&&!n;if(r.isSelfClosing||d.options.isVoidTag(r.tag))return s&&(d.inPre=!1),i&&(d.inVPre=!1),r;e.push(r);var l=d.options.getTextMode(r,o),c=gd(d,l,e);if(e.pop(),r.children=c,Md(d.source,r.tag))xd(d,1,o);else if(0===d.source.length&&"script"===r.tag.toLowerCase()){var a=c[0];a&&Id(a.loc.source,"<!--")}return r.loc=Ed(d,r.loc.start),s&&(d.inPre=!1),i&&(d.inVPre=!1),r}function xd(d,e,t){var n=Nd(d),o=/^<\/?([a-z][^\t\r\n\f />]*)/i.exec(d.source),r=o[1],s=d.options.getNamespace(r,t);Pd(d,o[0].length),Fd(d);var i=Nd(d),l=d.source;d.options.isPreTag(r)&&(d.inPre=!0);var c=Cd(d,e);0===e&&!d.inVPre&&c.some(function(n){return 7===n.type&&"pre"===n.name})&&(d.inVPre=!0,zl(d,i),d.source=l,c=Cd(d,e).filter(function(n){return"v-pre"!==n.name}));var h=!1;if(0===d.source.length||(h=Id(d.source,"/>"),Pd(d,h?2:1)),1!==e){var f=0;return d.inVPre||("slot"===r?f=2:"template"===r?c.some(function(n){return 7===n.type&&sc(n.name)})&&(f=3):function(s,e,t){var n=t.options;if(n.isCustomElement(s))return!1;if("component"===s||/^[A-Z]/.test(s)||Fi(s)||n.isBuiltInComponent&&n.isBuiltInComponent(s)||n.isNativeTag&&!n.isNativeTag(s))return!0;for(var o,a=0;a<e.length;a++)if(o=e[a],6!==o.type){if("is"===o.name)return!0;"bind"===o.name&&od(o.arg,"is")}else if("is"===o.name&&o.value&&o.value.content.startsWith("vue:"))return!0}(r,c,d)&&(f=1)),{type:1,ns:s,tag:r,tagType:f,props:c,isSelfClosing:h,children:[],loc:Ed(d,n),codegenNode:void 0}}}function Cd(s,e){for(var t=[],n=new Set;0<s.source.length&&!Id(s.source,">")&&!Id(s.source,"/>");){if(Id(s.source,"/")){Pd(s,1),Fd(s);continue}var o=Sd(s,n);0===e&&t.push(o),/^[^\t\r\n\f />]/.test(s.source),Fd(s)}return t}function Sd(a,e){var t=Nd(a),n=/^[^\t\r\n\f />][^\t\r\n\f />=]*/.exec(a.source)[0];e.has(n),e.add(n);for(var o,i=/["'<]/g;o=i.exec(n););var d;Pd(a,n.length),/^[\t\r\n\f ]*=/.test(a.source)&&(Fd(a),Pd(a,1),Fd(a),d=function(s){var e,a=Nd(s),t=s.source[0],o="\""===t||"'"===t;if(o){Pd(s,1);var r=s.source.indexOf(t);-1===r?e=wd(s,s.source.length,4):(e=wd(s,r,4),Pd(s,1))}else{var i=/^[^\t\r\n\f >]+/.exec(s.source);if(!i)return;for(var d,l=/["'<=`]/g;d=l.exec(i[0]););e=wd(s,i[0].length,4)}return{content:e,isQuoted:o,loc:Ed(s,a)}}(a));var l=Ed(a,t);if(!a.inVPre&&/^(v-|:|\.|@|#)/.test(n)){var s,c=/(?:^v-([a-z0-9-]+))?(?:(?::|^\.|^@|^#)(\[[^\]]+\]|[^\.]+))?(.+)?$/i.exec(n),p=Id(n,"."),u=c[1]||(p||Id(n,":")?"bind":Id(n,"@")?"on":"slot");if(c[2]){var h="slot"===u,f=n.lastIndexOf(c[2]),g=Ed(a,Ad(a,t,f),Ad(a,t,f+c[2].length+(h&&c[3]||"").length)),m=c[2],y=!0;m.startsWith("[")?(y=!1,m.endsWith("]"),m=m.substr(1,m.length-2)):h&&(m+=c[3]||""),s={type:4,content:m,isStatic:y,constType:y?3:0,loc:g}}if(d&&d.isQuoted){var v=d.loc;v.start.offset++,v.start.column++,v.end=Mi(v.start,d.content),v.source=v.source.slice(1,-1)}var _=c[3]?c[3].substr(1).split("."):[];return p&&_.push("prop"),{type:7,name:u,exp:d&&{type:4,content:d.content,isStatic:!1,constType:0,loc:d.loc},arg:s,modifiers:_,loc:l}}return{type:6,name:n,value:d&&{type:2,content:d.content,loc:d.loc},loc:l}}function kd(d,e){var t=_slicedToArray(d.options.delimiters,2),h=t[0],n=t[1],o=d.source.indexOf(n,h.length);if(-1!==o){var r=Nd(d);Pd(d,h.length);var s=Nd(d),i=Nd(d),l=o-h.length,c=d.source.slice(0,l),a=wd(d,l,e),u=a.trim(),p=a.indexOf(u);return 0<p&&ed(s,c,p),ed(i,c,l-(a.length-u.length-p)),Pd(d,n.length),{type:5,content:{type:4,isStatic:!1,constType:0,content:u,loc:Ed(d,s,i)},loc:Ed(d,r)}}}function Td(s,e){var t=["<",s.options.delimiters[0]];3===e&&t.push("]]>");for(var n,a=s.source.length,i=0;i<t.length;i++)n=s.source.indexOf(t[i],1),-1!==n&&a>n&&(a=n);var d=Nd(s);return{type:2,content:wd(s,a,e),loc:Ed(s,d)}}function wd(s,e,t){var n=s.source.slice(0,e);return Pd(s,e),2===t||3===t||-1===n.indexOf("&")?n:s.options.decodeEntities(n,4==t)}function Nd(s){var e=s.column,t=s.line,n=s.offset;return{column:e,line:t,offset:n}}function Ed(o,e,t){return{start:e,end:t=t||Nd(o),source:o.originalSource.slice(e.offset,t.offset)}}function Rd(n){return n[n.length-1]}function Id(n,e){return n.startsWith(e)}function Pd(o,e){var t=o.source;ed(o,t,e),o.source=t.slice(e)}function Fd(n){var e=/^[\t\r\n\f ]+/.exec(n.source);e&&Pd(n,e[0].length)}function Ad(o,e,t){return Mi(e,o.originalSource.slice(e.offset,t),t)}function Vd(s,e,t){var n=s.source;switch(e){case 0:if(Id(n,"</"))for(var o=t.length-1;0<=o;--o)if(Md(n,t[o].tag))return!0;break;case 1:case 2:{var a=Rd(t);if(a&&Md(n,a.tag))return!0;break}case 3:if(Id(n,"]]>"))return!0;}return!n}function Md(n,e){return Id(n,"</")&&n.substr(2,e.length).toLowerCase()===e.toLowerCase()&&/[\t\r\n\f />]/.test(n[2+e.length]||">")}function Bd(n,e){Od(n,e,Ld(n,n.children[0]))}function Ld(o,e){var t=o.children;return 1===t.length&&1===e.type&&!id(e)}function Od(a,e){for(var t,d=!!(2<arguments.length&&void 0!==arguments[2])&&arguments[2],n=!0,l=a.children,r=l.length,s=0,c=0;c<l.length;c++){if(t=l[c],1===t.type&&0===t.tagType){var p=d?0:Ud(t,e);if(!(0<p)){var u=t.codegenNode;if(13===u.type){var h=$d(u);if((!h||512===h||1===h)&&2<=Dd(t,e)){var f=jd(t);f&&(u.props=e.hoist(f))}u.dynamicProps&&(u.dynamicProps=e.hoist(u.dynamicProps))}}else if(3>p&&(n=!1),2<=p){t.codegenNode.patchFlag="-1",t.codegenNode=e.hoist(t.codegenNode),s++;continue}}else if(12===t.type){var g=Ud(t.content,e);0<g&&(3>g&&(n=!1),2<=g&&(t.codegenNode=e.hoist(t.codegenNode),s++))}if(1===t.type){var m=1===t.tagType;m&&e.scopes.vSlot++,Od(t,e),m&&e.scopes.vSlot--}else if(11===t.type)Od(t,e,1===t.children.length);else if(9===t.type)for(var y=0;y<t.branches.length;y++)Od(t.branches[y],e,1===t.branches[y].children.length)}n&&s&&e.transformHoist&&e.transformHoist(l,e,a),s&&s===r&&1===a.type&&0===a.tagType&&a.codegenNode&&13===a.codegenNode.type&&Gl(a.codegenNode.children)&&(a.codegenNode.children=e.hoist(gi(a.codegenNode.children)))}function Ud(o,e){var t=e.constantCache;switch(o.type){case 1:if(0!==o.tagType)return 0;var n=t.get(o);if(void 0!==n)return n;var s=o.codegenNode;if(13!==s.type)return 0;if($d(s))return t.set(o,0),0;{var a=3,r=Dd(o,e);if(0===r)return t.set(o,0),0;r<a&&(a=r);for(var i,d=0;d<o.children.length;d++){if(i=Ud(o.children[d],e),0===i)return t.set(o,0),0;i<a&&(a=i)}if(1<a)for(var l,c=0;c<o.props.length;c++)if(l=o.props[c],7===l.type&&"bind"===l.name&&l.exp){var p=Ud(l.exp,e);if(0===p)return t.set(o,0),0;p<a&&(a=p)}return s.isBlock&&(e.removeHelper(Bi),e.removeHelper(ld(e.inSSR,s.isComponent)),s.isBlock=!1,e.helper(dd(e.inSSR,s.isComponent))),t.set(o,a),a}case 2:case 3:return 3;case 9:case 11:case 10:return 0;case 5:case 12:return Ud(o.content,e);case 4:return o.constType;case 8:for(var u,h=3,f=0;f<o.children.length;f++)if(u=o.children[f],!(N(u)||E(u))){var g=Ud(u,e);if(0===g)return 0;g<h&&(h=g)}return h;default:return 0;}}function Hd(n,e){if(14===n.type&&!N(n.callee)&&dc.has(n.callee)){var t=n.arguments[0];if(4===t.type)return Ud(t,e);if(14===t.type)return Hd(t,e)}return 0}function Dd(s,e){var t=3,a=jd(s);if(a&&15===a.type)for(var o=a.properties,r=0;r<o.length;r++){var i=o[r],d=i.key,l=i.value,c=Ud(d,e);if(0===c)return c;var p=void 0;if(c<t&&(t=c),p=4===l.type?Ud(l,e):14===l.type?Hd(l,e):0,0===p)return p;p<t&&(t=p)}return t}function jd(n){var e=n.codegenNode;if(13===e.type)return e.props}function $d(n){var e=n.patchFlag;return e?parseInt(e,10):void 0}function Kd(n,e){var o=e.filename,r=void 0===o?"":o,t=e.prefixIdentifiers,d=e.hoistStatic,h=e.cacheHandlers,f=e.nodeTransforms,g=void 0===f?[]:f,s=e.directiveTransforms,y=void 0===s?{}:s,i=e.transformHoist,_=void 0===i?null:i,l=e.isBuiltInComponent,b=void 0===l?Wl:l,c=e.isCustomElement,T=void 0===c?Wl:c,a=e.expressionPlugins,E=void 0===a?[]:a,u=e.scopeId,R=void 0===u?null:u,p=e.slotted,I=e.ssr,P=e.inSSR,F=e.ssrCssVars,A=void 0===F?"":F,m=e.bindingMetadata,V=void 0===m?Kl:m,v=e.inline,M=e.isTS,B=e.onError,L=void 0===B?di:B,S=e.onWarn,U=void 0===S?li:S,x=e.compatConfig,C=r.replace(/\?.*$/,"").match(/([^/\\]+)\.\w+$/),w={selfName:C&&D(O(C[1])),prefixIdentifiers:void 0!==t&&t,hoistStatic:void 0!==d&&d,cacheHandlers:void 0!==h&&h,nodeTransforms:g,directiveTransforms:y,transformHoist:_,isBuiltInComponent:b,isCustomElement:T,expressionPlugins:E,scopeId:R,slotted:!(void 0!==p)||p,ssr:void 0!==I&&I,inSSR:void 0!==P&&P,ssrCssVars:A,bindingMetadata:V,inline:void 0!==v&&v,isTS:void 0!==M&&M,onError:L,onWarn:U,compatConfig:x,root:n,helpers:new Map,components:new Set,directives:new Set,hoists:[],imports:[],constantCache:new Map,temps:0,cached:0,identifiers:Object.create(null),scopes:{vFor:0,vSlot:0,vPre:0,vOnce:0},parent:null,currentNode:n,childIndex:0,inVOnce:!1,helper:function(n){var e=w.helpers.get(n)||0;return w.helpers.set(n,e+1),n},removeHelper:function(n){var e=w.helpers.get(n);if(e){var t=e-1;t?w.helpers.set(n,t):w.helpers["delete"](n)}},helperString:function(n){return"_".concat(bl[w.helper(n)])},replaceNode:function(n){w.parent.children[w.childIndex]=w.currentNode=n},removeNode:function(n){var e=n?w.parent.children.indexOf(n):w.currentNode?w.childIndex:-1;n&&n!==w.currentNode?w.childIndex>e&&(w.childIndex--,w.onNodeRemoved()):(w.currentNode=null,w.onNodeRemoved()),w.parent.children.splice(e,1)},onNodeRemoved:function(){},addIdentifiers:function(){},removeIdentifiers:function(){},hoist:function(n){N(n)&&(n=xi(n)),w.hoists.push(n);var o=xi("_hoisted_".concat(w.hoists.length),!1,n.loc,2);return o.hoisted=n,o},cache:function(n){var e=!!(1<arguments.length&&arguments[1]!==void 0)&&arguments[1];return function(o,e){var t=!!(2<arguments.length&&arguments[2]!==void 0)&&arguments[2];return{type:20,index:o,value:e,isVNode:t,loc:_l}}(w.cached++,n,e)}};return w}function Wd(o,e){var t=Kd(o,e);zd(o,t),e.hoistStatic&&Bd(o,t),e.ssr||function(s,e){var t=e.helper,n=s.children;if(1===n.length){var o=n[0];if(Ld(s,o)&&o.codegenNode){var a=o.codegenNode;13===a.type&&hd(a,e),s.codegenNode=a}else s.codegenNode=o}else if(1<n.length){s.codegenNode=hi(e,t($i),void 0,s.children,"64",void 0,void 0,!0,void 0,!1)}}(o,t),o.helpers=_toConsumableArray(t.helpers.keys()),o.components=_toConsumableArray(t.components),o.directives=_toConsumableArray(t.directives),o.imports=t.imports,o.hoists=t.hoists,o.temps=t.temps,o.cached=t.cached}function zd(s,a){a.currentNode=s;for(var t,i=a.nodeTransforms,n=[],o=0;o<i.length;o++){if(t=i[o](s,a),t&&(Gl(t)?n.push.apply(n,_toConsumableArray(t)):n.push(t)),!a.currentNode)return;s=a.currentNode}switch(s.type){case 3:a.ssr||a.helper(Di);break;case 5:a.ssr||a.helper(el);break;case 9:for(var d=0;d<s.branches.length;d++)zd(s.branches[d],a);break;case 10:case 11:case 1:case 0:!function(s,e){for(var t=0,a=function(){t--};t<s.children.length;t++){var o=s.children[t];N(o)||(e.parent=s,e.childIndex=t,e.onNodeRemoved=a,zd(o,e))}}(s,a);}a.currentNode=s;for(var l=n.length;l--;)n[l]()}function Gd(o,s){var t=N(o)?function(e){return e===o}:function(e){return o.test(e)};return function(n,e){if(1===n.type){var o=n.props;if(3===n.tagType&&o.some(ad))return;for(var a,r=[],i=0;i<o.length;i++)if(a=o[i],7===a.type&&t(a.name)){o.splice(i,1),i--;var d=s(n,a,e);d&&r.push(d)}return r}}}function qd(d){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},t=function(o,e){function a(n){x.push("\n"+"  ".repeat(n))}var i=e.mode,d=void 0===i?"function":i,t=e.prefixIdentifiers,p=void 0===t?"module"===d:t,n=e.sourceMap,u=e.filename,h=void 0===u?"template.vue.html":u,r=e.scopeId,g=void 0===r?null:r,s=e.optimizeImports,m=e.runtimeGlobalName,y=void 0===m?"Vue":m,l=e.runtimeModuleName,v=void 0===l?"vue":l,c=e.ssr,_=e.isTS,b=e.inSSR,x={mode:d,prefixIdentifiers:p,sourceMap:void 0!==n&&n,filename:h,scopeId:g,optimizeImports:void 0!==s&&s,runtimeGlobalName:y,runtimeModuleName:v,ssr:void 0!==c&&c,isTS:void 0!==_&&_,inSSR:void 0!==b&&b,source:o.loc.source,code:"",column:1,line:1,offset:0,indentLevel:0,pure:!1,map:void 0,helper:function(n){return"_".concat(bl[n])},push:function(n){x.code+=n},indent:function(){a(++x.indentLevel)},deindent:function(){var n=!!(0<arguments.length&&void 0!==arguments[0])&&arguments[0];n?--x.indentLevel:a(--x.indentLevel)},newline:function(){a(x.indentLevel)}};return x}(d,e);e.onContextCreated&&e.onContextCreated(t);var n=t.mode,o=t.push,r=t.prefixIdentifiers,s=t.indent,i=t.deindent,l=t.newline,c=t.ssr,a=0<d.helpers.length,u=!r&&"module"!==n;if(!function(s,e){var t=e.push,n=e.newline,o=e.runtimeGlobalName;0<s.helpers.length&&(t("const _Vue = ".concat(o,"\n")),s.hoists.length)&&t("const { ".concat([Ui,Hi,Di,Wi,zi].filter(function(e){return s.helpers.includes(e)}).map(function(n){return"".concat(bl[n],": _").concat(bl[n])}).join(", ")," } = _Vue\n")),function(s,a){if(s.length){a.pure=!0;var t=a.push,n=a.newline;n(),s.forEach(function(o,e){o&&(t("const _hoisted_".concat(e+1," = ")),Yd(o,a),n())}),a.pure=!1}}(s.hoists,e),n(),t("return ")}(d,t),o("function ".concat(c?"ssrRender":"render","(").concat((c?["_ctx","_push","_parent","_attrs"]:["_ctx","_cache"]).join(", "),") {")),s(),u&&(o("with (_ctx) {"),s(),a&&(o("const { ".concat(d.helpers.map(function(n){return"".concat(bl[n],": _").concat(bl[n])}).join(", ")," } = _Vue")),o("\n"),l())),d.components.length&&(Jd(d.components,"component",t),(d.directives.length||0<d.temps)&&l()),d.directives.length&&(Jd(d.directives,"directive",t),0<d.temps&&l()),0<d.temps){o("let ");for(var p=0;p<d.temps;p++)o("".concat(0<p?", ":"","_temp").concat(p))}return(d.components.length||d.directives.length||d.temps)&&(o("\n"),l()),c||o("return "),d.codegenNode?Yd(d.codegenNode,t):o("null"),u&&(i(),o("}")),i(),o("}"),{ast:d,code:t.code,preamble:"",map:t.map?t.map.toJSON():void 0}}function Jd(a,e,t){for(var d=t.helper,n=t.push,o=t.newline,r=t.isTS,s=d("component"===e?Ki:qi),i=0;i<a.length;i++){var l=a[i],c=l.endsWith("__self");c&&(l=l.slice(0,-6)),n("const ".concat(ud(l,e)," = ").concat(s,"(").concat(JSON.stringify(l)).concat(c?", true":"",")").concat(r?"!":"")),i<a.length-1&&o()}}function Qd(o,e){var t=3<o.length||!1;e.push("["),t&&e.indent(),Xd(o,e,t),t&&e.deindent(),e.push("]")}function Xd(a,e){for(var t,i=!!(2<arguments.length&&arguments[2]!==void 0)&&arguments[2],n=!(3<arguments.length&&arguments[3]!==void 0)||arguments[3],o=e.push,r=e.newline,s=0;s<a.length;s++)t=a[s],N(t)?o(t):Gl(t)?Qd(t,e):Yd(t,e),s<a.length-1&&(i?(n&&o(","),r()):n&&o(", "))}function Yd(n,e){if(N(n))e.push(n);else if(E(n))e.push(e.helper(n));else switch(n.type){case 1:case 9:case 11:Yd(n.codegenNode,e);break;case 2:!function(n,e){e.push(JSON.stringify(n.content),n)}(n,e);break;case 4:Zd(n,e);break;case 5:!function(s,e){var t=e.push,n=e.helper,o=e.pure;o&&t("/*#__PURE__*/"),t("".concat(n(el),"(")),Yd(s.content,e),t(")")}(n,e);break;case 12:Yd(n.codegenNode,e);break;case 8:xl(n,e);break;case 3:!function(s,e){var t=e.push,n=e.helper,o=e.pure;o&&t("/*#__PURE__*/"),t("".concat(n(Di),"(").concat(JSON.stringify(s.content),")"),s)}(n,e);break;case 13:!function(g,e){var t=e.push,n=e.helper,o=e.pure,r=g.tag,s=g.props,i=g.children,l=g.patchFlag,c=g.dynamicProps,a=g.directives,u=g.isBlock,p=g.disableTracking,f=g.isComponent;a&&t(n(Zi)+"("),u&&t("(".concat(n(Bi),"(").concat(p?"true":"","), ")),o&&t("/*#__PURE__*/");var d=u?ld(e.inSSR,f):dd(e.inSSR,f);t(n(d)+"(",g),Xd(function(n){for(var e=n.length;e--&&null==n[e];);return n.slice(0,e+1).map(function(n){return n||"null"})}([r,s,i,l,c]),e),t(")"),u&&t(")"),a&&(t(", "),Yd(a,e),t(")"))}(n,e);break;case 14:!function(a,e){var t=e.push,n=e.helper,o=e.pure,r=N(a.callee)?a.callee:n(a.callee);o&&t("/*#__PURE__*/"),t(r+"(",a),Xd(a.arguments,e),t(")")}(n,e);break;case 15:!function(a,e){var t=e.push,n=e.indent,o=e.deindent,r=e.newline,s=a.properties;if(!s.length)return void t("{}",a);var i=1<s.length||!1;t(i?"{":"{ "),i&&n();for(var d=0;d<s.length;d++){var l=s[d],c=l.key,p=l.value;Cl(c,e),t(": "),Yd(p,e),d<s.length-1&&(t(","),r())}i&&o(),t(i?"}":" }")}(n,e);break;case 17:!function(n,e){Qd(n.elements,e)}(n,e);break;case 18:!function(d,e){var t=e.push,n=e.indent,o=e.deindent,r=d.params,s=d.returns,i=d.body,l=d.newline,c=d.isSlot;c&&t("_".concat(bl[hl],"(")),t("(",d),Gl(r)?Xd(r,e):r&&Yd(r,e),t(") => "),(l||i)&&(t("{"),n()),s?(l&&t("return "),Gl(s)?Qd(s,e):Yd(s,e)):i&&Yd(i,e),(l||i)&&(o(),t("}")),c&&t(")")}(n,e);break;case 19:!function(d,e){var t=d.test,n=d.consequent,o=d.alternate,r=d.newline,s=e.push,i=e.indent,l=e.deindent,c=e.newline;if(4===t.type){var a=!Ol(t.content);a&&s("("),Zd(t,e),a&&s(")")}else s("("),Yd(t,e),s(")");r&&i(),e.indentLevel++,r||s(" "),s("? "),Yd(n,e),e.indentLevel--,r&&c(),r||s(" "),s(": ");var p=19===o.type;p||e.indentLevel++,Yd(o,e),p||e.indentLevel--,r&&l(!0)}(n,e);break;case 20:!function(a,e){var t=e.push,n=e.helper,o=e.indent,r=e.deindent,s=e.newline;t("_cache[".concat(a.index,"] || (")),a.isVNode&&(o(),t("".concat(n(ul),"(-1),")),s()),t("_cache[".concat(a.index,"] = ")),Yd(a.value,e),a.isVNode&&(t(","),s(),t("".concat(n(ul),"(1),")),s(),t("_cache[".concat(a.index,"]")),r()),t(")")}(n,e);break;case 21:Xd(n.body,e,!0,!1);}}function Zd(s,e){var t=s.content,n=s.isStatic;e.push(n?JSON.stringify(t):t,s)}function xl(n,e){for(var t,o=0;o<n.children.length;o++)t=n.children[o],N(t)?e.push(t):Yd(t,e)}function Cl(o,e){var t=e.push;8===o.type?(t("["),xl(o,e),t("]")):o.isStatic?t(Ol(o.content)?o.content:JSON.stringify(o.content),o):t("[".concat(o.content,"]"),o)}function kl(n,e){return{type:10,loc:n.loc,condition:"else"===e.name?void 0:e.exp,children:3!==n.tagType||nd(n,"for")?[n]:n.children,userKey:td(n,"key")}}function Tl(o,e,t){return o.condition?Ri(o.condition,wl(o,e,t),Ti(t.helper(Di),["\"\"","true"])):wl(o,e,t)}function wl(a,e,t){var n=t.helper,d=vi("key",xi("".concat(e),!1,_l,2)),r=a.children,s=r[0];if(1!==r.length||1!==s.type){if(1===r.length&&11===s.type){var i=s.codegenNode;return pd(i,d,t),i}{return hi(t,n($i),mi([d]),r,"64",void 0,void 0,!0,!1,!1,a.loc)}}{var l=s.codegenNode,c=14===(o=l).type&&o.callee===vl?o.arguments[1].returns:o;return 13===c.type&&hd(c,t),pd(c,d,t),l}}function ea(t){var e=t.loc,n=t.content,o=n.match(ta);if(o){var r=_slicedToArray(o,3),d=r[1],s=r[2],i={source:sa(e,s.trim(),n.indexOf(s,d.length)),value:void 0,key:void 0,index:void 0},l=d.trim().replace(oa,"").trim(),p=d.indexOf(l),a=l.match(na);if(a){l=l.replace(na,"").trim();var u,h=a[1].trim();if(h&&(u=n.indexOf(h,p+l.length),i.key=sa(e,h,u)),a[2]){var f=a[2].trim();f&&(i.index=sa(e,f,n.indexOf(f,i.key?u+h.length:p+l.length)))}}return l&&(i.value=sa(e,l,p)),i}}function sa(o,e,t){return xi(e,!1,Ai(o,t,e.length))}function ia(s){var a=s.value,e=s.key,t=s.index,n=1<arguments.length&&arguments[1]!==void 0?arguments[1]:[];return function(n){for(var e=n.length;e--&&!n[e];);return n.slice(0,e+1).map(function(n,e){return n||xi("_".repeat(e+1),!1)})}([a,e,t].concat(_toConsumableArray(n)))}function la(g,e){var m=2<arguments.length&&arguments[2]!==void 0?arguments[2]:aa;e.helper(hl);var n=g.children,o=g.loc,t=[],s=[],r=0<e.scopes.vSlot||0<e.scopes.vFor,i=nd(g,"slot",!0);if(i){var c=i.arg,y=i.exp;c&&!Sl(c)&&(r=!0),t.push(vi(c||xi("default",!0),m(y,n,o)))}for(var v=!1,_=!1,b=[],p=new Set,f=0;f<n.length;f++){var x=n[f],C=void 0;if(!rd(x)||!(C=nd(x,"slot",!0))){3!==x.type&&b.push(x);continue}if(i)break;v=!0;var S=x.children,k=x.loc,T=C,w=T.arg,N=void 0===w?xi("default",!0):w,E=T.exp,R=void 0;Sl(N)?R=N?N.content:"default":r=!0;var I=m(E,S,k),P=void 0,F=void 0,A=void 0;if(P=nd(x,"if"))r=!0,s.push(Ri(P.exp,pa(N,I),ra));else if(F=nd(x,/^else(-if)?$/,!0)){for(var V=void 0,M=f;M--&&(V=n[M],3===V.type););if(V&&rd(V)&&nd(V,"if")){n.splice(f,1),f--;for(var B=s[s.length-1];19===B.alternate.type;)B=B.alternate;B.alternate=F.exp?Ri(F.exp,pa(N,I),ra):pa(N,I)}}else if(A=nd(x,"for")){r=!0;var L=A.parseResult||ea(A.exp);L&&s.push(Ti(e.helper(Qi),[L.source,Ni(ia(L),pa(N,I),!0)]))}else{if(R){if(p.has(R))continue;p.add(R),"default"===R&&(_=!0)}t.push(vi(N,I))}}if(!i){var O=function(n,e){return vi("default",m(n,e,o))};v?b.length&&b.some(function(n){return da(n)})&&(_||t.push(O(void 0,b))):t.push(O(void 0,n))}var U=r?2:fa(g.children)?3:1,d=mi(t.concat(vi("_",xi(U+"",!1))),o);return s.length&&(d=Ti(e.helper(Yi),[d,gi(s)])),{slots:d,hasDynamicSlots:r}}function pa(n,e){return mi([vi("name",n),vi("fn",e)])}function fa(n){for(var e,t=0;t<n.length;t++)switch(e=n[t],e.type){case 1:if(2===e.tagType||fa(e.children))return!0;break;case 9:if(fa(e.branches))return!0;break;case 10:case 11:if(fa(e.children))return!0;}return!1}function da(n){return 2!==n.type&&12!==n.type||(2===n.type?!!n.content.trim():da(n.content))}function ha(x,C){for(var e,t=2<arguments.length&&void 0!==arguments[2]?arguments[2]:x.props,n=!!(3<arguments.length&&void 0!==arguments[3])&&arguments[3],o=x.tag,r=x.loc,s=1===x.tagType,i=[],S=[],c=[],a=0,k=!1,T=!1,w=!1,N=!1,R=!1,I=!1,P=[],v=function(t){var o=t.key,e=t.value;if(Sl(o)){var n=o.content,a=_(n);if(s||!a||"onclick"===n.toLowerCase()||"onUpdate:modelValue"===n||M(n)||(N=!0),a&&M(n)&&(I=!0),20===e.type||(4===e.type||8===e.type)&&0<Ud(e,C))return;"ref"===n?k=!0:"class"===n?T=!0:"style"===n?w=!0:"key"===n||P.includes(n)||P.push(n),!s||"class"!==n&&"style"!==n||P.includes(n)||P.push(n)}else R=!0},y=0;y<t.length;y++)if(e=t[y],6===e.type){var F=e.loc,A=e.name,V=e.value;if("ref"===A&&(k=!0),"is"===A&&(ba(o)||V&&V.content.startsWith("vue:")))continue;i.push(vi(xi(A,!0,Ai(F,0,A.length)),xi(V?V.content:"",!0,V?V.loc:F)))}else{var B=e.name,L=e.arg,O=e.exp,U=e.loc,H="bind"===B,D="on"===B;if("slot"===B)continue;if("once"===B||"memo"===B)continue;if("is"===B||H&&od(L,"is")&&ba(o))continue;if(D&&n)continue;if(!L&&(H||D)){R=!0,O&&(i.length&&(S.push(mi(va(i),r)),i=[]),S.push(H?O:{type:14,loc:U,callee:C.helper(il),arguments:[O]}));continue}var j=C.directiveTransforms[B];if(j){var $,K=j(e,x,C),W=K.props,z=K.needRuntime;n||W.forEach(v),($=i).push.apply($,_toConsumableArray(W)),z&&(c.push(e),E(z)&&ua.set(e,z))}else c.push(e)}var G;if(S.length?(i.length&&S.push(mi(va(i),r)),G=1<S.length?Ti(C.helper(tl),S,r):S[0]):i.length&&(G=mi(va(i),r)),R?a|=16:(T&&!s&&(a|=2),w&&!s&&(a|=4),P.length&&(a|=8),N&&(a|=32)),0!=a&&32!=a||!(k||I||0<c.length)||(a|=512),!C.inSSR&&G)switch(G.type){case 15:for(var q,J=-1,Q=-1,X=!1,Y=0;Y<G.properties.length;Y++)q=G.properties[Y].key,Sl(q)?"class"===q.content?J=Y:"style"===q.content&&(Q=Y):q.isHandlerKey||(X=!0);var Z=G.properties[J],ee=G.properties[Q];X?G=Ti(C.helper(rl),[G]):(Z&&!Sl(Z.value)&&(Z.value=Ti(C.helper(nl),[Z.value])),!ee||Sl(ee.value)||!w&&17!==ee.value.type||(ee.value=Ti(C.helper(ol),[ee.value])));break;case 14:break;default:G=Ti(C.helper(rl),[Ti(C.helper(sl),[G])]);}return{props:G,directives:c,patchFlag:a,dynamicPropNames:P}}function va(o){for(var e,s=new Map,t=[],n=0;n<o.length;n++){if(e=o[n],8===e.key.type||!e.key.isStatic){t.push(e);continue}var a=e.key.content,r=s.get(a);r?("style"===a||"class"===a||a.startsWith("on"))&&ya(r,e):(s.set(a,e),t.push(e))}return t}function ya(n,e){17===n.value.type?n.value.elements.push(e.value):n.value=gi([n.value,e.value],n.loc)}function ba(n){return"component"===n[0].toLowerCase()+n.slice(1)}function _a(){var n=0<arguments.length&&arguments[0]!==void 0?arguments[0]:[];return{props:n}}function Ra(s){var e=1<arguments.length&&arguments[1]!==void 0?arguments[1]:{},t=e.onError||di,n="module"===e.mode;!0===e.prefixIdentifiers?t(ui(45)):n&&t(ui(46)),e.cacheHandlers&&t(ui(47)),e.scopeId&&!n&&t(ui(48));var o=N(s)?fd(s,e):s;return Wd(o,zl({},e,{prefixIdentifiers:!1,nodeTransforms:[].concat(_toConsumableArray([Na,Ec,Fa,Rc,ga,ma,ca,ka]),_toConsumableArray(e.nodeTransforms||[])),directiveTransforms:zl({},{on:xa,bind:Ca,model:Ea},e.directiveTransforms||{})})),qd(o,zl({},e,{prefixIdentifiers:!1}))}function Ma(a,i){if(!N(a)){if(!a.nodeType)return Wl;a=a.innerHTML}var t=a,n=Fc[t];if(n)return n;if("#"===a[0]){var o=document.querySelector(a);a=o?o.innerHTML:""}var d=function(n){var e=1<arguments.length&&arguments[1]!==void 0?arguments[1]:{};return Ra(n,zl({},Ka,e,{nodeTransforms:[Ya].concat(Ic,_toConsumableArray(e.nodeTransforms||[])),directiveTransforms:zl({},Pc,e.directiveTransforms||{}),transformHoist:null}))}(a,zl({hoistStatic:!0,onError:void 0,onWarn:Wl},i)),l=d.code,r=new Function(l)();return r._rc=!0,Fc[t]=r}var El,Rl,Ml,Ul,Hl,Dl,jl=e("Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt"),$l=e("itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly"),n=/;(?![^(]*\))/g,o=/:(.+)/,i=e("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot"),u=e("svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistanceLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view"),p=e("area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr"),f=function n(o,e){return e&&e.__v_isRef?n(o,e.value):S(e)?_defineProperty({},"Map(".concat(e.size,")"),_toConsumableArray(e.entries()).reduce(function(o,e){var s=_slicedToArray(e,2),a=s[0],t=s[1];return o["".concat(a," =>")]=t,o},{})):k(e)?_defineProperty({},"Set(".concat(e.size,")"),_toConsumableArray(e.values())):!R(e)||Gl(e)||A(e)?e:e+""},Kl={},g=[],Wl=function(){},m=function(){return!1},y=/^on[^a-z]/,_=function(n){return y.test(n)},v=function(n){return n.startsWith("onUpdate:")},zl=Object.assign,b=function(o,e){var t=o.indexOf(e);-1<t&&o.splice(t,1)},x=Object.prototype.hasOwnProperty,C=function(n,e){return x.call(n,e)},Gl=Array.isArray,S=function(n){return"[object Map]"===I(n)},k=function(n){return"[object Set]"===I(n)},T=function(n){return n instanceof Date},w=function(n){return"function"==typeof n},N=function(n){return"string"==typeof n},E=function(n){return"symbol"==_typeof(n)},R=function(n){return null!==n&&"object"==_typeof(n)},F=function(n){return R(n)&&w(n.then)&&w(n["catch"])},P=Object.prototype.toString,I=function(n){return P.call(n)},A=function(n){return"[object Object]"===I(n)},V=function(n){return N(n)&&"NaN"!==n&&"-"!==n[0]&&""+parseInt(n,10)===n},M=e(",key,ref,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),B=function(o){var e=Object.create(null);return function(t){return e[t]||(e[t]=o(t))}},L=/-(\w)/g,O=B(function(n){return n.replace(L,function(n,e){return e?e.toUpperCase():""})}),U=/\B([A-Z])/g,H=B(function(n){return n.replace(U,"-$1").toLowerCase()}),D=B(function(n){return n.charAt(0).toUpperCase()+n.slice(1)}),j=B(function(n){return n?"on".concat(D(n)):""}),$=function(n,e){return!Object.is(n,e)},K=function(n,e){for(var t=0;t<n.length;t++)n[t](e)},W=function(o,e,t){Object.defineProperty(o,e,{configurable:!0,enumerable:!1,value:t})},z=function(n){var e=parseFloat(n);return isNaN(e)?n:e},G=[],q=/*#__PURE__*/function(){function n(){var t=!!(0<arguments.length&&void 0!==arguments[0])&&arguments[0];_classCallCheck(this,n),this.active=!0,this.effects=[],this.cleanups=[],!t&&Ml&&(this.parent=Ml,this.index=(Ml.scopes||(Ml.scopes=[])).push(this)-1)}return _createClass(n,[{key:"run",value:function(n){if(this.active)try{return this.on(),n()}finally{this.off()}}},{key:"on",value:function(){this.active&&(G.push(this),Ml=this)}},{key:"off",value:function(){this.active&&(G.pop(),Ml=G[G.length-1])}},{key:"stop",value:function(n){if(this.active){if(this.effects.forEach(function(n){return n.stop()}),this.cleanups.forEach(function(n){return n()}),this.scopes&&this.scopes.forEach(function(n){return n.stop(!0)}),this.parent&&!n){var e=this.parent.scopes.pop();e&&e!==this&&(this.parent.scopes[this.index]=e,e.index=this.index)}this.active=!1}}}]),n}(),J=function(n){var e=new Set(n);return e.w=0,e.n=0,e},Q=function(n){return 0<(n.w&ne)},Y=function(n){return 0<(n.n&ne)},Z=new WeakMap,ee=0,ne=1,oe=[],se=Symbol(""),re=Symbol(""),ce=/*#__PURE__*/function(){function o(s){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null,t=2<arguments.length?arguments[2]:void 0;_classCallCheck(this,o),this.fn=s,this.scheduler=e,this.active=!0,this.deps=[],h(this,t)}return _createClass(o,[{key:"run",value:function(){if(!this.active)return this.fn();if(!oe.includes(this))try{return oe.push(Ul=this),ue.push(pe),pe=!0,ne=1<<++ee,30>=ee?function(n){var t=n.deps;if(t.length)for(var e=0;e<t.length;e++)t[e].w|=ne}(this):t(this),this.fn()}finally{30>=ee&&function(n){var e=n.deps;if(e.length){for(var t,o=0,s=0;s<e.length;s++)t=e[s],Q(t)&&!Y(t)?t["delete"](n):e[o++]=t,t.w&=~ne,t.n&=~ne;e.length=o}}(this),ne=1<<--ee,de(),oe.pop();var e=oe.length;Ul=0<e?oe[e-1]:void 0}}},{key:"stop",value:function(){this.active&&(t(this),this.onStop&&this.onStop(),this.active=!1)}}]),o}(),pe=!0,ue=[],fe=e("__proto__,__v_isRef,__isVue"),me=new Set(Object.getOwnPropertyNames(Symbol).map(function(n){return Symbol[n]}).filter(E)),Ce=xe(),ke=xe(!1,!0),Te=xe(!0),we=xe(!0,!0),Ne=function(){var n={};return["includes","indexOf","lastIndexOf"].forEach(function(s){n[s]=function(){for(var t=yt(this),n=0,a=this.length;n<a;n++)ge(t,0,n+"");for(var r=arguments.length,i=Array(r),e=0;e<r;e++)i[e]=arguments[e];var d=t[s].apply(t,i);return-1===d||!1===d?t[s].apply(t,_toConsumableArray(i.map(yt))):d}}),["push","pop","shift","unshift","splice"].forEach(function(o){n[o]=function(){te();for(var t=arguments.length,s=Array(t),e=0;e<t;e++)s[e]=arguments[e];var a=yt(this)[o].apply(this,s);return de(),a}}),n}(),Ee={get:Ce,set:Se(),deleteProperty:function(s,e){var t=C(s,e),n=Reflect.deleteProperty(s,e);return n&&t&&_e(s,"delete",e,void 0),n},has:function(o,e){var t=Reflect.has(o,e);return E(e)&&me.has(e)||ge(o,0,e),t},ownKeys:function(n){return ge(n,0,Gl(n)?"length":se),Reflect.ownKeys(n)}},Me={get:Te,set:function(){return!0},deleteProperty:function(){return!0}},Oe=zl({},Ee,{get:ke,set:Se(!0)}),Pe=zl({},Me,{get:we}),Ie=function(n){return R(n)?nt(n):n},Ve=function(n){return R(n)?dt(n):n},Be=function(n){return n},Le=function(n){return Reflect.getPrototypeOf(n)},je=function(){var s={get:function(n){return Fe(this,n)},get size(){return Ue(this)},has:Ae,add:He,set:De,delete:We,clear:Ke,forEach:ze(!1,!1)},e={get:function(n){return Fe(this,n,!1,!0)},get size(){return Ue(this)},has:Ae,add:He,set:De,delete:We,clear:Ke,forEach:ze(!1,!0)},t={get:function(n){return Fe(this,n,!0)},get size(){return Ue(this,!0)},has:function(n){return Ae.call(this,n,!0)},add:qe("add"),set:qe("set"),delete:qe("delete"),clear:qe("clear"),forEach:ze(!0,!1)},n={get:function(n){return Fe(this,n,!0,!0)},get size(){return Ue(this,!0)},has:function(n){return Ae.call(this,n,!0)},add:qe("add"),set:qe("set"),delete:qe("delete"),clear:qe("clear"),forEach:ze(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(function(o){s[o]=Ge(o,!1,!1),t[o]=Ge(o,!0,!1),e[o]=Ge(o,!1,!0),n[o]=Ge(o,!0,!0)}),[s,t,e,n]}(),$e=_slicedToArray(je,4),ql=$e[0],Xe=$e[1],Ye=$e[2],et=$e[3],tt={get:Je(!1,!1)},ot={get:Je(!1,!0)},rt={get:Je(!0,!1)},st={get:Je(!0,!0)},it=new WeakMap,lt=new WeakMap,ct=new WeakMap,at=new WeakMap,ut=function(n){return R(n)?nt(n):n},Ct=/*#__PURE__*/function(){function n(o){var e=!!(1<arguments.length&&void 0!==arguments[1])&&arguments[1];_classCallCheck(this,n),this._shallow=e,this.dep=void 0,this.__v_isRef=!0,this._rawValue=e?o:yt(o),this._value=e?o:ut(o)}return _createClass(n,[{key:"value",get:function(){return _t(this),this._value},set:function(n){n=this._shallow?n:yt(n),$(n,this._rawValue)&&(this._rawValue=n,this._value=this._shallow?n:ut(n),bt(this))}}]),n}(),Tt={get:function(o,e,t){return wt(Reflect.get(o,e,t))},set:function(s,e,t,n){var o=s[e];return xt(o)&&!xt(t)?(o.value=t,!0):Reflect.set(s,e,t,n)}},$t=/*#__PURE__*/function(){function o(s){var e=this;_classCallCheck(this,o),this.dep=void 0,this.__v_isRef=!0;var a=s(function(){return _t(e)},function(){return bt(e)}),r=a.get,t=a.set;this._get=r,this._set=t}return _createClass(o,[{key:"value",get:function(){return this._get()},set:function(n){this._set(n)}}]),o}(),Ft=/*#__PURE__*/function(){function n(o,e){_classCallCheck(this,n),this._object=o,this._key=e,this.__v_isRef=!0}return _createClass(n,[{key:"value",get:function(){return this._object[this._key]},set:function(n){this._object[this._key]=n}}]),n}(),At=/*#__PURE__*/function(){function o(s,e,t){var n=this;_classCallCheck(this,o),this._setter=e,this.dep=void 0,this._dirty=!0,this.__v_isRef=!0,this.effect=new ce(s,function(){n._dirty||(n._dirty=!0,bt(n))}),this.__v_isReadonly=t}return _createClass(o,[{key:"value",get:function(){var n=yt(this);return _t(n),n._dirty&&(n._dirty=!1,n._value=n.effect.run()),n._value},set:function(n){this._setter(n)}}]),o}(),Ot=null,Jl=null,Ql=function(n){var e;for(var o in n)("class"===o||"style"===o||_(o))&&((e||(e={}))[o]=n[o]);return e},zt=function(o,e){var t={};for(var n in o)v(n)&&n.slice(9)in e||(t[n]=o[n]);return t},Kt=[Function,Array],rn={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Kt,onEnter:Kt,onAfterEnter:Kt,onEnterCancelled:Kt,onBeforeLeave:Kt,onLeave:Kt,onAfterLeave:Kt,onLeaveCancelled:Kt,onBeforeAppear:Kt,onAppear:Kt,onAfterAppear:Kt,onAppearCancelled:Kt},setup:function(g,e){var s,m=e.slots,t=ic(),y=nn();return function(){var e=m["default"]&&pn(m["default"](),!0);if(e&&e.length){var n=yt(g),o=n.mode,r=e[0];if(y.isLeaving)return cn(r);var i=an(r);if(!i)return cn(r);var a=ln(i,n,y,t);un(i,a);var l=t.subTree,c=l&&an(l),p=!1,u=i.type.getTransitionKey;if(u){var h=u();void 0===s?s=h:h!==s&&(s=h,p=!0)}if(c&&c.type!==Ao&&(!Uo(i,c)||p)){var f=ln(c,n,y,t);if(un(c,f),"out-in"===o)return y.isLeaving=!0,f.afterLeave=function(){y.isLeaving=!1,t.update()},cn(r);"in-out"===o&&i.type!==Ao&&(f.delayLeave=function(o,e,t){on(y,c)[c.key+""]=c,o._leaveCb=function(){e(),o._leaveCb=void 0,delete a.delayedLeave},a.delayedLeave=t})}return r}}}},sn=function(n){return!!n.type.__asyncLoader},hn=function(n){return n.type.__isKeepAlive},gn={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup:function(y,e){function _(n){xn(n),o(n,h,C)}function d(s){x.forEach(function(e,t){var n=nr(e.type);!n||s&&s(n)||b(t)})}function b(n){var e=x.get(n);s&&e.type===s.type?s&&xn(s):_(e),x["delete"](n),r["delete"](n)}var m=e.slots,h=ic(),n=h.ctx;if(!n.renderer)return m["default"];var x=new Map,r=new Set,s=null,C=h.suspense,t=n.renderer,l=t.p,c=t.m,o=t.um,a=t.o.createElement,p=a("div");n.activate=function(a,e,t,n,o){var r=a.component;c(a,e,t,0,C),l(r.vnode,a,e,t,r,C,n,a.slotScopeIds,o),fo(function(){r.isDeactivated=!1,r.a&&K(r.a);var e=a.props&&a.props.onVnodeMounted;e&&yo(e,r.parent,a)},C)},n.deactivate=function(o){var e=o.component;c(o,p,null,1,C),fo(function(){e.da&&K(e.da);var t=o.props&&o.props.onVnodeUnmounted;t&&yo(t,e.parent,o),e.isDeactivated=!0},C)},ts(function(){return[y.include,y.exclude]},function(n){var o=_slicedToArray(n,2),s=o[0],a=o[1];s&&d(function(e){return mn(s,e)}),a&&d(function(n){return!mn(a,n)})},{flush:"post",deep:!0});var S=null,u=function(){null!=S&&x.set(S,Cn(h.subTree))};return Nn(u),$n(u),Rn(function(){x.forEach(function(n){var e=h.subTree,t=h.suspense,o=Cn(e);if(n.type!==o.type)_(n);else{xn(o);var s=o.component.da;s&&fo(s,t)}})}),function(){if(S=null,!m["default"])return null;var e=m["default"](),n=e[0];if(1<e.length)return s=null,e;if(!(Bo(n)&&(4&n.shapeFlag||128&n.shapeFlag)))return s=null,n;var t=Cn(n),o=t.type,i=nr(sn(t)?t.type.__asyncResolved||{}:o),a=y.include,c=y.exclude,p=y.max;if(a&&(!i||!mn(a,i))||c&&i&&mn(c,i))return s=t,n;var u=null==t.key?o:t.key,d=x.get(u);return t.el&&(t=jo(t),128&n.shapeFlag&&(n.ssContent=t)),S=u,d?(t.el=d.el,t.component=d.component,t.transition&&un(t,t.transition),t.shapeFlag|=512,r["delete"](u),r.add(u)):(r.add(u),p&&r.size>parseInt(p,10)&&b(r.values().next().value)),t.shapeFlag|=256,s=t,n}}},vn=function(o){return function(e){var t=1<arguments.length&&arguments[1]!==void 0?arguments[1]:ac;return(!dr||"sp"===o)&&wn(o,e,t)}},Tn=vn("bm"),Nn=vn("m"),En=vn("bu"),$n=vn("u"),Rn=vn("bum"),Fn=vn("um"),An=vn("sp"),Mn=vn("rtg"),On=vn("rtc"),Pn=!0,Yl={data:Hn,props:Kn,emits:Kn,methods:Kn,computed:Kn,beforeCreate:zn,created:zn,beforeMount:zn,mounted:zn,beforeUpdate:zn,updated:zn,beforeDestroy:zn,destroyed:zn,activated:zn,deactivated:zn,errorCaptured:zn,serverPrefetch:zn,components:Kn,directives:Kn,watch:function(o,e){if(!o)return e;if(!e)return o;var t=zl(Object.create(null),o);for(var n in e)t[n]=zn(o[n],e[n]);return t},provide:Hn,inject:function(n,e){return Kn(Wn(n),Wn(e))}},Dn=function(n){return"_"===n[0]||"$stable"===n},to=function(n){return Gl(n)?n.map(Wo):[Wo(n)]},no=function(s,e,t){var n=Bt(function(){return to(e.apply(void 0,arguments))},t);return n._c=!1,n},oo=function(n,s){var e=n._ctx;for(var t in n)if(!Dn(t)){var o=n[t];w(o)?s[t]=no(0,o,e):null!=o&&function(){var n=to(o);s[t]=function(){return n}}()}},ro=function(o,e){var t=to(e);o.slots["default"]=function(){return t}},so=0,Zl=!1,ec=function(n){return /svg/.test(n.namespaceURI)&&"foreignObject"!==n.tagName},po=function(n){return 8===n.nodeType},fo=Qt,mo=function(n){return n&&(n.disabled||""===n.disabled)},xo=function(n){return"undefined"!=typeof SVGElement&&n instanceof SVGElement},Co=function(o,e){var t=o&&o.to;return N(t)?e?e(t):null:t},wo=Symbol(),Eo=Symbol(void 0),Fo=Symbol(void 0),Ao=Symbol(void 0),Mo=Symbol(void 0),Oo=[],Po=null,nc=1,tc="__vInternal",zo=function(n){var t=n.key;return null==t?null:t},Ko=function(n){var t=n.ref;return null==t?null:N(t)||xt(t)||w(t)?{i:Ot,r:t}:t},Go=function(s){var a=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null,d=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null,n=3<arguments.length&&void 0!==arguments[3]?arguments[3]:0,o=4<arguments.length&&void 0!==arguments[4]?arguments[4]:null,p=!!(5<arguments.length&&void 0!==arguments[5])&&arguments[5];if(s&&s!==wo||(s=Ao),Bo(s)){var i=jo(s,a,!0);return d&&Qo(i,d),i}u=s,w(u)&&"__vccOpts"in u&&(s=s.__vccOpts);var u;if(a){a=Do(a);var h=a,f=h["class"],g=h.style;f&&!N(f)&&(a["class"]=c(f)),R(g)&&(mt(g)&&!Gl(g)&&(g=zl({},g)),a.style=r(g))}var m=N(s)?1:function(n){return n.__isSuspense}(s)?128:function(n){return n.__isTeleport}(s)?64:R(s)?4:w(s)?2:0;return Ho(s,a,d,n,o,m,p,!0)},Jo=function n(t){return t?Zo(t)?er(t)||t.proxy:n(t.parent):null},rr=zl(Object.create(null),{$:function(n){return n},$el:function(n){return n.vnode.el},$data:function(n){return n.data},$props:function(n){return n.props},$attrs:function(n){return n.attrs},$slots:function(n){return n.slots},$refs:function(n){return n.refs},$parent:function(n){return Jo(n.parent)},$root:function(n){return Jo(n.root)},$emit:function(n){return n.emit},$options:function(n){return jn(n)},$forceUpdate:function(n){return function(){return Sr(n.update)}},$nextTick:function(n){return xr.bind(n.proxy)},$watch:function(n){return rs.bind(n)}}),sr={get:function(d,h){var t,g=d._,e=g.ctx,n=g.setupState,o=g.data,r=g.props,s=g.accessCache,i=g.type,l=g.appContext;if("$"!==h[0]){var c=s[h];if(void 0!==c)switch(c){case 0:return n[h];case 1:return o[h];case 3:return e[h];case 2:return r[h];}else{if(n!==Kl&&C(n,h))return s[h]=0,n[h];if(o!==Kl&&C(o,h))return s[h]=1,o[h];if((t=g.propsOptions[0])&&C(t,h))return s[h]=2,r[h];if(e!==Kl&&C(e,h))return s[h]=3,e[h];Pn&&(s[h]=4)}}var m,y,v=rr[h];return v?("$attrs"===h&&ge(g,0,h),v(g)):(m=i.__cssModules)&&(m=m[h])?m:e!==Kl&&C(e,h)?(s[h]=3,e[h]):(y=l.config.globalProperties,C(y,h)?y[h]:void 0)},set:function(a,i,t){var n=a._,e=n.data,o=n.setupState,r=n.ctx;if(o!==Kl&&C(o,i))o[i]=t;else if(e!==Kl&&C(e,i))e[i]=t;else if(C(n.props,i))return!1;return("$"!==i[0]||!(i.slice(1)in n))&&(r[i]=t,!0)},has:function(a,d){var i,c=a._,p=c.data,e=c.setupState,t=c.accessCache,n=c.ctx,o=c.appContext,r=c.propsOptions;return void 0!==t[d]||p!==Kl&&C(p,d)||e!==Kl&&C(e,d)||(i=r[0])&&C(i,d)||C(n,d)||C(rr,d)||C(o.config.globalProperties,d)}},ir=zl({},sr,{get:function(n,e){if(e!==Symbol.unscopables)return sr.get(n,e,n)},has:function(n,e){return"_"!==e[0]&&!jl(e)}}),lr=Zt(),cr=0,ac=null,ic=function(){return ac||Ot},pr=function(n){ac=n,n.scope.on()},fr=function(){ac&&ac.scope.off(),ac=null},dr=!1,lc=/(?:^|[-_])(\w)/g,Cr=[],Tr=!1,cc=!1,pc=[],Pr=0,uc=[],Vr=null,hc=0,fc=[],jr=null,gc=0,mc=Promise.resolve(),Dr=null,yc=null,vc=function(n){return null==n.id?1/0:n.id},Yr={},ns=Symbol(""),us="3.2.4",fs="undefined"==typeof document?null:document,ds=new Map,hs=/\s*!important$/,gs=["Webkit","Moz","ms"],ys={},bs=Date.now,_c=!1;if("undefined"!=typeof window){bs()>document.createEvent("Event").timeStamp&&(bs=function(){return performance.now()});var bc=navigator.userAgent.match(/firefox\/(\d+)/i);_c=!!(bc&&53>=+bc[1])}var xc=0,Cc=Promise.resolve(),ws=function(){xc=0},ks=/(?:Once|Passive|Capture)$/,Es=/^on[a-z]/,$s="undefined"==typeof HTMLElement?/*#__PURE__*/function(){function e(){_classCallCheck(this,e)}return e}():HTMLElement,Fs=/*#__PURE__*/function(e){function o(a){var e,r=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},t=2<arguments.length?arguments[2]:void 0;_classCallCheck(this,o),e=s.call(this),e._def=a,e._props=r,e._instance=null,e._connected=!1,e._resolved=!1,e.shadowRoot&&t?t(e._createVNode(),e.shadowRoot):e.attachShadow({mode:"open"});for(var n=0;n<e.attributes.length;n++)e._setAttr(e.attributes[n].name);return new MutationObserver(function(n){var t,o=_createForOfIteratorHelper(n);try{for(o.s();!(t=o.n()).done;){var s=t.value;e._setAttr(s.attributeName)}}catch(e){o.e(e)}finally{o.f()}}).observe(_assertThisInitialized(e),{attributes:!0}),e}_inherits(o,e);var s=_createSuper(o);return _createClass(o,[{key:"connectedCallback",value:function(){this._connected=!0,this._instance||(this._resolveDef(),Nc(this._createVNode(),this.shadowRoot))}},{key:"disconnectedCallback",value:function(){var e=this;this._connected=!1,xr(function(){e._connected||(Nc(null,e.shadowRoot),e._instance=null)})}},{key:"_resolveDef",value:function(){var s=this;if(!this._resolved){var a=function(e){s._resolved=!0;for(var a,r=0,i=Object.keys(s);r<i.length;r++)a=i[r],"_"!==a[0]&&s._setProp(a,s[a]);var d,l=e.props,t=e.styles,n=l?Gl(l)?l:Object.keys(l):[],o=_createForOfIteratorHelper(n.map(O));try{var c=function(){var n=d.value;Object.defineProperty(s,n,{get:function(){return this._getProp(n)},set:function(t){this._setProp(n,t)}})};for(o.s();!(d=o.n()).done;)c()}catch(e){o.e(e)}finally{o.f()}s._applyStyles(t)},e=this._def.__asyncLoader;e?e().then(a):a(this._def)}}},{key:"_setAttr",value:function(n){this._setProp(O(n),z(this.getAttribute(n)),!1)}},{key:"_getProp",value:function(n){return this._props[n]}},{key:"_setProp",value:function(o,e){var t=!(2<arguments.length&&void 0!==arguments[2])||arguments[2];e!==this._props[o]&&(this._props[o]=e,this._instance&&Nc(this._createVNode(),this.shadowRoot),t&&(!0===e?this.setAttribute(H(o),""):"string"==typeof e||"number"==typeof e?this.setAttribute(H(o),e+""):e||this.removeAttribute(H(o))))}},{key:"_createVNode",value:function(){var n=this,t=Go(this._def,zl({},this._props));return this._instance||(t.ce=function(s){n._instance=s,s.isCE=!0,s.emit=function(o){for(var e=arguments.length,s=Array(1<e?e-1:0),t=1;t<e;t++)s[t-1]=arguments[t];n.dispatchEvent(new CustomEvent(o,{detail:s}))};for(var e=n;e=e&&(e.parentNode||e.host);)if(e instanceof o){s.parent=e._instance;break}}),t}},{key:"_applyStyles",value:function(n){var o=this;n&&n.forEach(function(n){var e=document.createElement("style");e.textContent=n,o.shadowRoot.appendChild(e)})}}]),o}($s),As=function(n,e){var o=e.slots;return cs(rn,Os(n),o)};As.displayName="Transition";var Vs,Sc,kc,Tc={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Bs=As.props=zl({},rn.props,Tc),Ls=function(n){var o=1<arguments.length&&arguments[1]!==void 0?arguments[1]:[];Gl(n)?n.forEach(function(n){return n.apply(void 0,_toConsumableArray(o))}):n&&n.apply(void 0,_toConsumableArray(o))},js=function(n){return!!n&&(Gl(n)?n.some(function(n){return 1<n.length}):1<n.length)},Us=0,wc=new WeakMap,Ys=new WeakMap,ei={name:"TransitionGroup",props:zl({},Bs,{tag:String,moveClass:String}),setup:function(a,e){var d,p,u=e.slots,i=ic(),n=nn();return $n(function(){if(d.length){var s=a.moveClass||"".concat(a.name||"v","-move");if(function(a,e,t){var n=a.cloneNode();a._vtc&&a._vtc.forEach(function(t){t.split(/\s+/).forEach(function(t){return t&&n.classList.remove(t)})}),t.split(/\s+/).forEach(function(t){return t&&n.classList.add(t)}),n.style.display="none";var o=1===e.nodeType?e:e.parentNode;o.appendChild(n);var r=qs(n),i=r.hasTransform;return o.removeChild(n),i}(d[0].el,i.vnode.el,s)){d.forEach(Xs),d.forEach(Ar);var e=d.filter($r);Qs(),e.forEach(function(t){var a=t.el,e=a.style;Ds(a,s),e.transform=e.webkitTransform=e.transitionDuration="";var n=a._moveCb=function(t){t&&t.target!==a||t&&!/transform$/.test(t.propertyName)||(a.removeEventListener("transitionend",n),a._moveCb=null,Ws(a,s))};a.addEventListener("transitionend",n)})}}}),function(){var e=yt(a),t=Os(e),o=e.tag||Eo;d=p,p=u["default"]?pn(u["default"]()):[];for(var s,r=0;r<p.length;r++)s=p[r],null!=s.key&&un(s,ln(s,t,n,i));if(d)for(var l,c=0;c<d.length;c++)l=d[c],un(l,ln(l,t,n,i)),wc.set(l,l.el.getBoundingClientRect());return Go(o,null,p)}}},ti=function(n){var o=n.props["onUpdate:modelValue"];return Gl(o)?function(n){return K(o,n)}:o},si={created:function(a,e,i){var r=e.modifiers,d=r.lazy,t=r.trim,n=r.number;a._assign=ti(i);var l=n||i.props&&"number"===i.props.type;vs(a,d?"change":"input",function(e){if(!e.target.composing){var n=a.value;t?n=n.trim():l&&(n=z(n)),a._assign(n)}}),t&&vs(a,"change",function(){a.value=a.value.trim()}),d||(vs(a,"compositionstart",Kr),vs(a,"compositionend",Gr),vs(a,"change",Gr))},mounted:function(n,e){var o=e.value;n.value=null==o?"":o},beforeUpdate:function(a,e,d){var s=e.value,t=e.modifiers,l=t.lazy,n=t.trim,o=t.number;if(a._assign=ti(d),!a.composing){if(document.activeElement===a){if(l)return;if(n&&a.value.trim()===s)return;if((o||"number"===a.type)&&z(a.value)===s)return}var r=null==s?"":s;a.value!==r&&(a.value=r)}}},ci={deep:!0,created:function(s,e,t){s._assign=ti(t),vs(s,"change",function(){var e=s._modelValue,t=Qr(s),n=s.checked,o=s._assign;if(Gl(e)){var a=d(e,t),r=-1!==a;if(n&&!r)o(e.concat(t));else if(!n&&r){var i=_toConsumableArray(e);i.splice(a,1),o(i)}}else if(k(e)){var l=new Set(e);n?l.add(t):l["delete"](t),o(l)}else o(Xr(s,n))})},mounted:qr,beforeUpdate:function(o,e,t){o._assign=ti(t),qr(o,e,t)}},ai={created:function(o,e,s){var n=e.value;o.checked=a(n,s.props.value),o._assign=ti(s),vs(o,"change",function(){o._assign(Qr(o))})},beforeUpdate:function(s,e,r){var o=e.value,t=e.oldValue;s._assign=ti(r),o!==t&&(s.checked=a(o,r.props.value))}},pi={deep:!0,created:function(s,e,a){var o=e.value,t=e.modifiers.number,n=k(o);vs(s,"change",function(){var e=Array.prototype.filter.call(s.options,function(n){return n.selected}).map(function(n){return t?z(Qr(n)):Qr(n)});s._assign(s.multiple?n?new Set(e):e:e[0])}),s._assign=ti(a)},mounted:function(n,e){var o=e.value;Jr(n,o)},beforeUpdate:function(o,e,t){o._assign=ti(t)},updated:function(n,e){var o=e.value;Jr(n,o)}},fi=["ctrl","shift","alt","meta"],yi={stop:function(n){return n.stopPropagation()},prevent:function(n){return n.preventDefault()},self:function(n){return n.target!==n.currentTarget},ctrl:function(n){return!n.ctrlKey},shift:function(n){return!n.shiftKey},alt:function(n){return!n.altKey},meta:function(n){return!n.metaKey},left:function(n){return"button"in n&&0!==n.button},middle:function(n){return"button"in n&&1!==n.button},right:function(n){return"button"in n&&2!==n.button},exact:function(o,e){return fi.some(function(t){return o["".concat(t,"Key")]&&!e.includes(t)})}},bi={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},_i=zl({patchProp:function(o,e,r,n){var s=!!(4<arguments.length&&arguments[4]!==void 0)&&arguments[4],i=5<arguments.length?arguments[5]:void 0,d=6<arguments.length?arguments[6]:void 0,l=7<arguments.length?arguments[7]:void 0,a=8<arguments.length?arguments[8]:void 0;"class"===e?function(s,e,a){var n=s._vtc;n&&(e=(e?[e].concat(_toConsumableArray(n)):_toConsumableArray(n)).join(" ")),null==e?s.removeAttribute("class"):a?s.setAttribute("class",e):s.className=e}(o,n,s):"style"===e?function(s,e,t){var n=s.style;if(!t)s.removeAttribute("style");else if(!N(t)){for(var o in t)ps(n,o,t[o]);if(e&&!N(e))for(var a in e)null==t[a]&&ps(n,a,"")}else if(e!==t){var r=n.display;n.cssText=t,"_vod"in s&&(n.display=r)}}(o,r,n):_(e)?v(e)||Ts(o,e,0,n,d):("."===e[0]?(e=e.slice(1),1):"^"===e[0]?(e=e.slice(1),0):function(s,e,t,n){return n?"innerHTML"===e||"textContent"===e||!!(e in s&&Es.test(e)&&w(t)):"spellcheck"!==e&&"draggable"!==e&&"form"!==e&&("list"!==e||"INPUT"!==s.tagName)&&("type"!==e||"TEXTAREA"!==s.tagName)&&!(Es.test(e)&&N(t))&&e in s}(o,e,n,s))?function(a,e,t,n,o,s,r){if("innerHTML"===e||"textContent"===e)return n&&r(n,o,s),void(a[e]=null==t?"":t);if("value"===e&&"PROGRESS"!==a.tagName){a._value=t;var i=null==t?"":t;return a.value!==i&&(a.value=i),void(null==t&&a.removeAttribute(e))}if(""===t||null==t){var d=_typeof(a[e]);if("boolean"===d)return void(a[e]=Qe(t));if(null==t&&"string"===d)return a[e]="",void a.removeAttribute(e);if("number"===d){try{a[e]=0}catch(e){}return void a.removeAttribute(e)}}try{a[e]=t}catch(e){}}(o,e,n,i,d,l,a):("true-value"===e?o._trueValue=n:"false-value"===e&&(o._falseValue=n),function(o,e,t,n){if(n&&e.startsWith("xlink:"))null==t?o.removeAttributeNS("http://www.w3.org/1999/xlink",e.slice(6,e.length)):o.setAttributeNS("http://www.w3.org/1999/xlink",e,t);else{var s=$l(e);null==t||s&&!Qe(t)?o.removeAttribute(e):o.setAttribute(e,s?"":t)}}(o,e,n,s))}},{insert:function(o,e,t){e.insertBefore(o,t||null)},remove:function(n){var e=n.parentNode;e&&e.removeChild(n)},createElement:function(s,e,t,n){var o=e?fs.createElementNS("http://www.w3.org/2000/svg",s):fs.createElement(s,t?{is:t}:void 0);return"select"===s&&n&&null!=n.multiple&&o.setAttribute("multiple",n.multiple),o},createText:function(n){return fs.createTextNode(n)},createComment:function(n){return fs.createComment(n)},setText:function(n,e){n.nodeValue=e},setElementText:function(n,e){n.textContent=e},parentNode:function(n){return n.parentNode},nextSibling:function(n){return n.nextSibling},querySelector:function(n){return fs.querySelector(n)},setScopeId:function(n,e){n.setAttribute(e,"")},cloneNode:function(n){var e=n.cloneNode(!0);return"_value"in n&&(e._value=n._value),e},insertStaticContent:function(a,e,t,n){var o=t?t.previousSibling:e.lastChild,r=ds.get(a);if(!r){var i=fs.createElement("template");if(i.innerHTML=n?"<svg>".concat(a,"</svg>"):a,r=i.content,n){for(var d=r.firstChild;d.firstChild;)r.appendChild(d.firstChild);r.removeChild(d)}ds.set(a,r)}return e.insertBefore(r.cloneNode(!0),t),[o?o.nextSibling:e.firstChild,t?t.previousSibling:e.lastChild]}}),Ci=!1,Nc=function(){var e;(e=oi()).render.apply(e,arguments)},Ei=function(){var e;(e=ri()).hydrate.apply(e,arguments)},$i=Symbol(""),Oi=Symbol(""),Pi=Symbol(""),Ii=Symbol(""),Vi=Symbol(""),Bi=Symbol(""),Li=Symbol(""),ji=Symbol(""),Ui=Symbol(""),Hi=Symbol(""),Di=Symbol(""),Wi=Symbol(""),zi=Symbol(""),Ki=Symbol(""),Gi=Symbol(""),qi=Symbol(""),Ji=Symbol(""),Zi=Symbol(""),Qi=Symbol(""),Xi=Symbol(""),Yi=Symbol(""),el=Symbol(""),tl=Symbol(""),nl=Symbol(""),ol=Symbol(""),rl=Symbol(""),sl=Symbol(""),il=Symbol(""),ll=Symbol(""),cl=Symbol(""),al=Symbol(""),ul=Symbol(""),pl=Symbol(""),fl=Symbol(""),dl=Symbol(""),hl=Symbol(""),ml=Symbol(""),gl=Symbol(""),vl=Symbol(""),yl=Symbol(""),bl=(El={},_defineProperty(El,$i,"Fragment"),_defineProperty(El,Oi,"Teleport"),_defineProperty(El,Pi,"Suspense"),_defineProperty(El,Ii,"KeepAlive"),_defineProperty(El,Vi,"BaseTransition"),_defineProperty(El,Bi,"openBlock"),_defineProperty(El,Li,"createBlock"),_defineProperty(El,ji,"createElementBlock"),_defineProperty(El,Ui,"createVNode"),_defineProperty(El,Hi,"createElementVNode"),_defineProperty(El,Di,"createCommentVNode"),_defineProperty(El,Wi,"createTextVNode"),_defineProperty(El,zi,"createStaticVNode"),_defineProperty(El,Ki,"resolveComponent"),_defineProperty(El,Gi,"resolveDynamicComponent"),_defineProperty(El,qi,"resolveDirective"),_defineProperty(El,Ji,"resolveFilter"),_defineProperty(El,Zi,"withDirectives"),_defineProperty(El,Qi,"renderList"),_defineProperty(El,Xi,"renderSlot"),_defineProperty(El,Yi,"createSlots"),_defineProperty(El,el,"toDisplayString"),_defineProperty(El,tl,"mergeProps"),_defineProperty(El,nl,"normalizeClass"),_defineProperty(El,ol,"normalizeStyle"),_defineProperty(El,rl,"normalizeProps"),_defineProperty(El,sl,"guardReactiveProps"),_defineProperty(El,il,"toHandlers"),_defineProperty(El,ll,"camelize"),_defineProperty(El,cl,"capitalize"),_defineProperty(El,al,"toHandlerKey"),_defineProperty(El,ul,"setBlockTracking"),_defineProperty(El,pl,"pushScopeId"),_defineProperty(El,fl,"popScopeId"),_defineProperty(El,dl,"withScopeId"),_defineProperty(El,hl,"withCtx"),_defineProperty(El,ml,"unref"),_defineProperty(El,gl,"isRef"),_defineProperty(El,vl,"withMemo"),_defineProperty(El,yl,"isMemoSame"),El),_l={source:"",start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0}},Sl=function(n){return 4===n.type&&n.isStatic},Fl=function(n,e){return n===e||n===H(e)},Al=/^\d|[^\$\w]/,Ol=function(n){return!Al.test(n)},Pl=/[A-Za-z_$\xA0-\uFFFF]/,Il=/[\.\?\w$\xA0-\uFFFF]/,Vl=/\s+[.[]\s*|\s*[.[]\s+/g,Bl=function(a){a=a.trim().replace(Vl,function(n){return n.trim()});for(var i,d=0,l=[],n=0,c=0,p=null,u=0;u<a.length;u++)switch(i=a.charAt(u),d){case 0:if("["===i)l.push(d),d=1,n++;else if("("===i)l.push(d),d=2,c++;else if(!(0===u?Pl:Il).test(i))return!1;break;case 1:"'"===i||"\""===i||"`"===i?(l.push(d),d=3,p=i):"["===i?n++:"]"===i&&(--n||(d=l.pop()));break;case 2:if("'"===i||"\""===i||"`"===i)l.push(d),d=3,p=i;else if("("===i)c++;else if(")"===i){if(u===a.length-1)return!1;--c||(d=l.pop())}break;case 3:i===p&&(d=l.pop(),p=null);}return!n&&!c},Ll=new Set([rl,sl]),Xl=/&(gt|lt|amp|apos|quot);/g,oc={gt:">",lt:"<",amp:"&",apos:"'",quot:"\""},rc={delimiters:["{{","}}"],getNamespace:function(){return 0},getTextMode:function(){return 0},isVoidTag:m,isPreTag:m,isCustomElement:m,decodeEntities:function(n){return n.replace(Xl,function(n,e){return oc[e]})},onError:di,onWarn:li,comments:!1},sc=e("if,else,else-if,for,slot"),dc=new Set([nl,ol,rl,sl]),Ec=Gd(/^(if|else|else-if)$/,function(o,e,a){return function(s,e,t,n){if("else"===e.name||e.exp&&e.exp.content.trim()||(e.exp=xi("true",!1,e.exp?e.exp.loc:s.loc)),"if"===e.name){var o=kl(s,e),a={type:9,loc:s.loc,branches:[o]};if(t.replaceNode(a),n)return n(a,o,!0)}else for(var r,i=t.parent.children,d=i.indexOf(s);-1<=d--;){if(r=i[d],!r||2!==r.type||r.content.trim().length){if(r&&9===r.type){t.removeNode();var l=kl(s,e);r.branches.push(l);var c=n&&n(r,l,!1);zd(l,t),c&&c(),t.currentNode=null}break}t.removeNode(r)}}(o,e,a,function(n,e,t){for(var o=a.parent.children,r=o.indexOf(n),d=0;0<=r--;){var l=o[r];l&&9===l.type&&(d+=l.branches.length)}return function(){t?n.codegenNode=Tl(e,d,a):function(n){for(;;)if(19===n.type){if(19!==n.alternate.type)return n;n=n.alternate}else 20===n.type&&(n=n.value)}(n.codegenNode).alternate=Tl(e,d+n.branches.length-1,a)}})}),Rc=Gd("for",function(g,e,m){var n=m.helper,o=m.removeHelper;return function(d,e,t,n){if(e.exp){var o=ea(e.exp);if(o){var r=t.scopes,s=o.source,i=o.value,l=o.key,c=o.index,a={type:11,loc:e.loc,source:s,valueAlias:i,keyAlias:l,objectIndexAlias:c,parseResult:o,children:rd(d)?d.children:[d]};t.replaceNode(a),r.vFor++;var u=n&&n(a);return function(){r.vFor--,u&&u()}}}}(g,e,m,function(e){var t=Ti(n(Qi),[e.source]),s=nd(g,"memo"),r=td(g,"key"),i=r&&(6===r.type?xi(r.value.content,!0):r.exp),c=r?vi("key",i):null,a=4===e.source.type&&0<e.source.constType,d=a?64:r?128:256;return e.codegenNode=hi(m,n($i),void 0,t,d+"",void 0,void 0,!0,!a,!1,g.loc),function(){var r,u=rd(g),p=e.children,f=1!==p.length||1!==p[0].type,d=id(g)?g:u&&1===g.children.length&&id(g.children[0])?g.children[0]:null;if(d?(r=d.codegenNode,u&&c&&pd(r,c,m)):f?r=hi(m,n($i),c?mi([c]):void 0,g.children,"64",void 0,void 0,!0,void 0,!1):(r=p[0].codegenNode,u&&c&&pd(r,c,m),r.isBlock!==!a&&(r.isBlock?(o(Bi),o(ld(m.inSSR,r.isComponent))):o(dd(m.inSSR,r.isComponent))),r.isBlock=!a,r.isBlock?(n(Bi),n(ld(m.inSSR,r.isComponent))):n(dd(m.inSSR,r.isComponent))),s){var h=Ni(ia(e.parseResult,[xi("_cached")]));h.body={type:21,body:[Si(["const _memo = (",s.exp,")"]),Si(["if (_cached"].concat(_toConsumableArray(i?[" && _cached.key === ",i]:[]),[" && ".concat(m.helperString(yl),"(_cached, _memo)) return _cached")])),Si(["const _item = ",r]),xi("_item.memo = _memo"),xi("return _item")],loc:_l},t.arguments.push(h,xi("_cache"),xi(m.cached++ +""))}else t.arguments.push(Ni(ia(e.parseResult),r,!0))}})}),ta=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,na=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,oa=/^\(|\)$/g,ra=xi("undefined",!1),ca=function(n,e){if(1===n.type&&(1===n.tagType||3===n.tagType)){var t=nd(n,"slot");if(t)return e.scopes.vSlot++,function(){e.scopes.vSlot--}}},aa=function(o,e,t){return Ni(o,e,!1,!0,e.length?e[0].loc:t)},ua=new WeakMap,ma=function(h,g){return function(){if(1===(h=g.currentNode).type&&(0===h.tagType||1===h.tagType)){var e,t,m,y,v,_,b=h,x=b.tag,n=b.props,o=1===h.tagType,r=o?function(a,e){var t=!!(2<arguments.length&&void 0!==arguments[2])&&arguments[2],n=a.tag,d=ba(n),r=td(a,"is");if(r)if(d){var s=6===r.type?r.value&&xi(r.value.content,!0):r.exp;if(s)return Ti(e.helper(Gi),[s])}else 6===r.type&&r.value.content.startsWith("vue:")&&(n=r.value.content.slice(4));var c=!d&&nd(a,"is");if(c&&c.exp)return Ti(e.helper(Gi),[c.exp]);var i=Fi(n)||e.isBuiltInComponent(n);return i?(t||e.helper(i),i):(e.helper(Ki),e.components.add(n),ud(n,"component"))}(h,g):"\"".concat(x,"\""),s=0,C=R(r)&&r.callee===Gi||r===Oi||r===Pi||!o&&("svg"===x||"foreignObject"===x||td(h,"key",!0));if(0<n.length){var S=ha(h,g);e=S.props,s=S.patchFlag,v=S.dynamicPropNames;var k=S.directives;_=k&&k.length?gi(k.map(function(n){return function(s,e){var t=[],n=ua.get(s);n?t.push(e.helperString(n)):(e.helper(qi),e.directives.add(s.name),t.push(ud(s.name,"directive")));var o=s.loc;if(s.exp&&t.push(s.exp),s.arg&&(s.exp||t.push("void 0"),t.push(s.arg)),Object.keys(s.modifiers).length){s.arg||(s.exp||t.push("void 0"),t.push("void 0"));var a=xi("true",!1,o);t.push(mi(s.modifiers.map(function(n){return vi(n,a)}),o))}return gi(t,s.loc)}(n,g)})):void 0}if(0<h.children.length)if(r===Ii&&(C=!0,s|=1024),o&&r!==Oi&&r!==Ii){var T=la(h,g),w=T.slots,N=T.hasDynamicSlots;t=w,N&&(s|=1024)}else if(1===h.children.length&&r!==Oi){var E=h.children[0],I=E.type,P=5===I||8===I;P&&0===Ud(E,g)&&(s|=1),t=P||2===I?E:h.children}else t=h.children;0!==s&&(m=s+"",v&&v.length&&(y=function(n){for(var e="[",o=0,s=n.length;o<s;o++)e+=JSON.stringify(n[o]),o<s-1&&(e+=", ");return e+"]"}(v))),h.codegenNode=hi(g,r,e,t,m,y,_,!!C,!1,o,h.loc)}}},ga=function(n,e){if(id(n)){var t=n.children,o=n.loc,s=function(s,e){for(var t,a,i="\"default\"",d=[],r=0;r<s.props.length;r++)a=s.props[r],6===a.type?a.value&&("name"===a.name?i=JSON.stringify(a.value.content):(a.name=O(a.name),d.push(a))):"bind"===a.name&&od(a.arg,"name")?a.exp&&(i=a.exp):("bind"===a.name&&a.arg&&Sl(a.arg)&&(a.arg.content=O(a.arg.content)),d.push(a));if(0<d.length){var l=ha(s,e,d),c=l.props,p=l.directives;t=c}return{slotName:i,slotProps:t}}(n,e),a=s.slotName,r=s.slotProps,i=[e.prefixIdentifiers?"_ctx.$slots":"$slots",a];r&&i.push(r),t.length&&(r||i.push("{}"),i.push(Ni([],t,!1,!1,o))),e.scopeId&&!e.slotted&&(r||i.push("{}"),t.length||i.push("undefined"),i.push("true")),n.codegenNode=Ti(e.helper(Xi),i,o)}},Sa=/^\s*([\w$_]+|\([^)]*?\))\s*=>|^\s*function(?:\s+[\w$]+)?\s*\(/,xa=function(d,e,t,n){var o,p=d.loc,r=d.modifiers,s=d.arg;4===s.type?s.isStatic?o=xi(j(O(s.content)),!0,s.loc):o=Si(["".concat(t.helperString(al),"("),s,")"]):(o=s,o.children.unshift("".concat(t.helperString(al),"(")),o.children.push(")"));var i=d.exp;i&&!i.content.trim()&&(i=void 0);var h=t.cacheHandlers&&!i&&!t.inVOnce;if(i){var a=Bl(i.content),f=!(a||Sa.test(i.content)),g=i.content.includes(";");(f||h&&a)&&(i=Si(["".concat(f?"$event":"(...args)"," => ").concat(g?"{":"("),i,g?"}":")"]))}var m={props:[vi(o,i||xi("() => {}",!1,p))]};return n&&(m=n(m)),h&&(m.props[0].value=t.cache(m.props[0].value)),m.props.forEach(function(n){return n.key.isHandlerKey=!0}),m},Ca=function(a,e,t){var n=a.exp,o=a.modifiers,r=a.loc,s=a.arg;return 4===s.type?s.isStatic||(s.content="".concat(s.content," || \"\"")):(s.children.unshift("("),s.children.push(") || \"\"")),o.includes("camel")&&(4===s.type?s.content=s.isStatic?O(s.content):"".concat(t.helperString(ll),"(").concat(s.content,")"):(s.children.unshift("".concat(t.helperString(ll),"(")),s.children.push(")"))),t.inSSR||(o.includes("prop")&&wa(s,"."),o.includes("attr")&&wa(s,"^")),n&&(4!==n.type||n.content.trim())?{props:[vi(s,n)]}:{props:[vi(s,xi("",!0,r))]}},wa=function(n,e){4===n.type?n.content=n.isStatic?e+n.content:"`".concat(e,"${").concat(n.content,"}`"):(n.children.unshift("'".concat(e,"' + (")),n.children.push(")"))},ka=function(s,o){if(0===s.type||1===s.type||11===s.type||10===s.type)return function(){for(var e,t,a=s.children,n=!1,i=0;i<a.length;i++)if(t=a[i],sd(t)){n=!0;for(var d,l=i+1;l<a.length;l++){if(d=a[l],!sd(d)){e=void 0;break}e||(e=a[i]={type:8,loc:t.loc,children:[t]}),e.children.push(" + ",d),a.splice(l,1),l--}}if(n&&(1!==a.length||0!==s.type&&(1!==s.type||0!==s.tagType||s.props.find(function(n){return 7===n.type&&!o.directiveTransforms[n.name]}))))for(var c,p=0;p<a.length;p++)if(c=a[p],sd(c)||8===c.type){var u=[];2===c.type&&" "===c.content||u.push(c),o.ssr||0!==Ud(c,o)||u.push("1"),a[p]={type:12,content:c,loc:c.loc,codegenNode:Ti(o.helper(Wi),u)}}}},Ta=new WeakSet,Na=function(n,o){if(1===n.type&&nd(n,"once",!0))return Ta.has(n)||o.inVOnce?void 0:(Ta.add(n),o.inVOnce=!0,o.helper(ul),function(){o.inVOnce=!1;var n=o.currentNode;n.codegenNode&&(n.codegenNode=o.cache(n.codegenNode,!0))})},Ea=function(d,e,t){var n=d.exp,o=d.arg;if(!n)return _a();var r=n.loc.source,s=4===n.type?n.content:r;if(!s.trim()||!Bl(s))return _a();var i,p=o||xi("modelValue",!0),l=o?Sl(o)?"onUpdate:".concat(o.content):Si(["\"onUpdate:\" + ",o]):"onUpdate:modelValue";i=Si(["".concat(t.isTS?"($event: any)":"$event"," => ("),n," = $event)"]);var c=[vi(p,d.exp),vi(l,i)];if(d.modifiers.length&&1===e.tagType){var u=d.modifiers.map(function(n){return(Ol(n)?n:JSON.stringify(n))+": true"}).join(", "),h=o?Sl(o)?"".concat(o.content,"Modifiers"):Si([o," + \"Modifiers\""]):"modelModifiers";c.push(vi(h,xi("{ ".concat(u," }"),!1,d.loc,2)))}return _a(c)},$a=new WeakSet,Fa=function(n,e){if(1===n.type){var t=nd(n,"memo");return!t||$a.has(n)?void 0:($a.add(n),function(){var s=n.codegenNode||e.currentNode.codegenNode;s&&13===s.type&&(1!==n.tagType&&hd(s,e),n.codegenNode=Ti(e.helper(vl),[t.exp,Ni(void 0,s),"_cache",e.cached++ +""]))})}},Aa=Symbol(""),Oa=Symbol(""),Pa=Symbol(""),Ia=Symbol(""),Va=Symbol(""),Ba=Symbol(""),La=Symbol(""),ja=Symbol(""),Ua=Symbol(""),Ha=Symbol("");Sc=(Rl={},_defineProperty(Rl,Aa,"vModelRadio"),_defineProperty(Rl,Oa,"vModelCheckbox"),_defineProperty(Rl,Pa,"vModelText"),_defineProperty(Rl,Ia,"vModelSelect"),_defineProperty(Rl,Va,"vModelDynamic"),_defineProperty(Rl,Ba,"withModifiers"),_defineProperty(Rl,La,"withKeys"),_defineProperty(Rl,ja,"vShow"),_defineProperty(Rl,Ua,"Transition"),_defineProperty(Rl,Ha,"TransitionGroup"),Rl),Object.getOwnPropertySymbols(Sc).forEach(function(n){bl[n]=Sc[n]});var Da=e("style,iframe,script,noscript",!0),Ka={isVoidTag:p,isNativeTag:function(n){return i(n)||u(n)},isPreTag:function(n){return"pre"===n},decodeEntities:function(n){var e=!!(1<arguments.length&&arguments[1]!==void 0)&&arguments[1];return kc||(kc=document.createElement("div")),e?(kc.innerHTML="<div foo=\"".concat(n.replace(/"/g,"&quot;"),"\">"),kc.children[0].getAttribute("foo")):(kc.innerHTML=n,kc.textContent)},isBuiltInComponent:function(n){return Fl(n,"Transition")?Ua:Fl(n,"TransitionGroup")?Ha:void 0},getNamespace:function(o,e){var t=e?e.ns:0;if(!(e&&2===t))e&&1==t&&("foreignObject"!==e.tag&&"desc"!==e.tag&&"title"!==e.tag||(t=0));else if("annotation-xml"===e.tag){if("svg"===o)return 1;e.props.some(function(n){return 6===n.type&&"encoding"===n.name&&null!=n.value&&("text/html"===n.value.content||"application/xhtml+xml"===n.value.content)})&&(t=0)}else /^m(?:[ions]|text)$/.test(e.tag)&&"mglyph"!==o&&"malignmark"!==o&&(t=0);if(0===t){if("svg"===o)return 1;if("math"===o)return 2}return t},getTextMode:function(n){var o=n.tag,e=n.ns;if(0===e){if("textarea"===o||"title"===o)return 1;if(Da(o))return 2}return 0}},Ga=function(o,e){var t=s(o);return xi(JSON.stringify(t),!1,e,3)},qa=e("passive,once,capture"),Ja=e("stop,prevent,self,ctrl,shift,alt,meta,exact,middle"),Za=e("left,right"),Qa=e("onkeyup,onkeydown,onkeypress",!0),Xa=function(n,e){return Sl(n)&&"onclick"===n.content.toLowerCase()?xi(e,!0):4===n.type?n:Si(["(",n,") === \"onClick\" ? \"".concat(e,"\" : ("),n,")"])},Ya=function(n,e){1!==n.type||0!==n.tagType||"script"!==n.tag&&"style"!==n.tag||e.removeNode()},Ic=[function(o){1===o.type&&o.props.forEach(function(e,t){6===e.type&&"style"===e.name&&e.value&&(o.props[t]={type:7,name:"bind",arg:xi("style",!0,e.loc),exp:Ga(e.value.content,e.loc),modifiers:[],loc:e.loc})})}],Pc={cloak:function(){return{props:[]}},html:function(n,e){var t=n.exp,o=n.loc;return e.children.length&&(e.children.length=0),{props:[vi(xi("innerHTML",!0,o),t||xi("",!0))]}},text:function(s,e,t){var n=s.exp,o=s.loc;return e.children.length&&(e.children.length=0),{props:[vi(xi("textContent",!0),n?Ti(t.helperString(el),[n],o):xi("",!0))]}},model:function(a,e,t){var n=Ea(a,e,t);if(!n.props.length||1===e.tagType)return n;var o=e.tag,r=t.isCustomElement(o);if("input"===o||"textarea"===o||"select"===o||r){var s=Pa,i=!1;if("input"===o||r){var d=td(e,"type");if(!d)(function(n){return n.props.some(function(n){return!(7!==n.type||"bind"!==n.name||n.arg&&4===n.arg.type&&n.arg.isStatic)})})(e)&&(s=Va);else if(7===d.type)s=Va;else if(d.value)switch(d.value.content){case"radio":s=Aa;break;case"checkbox":s=Oa;break;case"file":i=!0;}}else"select"===o&&(s=Ia);i||(n.needRuntime=t.helper(s))}return n.props=n.props.filter(function(n){return 4!==n.key.type||"modelValue"!==n.key.content}),n},on:function(a,e,d){return xa(a,0,d,function(e){var n=a.modifiers;if(!n.length)return e;var t=e.props[0],o=t.key,p=t.value,u=function(n,e){for(var t,o=[],a=[],s=[],r=0;r<e.length;r++)t=e[r],qa(t)?s.push(t):Za(t)?Sl(n)?Qa(n.content)?o.push(t):a.push(t):(o.push(t),a.push(t)):Ja(t)?a.push(t):o.push(t);return{keyModifiers:o,nonKeyModifiers:a,eventOptionModifiers:s}}(o,n),h=u.keyModifiers,i=u.nonKeyModifiers,l=u.eventOptionModifiers;if(i.includes("right")&&(o=Xa(o,"onContextmenu")),i.includes("middle")&&(o=Xa(o,"onMouseup")),i.length&&(p=Ti(d.helper(Ba),[p,JSON.stringify(i)])),!h.length||Sl(o)&&!Qa(o.content)||(p=Ti(d.helper(La),[p,JSON.stringify(h)])),l.length){var c=l.map(D).join("");o=Sl(o)?xi("".concat(o.content).concat(c),!0):Si(["(",o,") + \"".concat(c,"\"")])}return{props:[vi(o,p)]}})},show:function(o,e,t){return{props:[],needRuntime:t.helper(ja)}}},Fc=Object.create(null);return _s(Ma),Re.$computed=function(){},Re.$fromRefs=function(){return null},Re.$raw=function(){return null},Re.$ref=function(){},Re.$shallowRef=function(n){return n},Re.BaseTransition=rn,Re.Comment=Ao,Re.EffectScope=q,Re.Fragment=Eo,Re.KeepAlive=gn,Re.ReactiveEffect=ce,Re.Static=Mo,Re.Suspense={name:"Suspense",__isSuspense:!0,process:function(d,e,t,n,o,r,s,i,l,c){null==d?function(d,e,t,n,o,r,s,i,l){var c=l.p,a=l.o.createElement,u=a("div"),p=d.suspense=qt(d,o,n,e,u,t,r,s,i,l);c(null,p.pendingBranch=d.ssContent,u,null,n,p,r,s),0<p.deps?(Gt(d,"onPending"),Gt(d,"onFallback"),c(null,d.ssFallback,e,t,n,null,r,s),Xt(p,d.ssFallback)):p.resolve()}(e,t,n,o,r,s,i,l,c):function(y,e,t,n,o,r,s,i,l){var _=l.p,c=l.um,a=l.o.createElement,u=e.suspense=y.suspense;u.vnode=e,e.el=y.el;var p=e.ssContent,f=e.ssFallback,d=u.activeBranch,h=u.pendingBranch,m=u.isInFallback,g=u.isHydrating;if(h)u.pendingBranch=p,Uo(p,h)?(_(h,p,u.hiddenContainer,null,o,u,r,s,i),0>=u.deps?u.resolve():m&&(_(d,f,t,n,o,null,r,s,i),Xt(u,f))):(u.pendingId++,g?(u.isHydrating=!1,u.activeBranch=h):c(h,o,u),u.deps=0,u.effects.length=0,u.hiddenContainer=a("div"),m?(_(null,p,u.hiddenContainer,null,o,u,r,s,i),0>=u.deps?u.resolve():(_(d,f,t,n,o,null,r,s,i),Xt(u,f))):d&&Uo(p,d)?(_(d,p,t,n,o,u,r,s,i),u.resolve(!0)):(_(null,p,u.hiddenContainer,null,o,u,r,s,i),0>=u.deps&&u.resolve()));else if(d&&Uo(p,d))_(d,p,t,n,o,u,r,s,i),Xt(u,p);else if(Gt(e,"onPending"),u.pendingBranch=p,u.pendingId++,_(null,p,u.hiddenContainer,null,o,u,r,s,i),0>=u.deps)u.resolve();else{var v=u.timeout,b=u.pendingId;0<v?setTimeout(function(){u.pendingId===b&&u.fallback(f)},v):0===v&&u.fallback(f)}}(d,e,t,n,o,s,i,l,c)},hydrate:function(d,e,t,n,o,r,s,i,l){var c=e.suspense=qt(e,n,t,d.parentNode,document.createElement("div"),null,o,r,s,i,!0),a=l(d,c.pendingBranch=e.ssContent,t,c,r,s);return 0===c.deps&&c.resolve(),a},create:qt,normalize:function(s){var e=s.shapeFlag,t=s.children,n=32&e;s.ssContent=Jt(n?t["default"]:t),s.ssFallback=n?Jt(t.fallback):Go(Comment)}},Re.Teleport={__isTeleport:!0,process:function(_,e,t,n,o,r,s,x,l,c){var a=c.mc,u=c.pc,p=c.pbc,f=c.o,C=f.insert,d=f.querySelector,h=f.createText,m=mo(e.props),g=e.shapeFlag,v=e.children,y=e.dynamicChildren;if(null==_){var b=e.el=h(""),S=e.anchor=h("");C(b,t,n),C(S,t,n);var k=e.target=Co(e.props,d),T=e.targetAnchor=h("");k&&(C(T,k),s=s||xo(k));var w=function(n,e){16&g&&a(v,n,e,o,r,s,x,l)};m?w(t,S):k&&w(k,T)}else{e.el=_.el;var N=e.anchor=_.anchor,E=e.target=_.target,R=e.targetAnchor=_.targetAnchor,I=mo(_.props),P=I?t:E,F=I?N:R;if(s=s||xo(E),y?(p(_.dynamicChildren,y,P,o,r,s,x),vo(_,e,!0)):l||u(_,e,P,F,o,r,s,x,!1),m)I||_o(e,t,N,c,1);else if((e.props&&e.props.to)!==(_.props&&_.props.to)){var A=e.target=Co(e.props,d);A&&_o(e,A,null,c,0)}else I&&_o(e,E,R,c,1)}},remove:function(d,e,t,n,o,h){var i=o.um,r=o.o.remove,s=d.shapeFlag,l=d.children,c=d.anchor,a=d.targetAnchor,u=d.target,p=d.props;if(u&&r(a),(h||!mo(p))&&(r(c),16&s))for(var f,g=0;g<l.length;g++)f=l[g],i(f,e,t,!0,!!f.dynamicChildren)},move:_o,hydrate:function(d,e,t,n,o,r,s,p){var a=s.o,h=a.nextSibling,i=a.parentNode,l=a.querySelector,c=e.target=Co(e.props,l);if(c){var u=c._lpa||c.firstChild;16&e.shapeFlag&&(mo(e.props)?(e.anchor=p(h(d),e,i(d),t,n,o,r),e.targetAnchor=u):(e.anchor=h(d),e.targetAnchor=p(u,e,c,t,n,o,r)),c._lpa=e.targetAnchor&&h(e.targetAnchor))}return e.anchor&&h(e.anchor)}},Re.Text=Fo,Re.Transition=As,Re.TransitionGroup=ei,Re.VueElement=Fs,Re.callWithAsyncErrorHandling=_r,Re.callWithErrorHandling=yr,Re.camelize=O,Re.capitalize=D,Re.cloneVNode=jo,Re.compatUtils=null,Re.compile=Ma,Re.computed=Rt,Re.createApp=function(){var e,a=(e=oi()).createApp.apply(e,arguments),t=a.mount;return a.mount=function(n){var e=ii(n);if(e){var o=a._component;w(o)||o.render||o.template||(o.template=e.innerHTML),e.innerHTML="";var r=t(e,!1,e instanceof SVGElement);return e instanceof Element&&(e.removeAttribute("v-cloak"),e.setAttribute("data-v-app","")),r}},a},Re.createBlock=Vo,Re.createCommentVNode=function(){var n=0<arguments.length&&arguments[0]!==void 0?arguments[0]:"",e=!!(1<arguments.length&&arguments[1]!==void 0)&&arguments[1];return e?(ko(),Vo(Ao,null,n)):Go(Ao,null,n)},Re.createElementBlock=function(a,e,t,n,o,r){return Ro(Ho(a,e,t,n,o,r,!0))},Re.createElementVNode=Ho,Re.createHydrationRenderer=lo,Re.createRenderer=io,Re.createSSRApp=function(){var e,o=(e=ri()).createApp.apply(e,arguments),s=o.mount;return o.mount=function(n){var e=ii(n);if(e)return s(e,!0,e instanceof SVGElement)},o},Re.createSlots=function(n,e){for(var t,o=0;o<e.length;o++)if(t=e[o],Gl(t))for(var s=0;s<t.length;s++)n[t[s].name]=t[s].fn;else t&&(n[t.name]=t.fn);return n},Re.createStaticVNode=function(o,e){var t=Go(Mo,null,o);return t.staticCount=e,t},Re.createTextVNode=$o,Re.createVNode=Go,Re.customRef=function(n){return new $t(n)},Re.defineAsyncComponent=function(i){w(i)&&(i={loader:i});var d,h=i,f=h.loader,t=h.loadingComponent,n=h.errorComponent,o=h.delay,g=void 0===o?200:o,r=h.timeout,s=h.suspensible,m=h.onError,l=null,y=0,v=function n(){var o;return l||(o=l=f()["catch"](function(o){if(o=o instanceof Error?o:new Error(o+""),m)return new Promise(function(e,t){m(o,function(){return e((y++,l=null,n()))},function(){return t(o)},y+1)});throw o}).then(function(e){return o!==l&&l?l:(e&&(e.__esModule||"Module"===e[Symbol.toStringTag])&&(e=e["default"]),d=e,e)}))};return fn({name:"AsyncComponentWrapper",__asyncLoader:v,get __asyncResolved(){return d},setup:function(){var o=ac;if(d)return function(){return dn(d,o)};var a=function(e){l=null,br(e,o,13,!n)};if((!(void 0!==s)||s)&&o.suspense)return v().then(function(e){return function(){return dn(e,o)}})["catch"](function(t){return a(t),function(){return n?Go(n,{error:t}):null}});var e=St(!1),i=St(),c=St(!!g);return g&&setTimeout(function(){c.value=!1},g),null!=r&&setTimeout(function(){if(!e.value&&!i.value){var n=new Error("Async component timed out after ".concat(r,"ms."));a(n),i.value=n}},r),v().then(function(){e.value=!0,o.parent&&hn(o.parent.vnode)&&Sr(o.parent.update)})["catch"](function(n){a(n),i.value=n}),function(){return e.value&&d?dn(d,o):i.value&&n?Go(n,{error:i.value}):t&&!c.value?Go(t):void 0}}})},Re.defineComponent=fn,Re.defineCustomElement=Ns,Re.defineEmits=function(){return null},Re.defineExpose=function(){},Re.defineProps=function(){return null},Re.defineSSRCustomElement=function(n){return Ns(n,Ei)},Re.effect=function(s,a){s.effect&&(s=s.effect.fn);var t=new ce(s);a&&(zl(t,a),a.scope&&h(t,a.scope)),a&&a.lazy||t.run();var n=t.run.bind(t);return n.effect=t,n},Re.effectScope=function(n){return new q(n)},Re.getCurrentInstance=ic,Re.getCurrentScope=function(){return Ml},Re.getTransitionRawChildren=pn,Re.guardReactiveProps=Do,Re.h=cs,Re.handleError=br,Re.hydrate=Ei,Re.initCustomFormatter=function(){},Re.inject=tn,Re.isMemoSame=as,Re.isProxy=mt,Re.isReactive=ft,Re.isReadonly=gt,Re.isRef=xt,Re.isRuntimeOnly=function(){return!Hl},Re.isVNode=Bo,Re.markRaw=vt,Re.mergeDefaults=function(n,e){for(var t in e){var o=n[t];o?o["default"]=e[t]:null===o&&(n[t]={default:e[t]})}return n},Re.mergeProps=Xo,Re.nextTick=xr,Re.normalizeClass=c,Re.normalizeProps=function(o){if(!o)return null;var e=o["class"],t=o.style;return e&&!N(e)&&(o["class"]=c(e)),t&&(o.style=r(t)),o},Re.normalizeStyle=r,Re.onActivated=yn,Re.onBeforeMount=Tn,Re.onBeforeUnmount=Rn,Re.onBeforeUpdate=En,Re.onDeactivated=bn,Re.onErrorCaptured=kn,Re.onMounted=Nn,Re.onRenderTracked=On,Re.onRenderTriggered=Mn,Re.onScopeDispose=function(n){Ml&&Ml.cleanups.push(n)},Re.onServerPrefetch=An,Re.onUnmounted=Fn,Re.onUpdated=$n,Re.openBlock=ko,Re.popScopeId=function(){Jl=null},Re.provide=en,Re.proxyRefs=Nt,Re.pushScopeId=function(n){Jl=n},Re.queuePostFlushCb=Nr,Re.reactive=nt,Re.readonly=dt,Re.ref=St,Re.registerRuntimeCompiler=_s,Re.render=Nc,Re.renderList=function(a,i,e,n){var t,o=e&&e[n];if(Gl(a)||N(a)){t=Array(a.length);for(var s=0,d=a.length;s<d;s++)t[s]=i(a[s],s,void 0,o&&o[s])}else if("number"==typeof a){t=Array(a);for(var l=0;l<a;l++)t[l]=i(l+1,l,void 0,o&&o[l])}else if(!R(a))t=[];else if(a[Symbol.iterator])t=Array.from(a,function(t,e){return i(t,e,void 0,o&&o[e])});else{var c=Object.keys(a);t=Array(c.length);for(var p,u=0,h=c.length;u<h;u++)p=c[u],t[u]=i(a[p],p,u,o&&o[u])}return e&&(e[n]=t),t},Re.renderSlot=function(a,e){var t=2<arguments.length&&arguments[2]!==void 0?arguments[2]:{},n=3<arguments.length?arguments[3]:void 0,o=4<arguments.length?arguments[4]:void 0;if(Ot.isCE)return Go("slot","default"===e?null:{name:e},n&&n());var r=a[e];r&&r._c&&(r._d=!1),ko();var s=r&&Yo(r(t)),i=Vo(Eo,{key:t.key||"_".concat(e)},s||(n?n():[]),s&&1===a._?64:-2);return!o&&i.scopeId&&(i.slotScopeIds=[i.scopeId+"-s"]),r&&r._c&&(r._d=!0),i},Re.resolveComponent=function(n,e){return bo("components",n,!0,e)||n},Re.resolveDirective=function(n){return bo("directives",n)},Re.resolveDynamicComponent=function(n){return N(n)?bo("components",n,!1)||n:n||wo},Re.resolveFilter=null,Re.resolveTransitionHooks=ln,Re.setBlockTracking=No,Re.setDevtoolsHook=function(e){Re.devtools=e},Re.setTransitionHooks=un,Re.shallowReactive=pt,Re.shallowReadonly=function(n){return ht(n,!0,Pe,st,at)},Re.shallowRef=function(n){return kt(n,!0)},Re.ssrContextKey=ns,Re.ssrUtils=null,Re.stop=function(n){n.effect.stop()},Re.toDisplayString=function(n){return null==n?"":Gl(n)||R(n)&&(n.toString===P||!w(n.toString))?JSON.stringify(n,f,2):n+""},Re.toHandlerKey=j,Re.toHandlers=function(n){var e={};for(var t in n)e[j(t)]=n[t];return e},Re.toRaw=yt,Re.toRef=Et,Re.toRefs=function(n){var e=Gl(n)?Array(n.length):{};for(var t in n)e[t]=Et(n,t);return e},Re.transformVNodeArgs=function(){},Re.triggerRef=function(n){bt(n)},Re.unref=wt,Re.useAttrs=function(){return ls().attrs},Re.useCssModule=function(){0<arguments.length&&arguments[0]!==void 0?arguments[0]:"$style";return Kl},Re.useCssVars=function(o){var s=ic();if(s){var t=function(){return Rs(s.subTree,o(s.proxy))};es(t),Nn(function(){var n=new MutationObserver(t);n.observe(s.subTree.el.parentNode,{childList:!0}),Fn(function(){return n.disconnect()})})}},Re.useSSRContext=function(){},Re.useSlots=function(){return ls().slots},Re.useTransitionState=nn,Re.vModelCheckbox=ci,Re.vModelDynamic={created:function(o,e,t){Zr(o,e,t,null,"created")},mounted:function(o,e,t){Zr(o,e,t,null,"mounted")},beforeUpdate:function(s,e,t,n){Zr(s,e,t,n,"beforeUpdate")},updated:function(s,e,t,n){Zr(s,e,t,n,"updated")}},Re.vModelRadio=ai,Re.vModelSelect=pi,Re.vModelText=si,Re.vShow={beforeMount:function(o,e,s){var a=e.value,t=s.transition;o._vod="none"===o.style.display?"":o.style.display,t&&a?t.beforeEnter(o):ni(o,a)},mounted:function(o,e,s){var a=e.value,t=s.transition;t&&a&&t.enter(o)},updated:function(s,e,a){var r=e.value,t=e.oldValue,n=a.transition;!r!=!t&&(n?r?(n.beforeEnter(s),ni(s,!0),n.enter(s)):n.leave(s,function(){ni(s,!1)}):ni(s,r))},beforeUnmount:function(n,e){var o=e.value;ni(n,o)}},Re.version="3.2.4",Re.warn=function(s){te();for(var a=Cr.length?Cr[Cr.length-1].component:null,e=a&&a.appContext.config.warnHandler,n=function(){var n=Cr[Cr.length-1];if(!n)return[];for(var o=[];n;){var t=o[0];t&&t.vnode===n?t.recurseCount++:o.push({vnode:n,recurseCount:0});var s=n.component&&n.component.parent;n=s&&s.vnode}return o}(),o=arguments.length,r=Array(1<o?o-1:0),t=1;t<o;t++)r[t-1]=arguments[t];if(e)yr(e,a,11,[s+r.join(""),a&&a.proxy,n.map(function(n){var t=n.vnode;return"at <".concat(tr(a,t.type),">")}).join("\n"),n]);else{var i,d=["[Vue warn]: ".concat(s)].concat(r);n.length&&d.push.apply(d,["\n"].concat(_toConsumableArray(function(n){var o=[];return n.forEach(function(t,e){o.push.apply(o,_toConsumableArray(0===e?[]:["\n"]).concat(_toConsumableArray(function(s){var a=s.vnode,e=s.recurseCount,t=0<e?"... (".concat(e," recursive calls)"):"",n=" at <".concat(tr(a.component,a.type,!!a.component&&null==a.component.parent)),o=">"+t;return a.props?[n].concat(_toConsumableArray(or(a.props)),[o]):[n+o]}(t))))}),o}(n)))),(i=console).warn.apply(i,_toConsumableArray(d))}de()},Re.watch=ts,Re.watchEffect=function(n,e){return os(n,null,e)},Re.watchPostEffect=es,Re.watchSyncEffect=function(n){return os(n,null,{flush:"sync"})},Re.withAsyncContext=function(o){var s=ic(),e=o();return fr(),F(e)&&(e=e["catch"](function(n){throw pr(s),n})),[e,function(){return pr(s)}]},Re.withCtx=Bt,Re.withDefaults=function(){return null},Re.withDirectives=function(s,e){if(null===Ot)return s;for(var t=Ot.proxy,n=s.dirs||(s.dirs=[]),o=0;o<e.length;o++){var a=_slicedToArray(e[o],4),r=a[0],i=a[1],d=a[2],l=a[3],c=void 0===l?Kl:l;w(r)&&(r={mounted:r,updated:r}),r.deep&&is(i),n.push({dir:r,instance:t,value:i,oldValue:void 0,arg:d,modifiers:c})}return s},Re.withKeys=function(s,e){return function(t){if("key"in t){var n=H(t.key);return e.some(function(t){return t===n||bi[t]===n})?s(t):void 0}}},Re.withMemo=function(a,e,t,n){var o=t[n];if(o&&as(o,a))return o;var r=e();return r.memo=a.slice(),t[n]=r},Re.withModifiers=function(s,e){return function(t){for(var n,a=0;a<e.length;a++)if(n=yi[e[a]],n&&n(t,e))return;for(var r=arguments.length,i=Array(1<r?r-1:0),o=1;o<r;o++)i[o-1]=arguments[o];return s.apply(void 0,[t].concat(i))}},Re.withScopeId=function(){return Bt},Object.defineProperty(Re,"__esModule",{value:!0}),Re}({});
+window.module&&(module.exports=Vue);
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/package.json" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/package.json"
new file mode 100644
index 0000000000000000000000000000000000000000..61e5221b76f154c4c28a79646d0524966c195275
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/package.json"
@@ -0,0 +1,44 @@
+{
+  "name": "ccc-references-finder",
+  "version": "1.3.0.20210929",
+  "description": "一键查找资源的所有引用,可精确到预制体或场景中的节点、组件和属性(不包括代码中的动态引用)。",
+  "author": {
+    "name": "陈皮皮 (ifaswind)",
+    "email": "952157129@qq.com",
+    "url": "https://chenpipi.cn",
+    "wechat": "im_chenpipi",
+    "git-home": "https://gitee.com/ifaswind",
+    "official-account": "公众号「菜鸟小栈」"
+  },
+  "repository": "https://gitee.com/ifaswind/ccc-references-finder",
+  "license": "MIT",
+  "main": "src/main/index.js",
+  "main-menu": {
+    "i18n:MAIN_MENU.package.title/i18n:ccc-references-finder.name/i18n:ccc-references-finder.find": {
+      "message": "ccc-references-finder:find-current-selection",
+      "icon": "/images/search.png",
+      "accelerator": "F6"
+    },
+    "i18n:MAIN_MENU.package.title/i18n:ccc-references-finder.name/i18n:ccc-references-finder.settings": {
+      "message": "ccc-references-finder:open-settings-panel",
+      "icon": "/images/settings.png"
+    },
+    "i18n:MAIN_MENU.package.title/i18n:ccc-references-finder.name/i18n:ccc-references-finder.check-update": {
+      "message": "ccc-references-finder:menu-check-update",
+      "icon": "/images/update.png"
+    },
+    "i18n:MAIN_MENU.package.title/i18n:ccc-references-finder.name/v1.3.0.20210929": {
+      "message": "ccc-references-finder:menu-version",
+      "icon": "/images/version.png"
+    }
+  },
+  "reload": {
+    "renderer": [],
+    "ignore": [
+      "config.json",
+      "CHANGELOG.md",
+      "README.md",
+      "README.en.md"
+    ]
+  }
+}
\ No newline at end of file
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/common/config-manager.js" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/common/config-manager.js"
new file mode 100644
index 0000000000000000000000000000000000000000..bd31314c6453d4cce66d61c424119920a13f0c25
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/common/config-manager.js"
@@ -0,0 +1,104 @@
+const Path = require('path');
+const Fs = require('fs');
+const PackageUtil = require('../eazax/package-util');
+
+/** 配置文件路径 */
+const CONFIG_PATH = Path.join(__dirname, '../../config.json');
+
+/** package.json 的路径 */
+const PACKAGE_PATH = Path.join(__dirname, '../../package.json');
+
+/** 包名 */
+const PACKAGE_NAME = PackageUtil.name;
+
+/** 快捷键行为 */
+const ACTION_NAME = 'find';
+
+/** package.json 中的菜单项 key */
+const MENU_ITEM_KEY = `i18n:MAIN_MENU.package.title/i18n:${PACKAGE_NAME}.name/i18n:${PACKAGE_NAME}.${ACTION_NAME}`;
+
+/**
+ * 配置管理器
+ */
+const ConfigManager = {
+
+    /**
+     * 默认配置
+     */
+    get defaultConfig() {
+        return {
+            version: '1.1',
+            printDetails: true,
+            printFolding: true,
+            autoCheckUpdate: true,
+        };
+    },
+
+    /**
+     * 读取配置
+     */
+    get() {
+        // 配置
+        const config = ConfigManager.defaultConfig;
+        if (Fs.existsSync(CONFIG_PATH)) {
+            const localConfig = JSON.parse(Fs.readFileSync(CONFIG_PATH));
+            for (const key in config) {
+                if (localConfig[key] !== undefined) {
+                    config[key] = localConfig[key];
+                }
+            }
+        }
+
+        // 快捷键
+        config.hotkey = ConfigManager.getAccelerator();
+
+        // Done
+        return config;
+    },
+
+    /**
+     * 保存配置
+     * @param {*} value 配置
+     */
+    set(value) {
+        // 配置
+        const config = ConfigManager.defaultConfig;
+        for (const key in config) {
+            if (value[key] !== undefined) {
+                config[key] = value[key];
+            }
+        }
+        Fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));
+
+        // 快捷键
+        ConfigManager.setAccelerator(value.hotkey);
+    },
+
+    /**
+     * 获取快捷键
+     * @returns {string}
+     */
+    getAccelerator() {
+        const package = JSON.parse(Fs.readFileSync(PACKAGE_PATH)),
+            item = package['main-menu'][MENU_ITEM_KEY];
+        return item['accelerator'] || '';
+    },
+
+    /**
+     * 设置快捷键
+     * @param {string} value 
+     */
+    setAccelerator(value) {
+        const package = JSON.parse(Fs.readFileSync(PACKAGE_PATH)),
+            item = package['main-menu'][MENU_ITEM_KEY];
+        if (value != undefined && value !== '') {
+            item['accelerator'] = value;
+        } else {
+            delete item['accelerator'];
+        }
+        Fs.writeFileSync(PACKAGE_PATH, JSON.stringify(package, null, 2));
+    },
+
+};
+
+module.exports = ConfigManager;
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/browser-util.js" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/browser-util.js"
new file mode 100644
index 0000000000000000000000000000000000000000..f3af1a0876e39046cfb2528a8d2709082412a71d
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/browser-util.js"
@@ -0,0 +1,61 @@
+/**
+ * 浏览器工具
+ * @author 陈皮皮 (ifaswind)
+ * @version 20210729
+ */
+const BrowserUtil = {
+
+    /**
+     * 获取当前 Url 中的参数
+     * @param {string} key é”®
+     * @returns {string}
+     */
+    getUrlParam(key) {
+        if (!window || !window.location) {
+            return null;
+        }
+        const query = window.location.search.replace('?', '');
+        if (query === '') {
+            return null;
+        }
+        const substrings = query.split('&');
+        for (let i = 0; i < substrings.length; i++) {
+            const keyValue = substrings[i].split('=');
+            if (decodeURIComponent(keyValue[0]) === key) {
+                return decodeURIComponent(keyValue[1]);
+            }
+        }
+        return null;
+    },
+
+    /**
+     * 获取 Cookie 值
+     * @param {string} key é”®
+     * @returns {string}
+     */
+    getCookie(key) {
+        const regExp = new RegExp(`(^| )${key}=([^;]*)(;|$)`),
+            values = document.cookie.match(regExp);
+        if (values !== null) {
+            return values[2];
+        }
+        return null;
+    },
+
+    /**
+     * 设置 Cookie
+     * @param {string} key é”®
+     * @param {string | number | boolean} value 值
+     * @param {string} expires 过期时间(GMT)
+     */
+    setCookie(key, value, expires) {
+        let keyValues = `${key}=${encodeURIComponent(value)};`;
+        if (expires) {
+            keyValues += `expires=${expires};`;
+        }
+        document.cookie = keyValues;
+    },
+
+};
+
+module.exports = BrowserUtil;
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/color-util.js" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/color-util.js"
new file mode 100644
index 0000000000000000000000000000000000000000..ddd4f98f4e43a5576fde2a7e3d8bd3af917925cd
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/color-util.js"
@@ -0,0 +1,37 @@
+/**
+ * 颜色工具
+ * @author 陈皮皮 (ifaswind)
+ * @version 20210725
+ */
+const ColorUtil = {
+
+    /**
+     * 将十六进制颜色值转为 RGB 格式
+     * @param {string} hex 
+     * @returns {{ r: number, g: number, b: number }}
+     */
+    hexToRGB(hex) {
+        // 是否为 HEX 格式
+        const regExp = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
+        if (!regExp.test(hex)) {
+            return null;
+        }
+        // 四位
+        if (hex.length === 4) {
+            const r = hex.slice(1, 2),
+                g = hex.slice(2, 3),
+                b = hex.slice(3, 4);
+            hex = `#${r}${r}${g}${g}${b}${b}`;
+        }
+        // 转换进制
+        const rgb = {
+            r: parseInt(`0x${hex.slice(1, 3)}`),
+            g: parseInt(`0x${hex.slice(3, 5)}`),
+            b: parseInt(`0x${hex.slice(5, 7)}`),
+        }
+        return rgb;
+    },
+
+};
+
+module.exports = ColorUtil;
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/css/cocos-class.css" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/css/cocos-class.css"
new file mode 100644
index 0000000000000000000000000000000000000000..4ea03b1d64c4c1128aab71fd825da0f36bfe1eb7
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/css/cocos-class.css"
@@ -0,0 +1,201 @@
+/* 
+  Cocos Creator 风格样式
+  版本: 20210911
+  作者: 陈皮皮 (ifaswind)
+  主页: https://gitee.com/ifaswind
+  公众号: 菜鸟小栈
+*/
+
+/* 属性容器 */
+.properties {
+  width: 100%;
+  border: 1px solid #666;
+  border-radius: 3px;
+  padding: 5px;
+  box-sizing: border-box;
+  outline: 0;
+  display: flex;
+  flex-direction: column;
+  overflow: auto;
+}
+
+.properties > * {
+  margin: 2px 0;
+}
+
+.properties:first-child {
+  margin-top: 0;
+}
+
+.properties:last-child {
+  margin-bottom: 0;
+}
+
+/* 属性 */
+.property {
+  width: 100%;
+  min-height: 23px;
+  box-sizing: border-box;
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: center;
+  justify-content: flex-start;
+}
+
+/* 属性标签 */
+.property > .label {
+  width: 38%;
+  min-width: 70px;
+  position: relative;
+  margin-left: 5px;
+  line-height: 23px;
+  font-size: 12px;
+  white-space: nowrap;
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  flex-shrink: 0;
+  align-items: baseline;
+  justify-content: flex-start;
+}
+
+/* 属性标签文本:虚指 */
+.property:hover > .label > .text {
+  color: #09f;
+}
+
+/* 属性标签文本:聚焦内部 */
+.property:focus-within > .label > .text {
+  color: #fd942b;
+}
+
+/* 属性标签内容:聚焦内部 */
+.property:focus-within > .content > * {
+  border-color: #fd942b;
+}
+
+/* tooltip */
+.tooltip {
+  background-color: #333333;
+  padding: 5px 8px;
+  border: 1px solid #646464;
+  border-radius: 4px;
+  position: absolute;
+  top: -38px;
+  left: -5px;
+  visibility: hidden;
+  text-align: center;
+  z-index: 2;
+}
+
+/* tooltip 三角形 */
+.tooltip::before,
+.tooltip::after {
+  content: '';
+  display: block;
+  width: 0;
+  height: 0;
+  border: 6px solid transparent;
+  position: absolute;
+  left: 10px;
+  transform: rotate(-90deg);
+}
+
+/* tooltip 三角形 */
+.tooltip::before {
+  border-right: 6px solid #333333;
+  top: 100%;
+}
+
+/* tooltip 三角形边框 */
+.tooltip::after {
+  border-right: 6px solid #646464;
+  top: calc(100% + 1px);
+  z-index: -1;
+}
+
+/* 前一个元素虚指时的 tooltip */
+*:hover + .tooltip {
+  visibility: visible;
+}
+
+/* 属性内容 */
+.property > .content {
+  display: flex;
+  flex: 1;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: center;
+  justify-content: flex-start;
+}
+
+.property > .content > * {
+  width: auto;
+  min-width: 20px;
+  height: 21px;
+  flex: 1;
+}
+
+.property > .content > *:focus {
+  border-color: #fd942b;
+}
+
+/* 提示 */
+.tip {
+  width: 100%;
+  min-height: 45px;
+  background: #333;
+  border: 1px solid #666;
+  border-radius: 3px;
+  padding: 12px 8px;
+  box-sizing: border-box;
+  display: flex;
+  align-items: center;
+  justify-content: left;
+  color: #bdbdbd;
+  line-height: 17px;
+  font-size: 13px;
+  white-space: pre-line;
+}
+
+.tip > * {
+  display: inline-block;
+}
+
+/* *::滚动条 */
+*::-webkit-scrollbar {
+  width: 11px;
+}
+
+/* *::滚动条-按钮 */
+*::-webkit-scrollbar-button {
+  display: none;
+}
+
+/* *::滚动条-横竖交汇处 */
+*::-webkit-scrollbar-corner {
+  display: none;
+}
+
+/* *::滚动条-轨道 */
+*::-webkit-scrollbar-track {
+  /* background: rgba(0, 0, 0, 0.5); */
+  background: none !important;
+  background-clip: content-box;
+  border: 5px solid transparent;
+}
+
+/* *::滚动条-滑块 */
+*::-webkit-scrollbar-thumb {
+  background: #7d7d7d;
+  background-clip: content-box;
+  border: 4px solid transparent;
+  border-radius: 6px;
+}
+
+/* *::滚动条-滑块:虚指 */
+*::-webkit-scrollbar-thumb:hover {
+  background-color: #fd942b;
+  border: 3px solid transparent;
+}
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/css/cocos-tag.css" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/css/cocos-tag.css"
new file mode 100644
index 0000000000000000000000000000000000000000..ed85581e79ec4c2415d58945afd440b047d29ca1
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/css/cocos-tag.css"
@@ -0,0 +1,197 @@
+/* 
+  Cocos Creator 风格标签 (橙黑)
+  版本: 20210725
+  作者: 陈皮皮 (ifaswind)
+  主页: https://gitee.com/ifaswind
+  公众号: 菜鸟小栈
+*/
+
+/* 下拉选择器 */
+select {
+  background-color: #262626;
+  outline: none;
+  box-sizing: border-box;
+  border: 1px solid #171717;
+  border-radius: 100px;
+  padding: 0 8px;
+  font-size: 12px;
+  color: #bdbdbd;
+  cursor: pointer;
+  /* 替换默认的箭头 */
+  appearance: none;
+  -webkit-appearance: none;
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAA+ElEQVRYR+2VXw6CMAzGV3YUjSZ6CsI4l3gutnALH/xzEB8spokSQphbiwkv5RHafb9+awuYlR9YWd8ogDqgDqgDPx3w3h8A4FlV1UOysLz3O2stlmV5j+VHAbqu2yLijRIR8VzXdcOBaNu2KYriRDl93x+dc5e5/ChACGFjjBnIORBj8Q/A3jl3ZQFQcAiBKhgqz4GYiqdyklPAgeCKU5FJgFwnJOLZACkIqTgLgILnhOj9t9slE5N1BePunUKMv6Uajj0Fsbmfg5CIs68g5oRUfBEAJdOqBYCXdFUvBuCsZva/4B+H55zBnoKcQzkxCqAOqAOrO/AGwnWWIa30xvoAAAAASUVORK5CYII=);
+  background-size: 16px;
+  background-repeat: no-repeat;
+  background-position: right 3px center;
+}
+
+/* 下拉选择器:虚指 */
+select:hover {
+  border-color: #888888;
+}
+
+/* 输入框,文本区域 */
+input,
+textarea {
+  background-color: #262626;
+  box-sizing: border-box;
+  padding: 0 5px;
+  border: 1px solid #171717;
+  border-radius: 3px;
+  color: #fd942b;
+  font-size: 12px;
+  outline: none;
+}
+
+/* 文本区域 */
+textarea {
+  min-height: 40px;
+  resize: vertical;
+}
+
+/* 输入框,文本区域::占位符 */
+input::placeholder,
+textarea::placeholder {
+  font-size: 12px;
+  font-style: normal;
+}
+
+/* 数字输入框 */
+input[type='number'] {
+  width: 50px !important;
+}
+
+/* 数字输入框::增减按钮 */
+input[type='number']::-webkit-outer-spin-button,
+input[type='number']::-webkit-inner-spin-button {
+  /* appearance: none; */
+  /* -webkit-appearance: none; */
+  /* margin: 0; */
+  margin-right: -2px;
+}
+
+/* 复选框 */
+input[type='checkbox'] {
+  appearance: none;
+  -webkit-appearance: none;
+  width: 16px !important;
+  height: 16px !important;
+  min-width: 16px !important;
+  background-image: none;
+  background-color: #262626;
+  border: 1px solid #171717;
+  border-radius: 3px;
+  padding-left: 0;
+  position: relative !important;
+  flex: 0 !important;
+  margin: 0;
+  color: #fd942b;
+  outline: none;
+  cursor: pointer;
+}
+
+/* 复选框:勾选 */
+input[type='checkbox']:checked::after {
+  width: 12px;
+  height: 12px;
+  display: inline-block;
+  content: '';
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABKUlEQVRYR+2W2w2DMAxF41ZdBnWzqjMQZkBdjWUqkiqUgCHOO4Ef+EECwTlO7AvATj7gZD67BA5bgW/fcLXdj/cwnfVxiMD4aVomYQILKTssUV0Aw3XVWKKqgFr2G0BLTZqWqCbggq8NIHkVgSD43A/FBag9J8MOJL+/hq6oQGjlbIYrMUNAVSAEg/28+iI7BW4IuObVJZAK3wj45tUmkANfBFyNs08uLBIKd70DgroWNY0WKAGfVmBUHwlLWuFqcRWl4OsWREioh2zxuukTYtWoPlrGcOyfnIEkc9s3gsb9QLg5hiUkIuB0EOVIRMJJAXUxaTsS4FaBaIlEuFMgWCID7hXwSmTCgwSsEgXgwQJ/CZSYheBRAlpCEP/20UGFHij6R5Qicgn8AIQ23JRIyuB1AAAAAElFTkSuQmCC);
+  background-size: 12px;
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+}
+
+/* 输入框:虚指 */
+input:hover {
+  border-color: #888888;
+}
+
+/* 滑动条 */
+input[type='range'] {
+  appearance: none;
+  -webkit-appearance: none;
+  height: 4px !important;
+  background-color: #262626;
+  border: 1px solid #171717;
+  padding-left: 0;
+  padding-right: 0;
+}
+
+/* 滑动条:虚指|聚焦 */
+input[type='range']:hover,
+input[type='range']:focus,
+*:focus-within input[type='range'] {
+  border-color: #171717 !important;
+}
+
+/* 滑动条::把手 */
+input[type='range']::-webkit-slider-thumb {
+  appearance: none;
+  -webkit-appearance: none;
+  width: 12px;
+  height: 12px;
+  top: 2px;
+  background: #333;
+  box-sizing: border-box;
+  border: 2px solid #949494;
+  box-shadow: 0 1px 3px 1px #000 inset, 0 1px 1px 0 rgba(0, 0, 0, 0.9);
+  border-radius: 100%;
+}
+
+/* 滑动条::把手:虚指 */
+input[type='range']::-webkit-slider-thumb:hover {
+  border-color: #bcbcbc;
+  cursor: pointer;
+}
+
+/* 滑动条::把手:激活 */
+input[type='range']::-webkit-slider-thumb:active,
+*:focus-within > input[type='range']::-webkit-slider-thumb {
+  color: #bdbdbd;
+  border-color: #fd942b !important;
+  cursor: ew-resize;
+}
+
+/* 取色器 */
+input[type='color'] {
+  width: 16px;
+  height: 16px;
+  box-sizing: border-box;
+  border-radius: 1px;
+  padding: 0;
+  cursor: pointer;
+}
+
+/* 取色器::色板容器 */
+input[type='color']::-webkit-color-swatch-wrapper {
+  padding: 0;
+}
+
+/* 取色器::色板 */
+input[type='color']::-webkit-color-swatch {
+  border: none;
+}
+
+/* 超链接 */
+a {
+  color: #fd942b;
+  text-decoration: none;
+}
+
+/* 超链接:虚指 */
+a:hover {
+  text-decoration: underline;
+}
+
+/* 分割线 */
+hr {
+  width: 100%;
+  height: 1px;
+  background-color: #666;
+  border: none;
+  margin: 10px 0 !important;
+}
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/css/eazax-colors.css" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/css/eazax-colors.css"
new file mode 100644
index 0000000000000000000000000000000000000000..2e1a17e9a7888b2cb11f177c4b2968fed06d185b
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/css/eazax-colors.css"
@@ -0,0 +1,18 @@
+:root {
+  /* 背景颜色 */
+  --eazax-bg-color: #454545;
+  /* 主颜色 */
+  --eazax-main-color: #262626;
+  /* 强调色 */
+  --eazax-accent-color: #2e88fb;
+  /* 聚焦色 */
+  --eazax-focus-color: #fd942b;
+  /* 边框调色 */
+  --eazax-border-color: #171717;
+  /* 边框虚指调色 */
+  --eazax-border-hover-color: #888888;
+  /* 文本颜色 */
+  --eazax-font-color: #bdbdbd;
+  /* 内容颜色 */
+  --eazax-content-color: #fd942b;
+}
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/editor-main-kit.js" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/editor-main-kit.js"
new file mode 100644
index 0000000000000000000000000000000000000000..5c09c9dc577f4b39483e25384b44f2d2cb4b3b1d
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/editor-main-kit.js"
@@ -0,0 +1,53 @@
+const MainEvent = require('./main-event');
+const { print, checkUpdate } = require('./editor-main-util');
+
+/**
+ * (渲染进程)检查更新回调
+ * @param {Electron.IpcMainEvent} event 
+ * @param {boolean} logWhatever 无论有无更新都打印提示
+ */
+function onCheckUpdateEvent(event, logWhatever) {
+    checkUpdate(logWhatever);
+}
+
+/**
+ * (渲染进程)打印事件回调
+ * @param {Electron.IpcMainEvent} event 
+ * @param {'log' | 'info' | 'warn' | 'error' | any} type 
+ * @param {any[]?} args 
+ */
+function onPrintEvent(event, type) {
+    // print(type, ...args);
+    const args = [type];
+    for (let i = 2, l = arguments.length; i < l; i++) {
+        args.push(arguments[i]);
+    }
+    print.apply(null, args);
+}
+
+/**
+ * 编辑器主进程套件 (依赖 Cocos Creator 编辑器)
+ * @author 陈皮皮 (ifaswind)
+ * @version 20210818
+ */
+const EditorMainKit = {
+
+    /**
+     * 注册
+     */
+    register() {
+        MainEvent.on('check-update', onCheckUpdateEvent);
+        MainEvent.on('print', onPrintEvent);
+    },
+
+    /**
+     * 取消注册
+     */
+    unregister() {
+        MainEvent.removeListener('check-update', onCheckUpdateEvent);
+        MainEvent.removeListener('print', onPrintEvent);
+    },
+
+};
+
+module.exports = EditorMainKit;
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/editor-main-util.js" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/editor-main-util.js"
new file mode 100644
index 0000000000000000000000000000000000000000..f90dbd8df874fbbacc26241339f3fcfe40deec2d
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/editor-main-util.js"
@@ -0,0 +1,147 @@
+const I18n = require('./i18n');
+const PackageUtil = require('./package-util');
+const Updater = require('./updater');
+
+/** 编辑器语言 */
+const LANG = Editor.lang || Editor.I18n.getLanguage();
+
+/** 包名 */
+const PACKAGE_NAME = PackageUtil.name;
+
+/** 扩展名称 */
+const EXTENSION_NAME = I18n.get(LANG, 'name');
+
+/**
+ * 编辑器主进程工具 (依赖 Cocos Creator 编辑器)
+ * @author 陈皮皮 (ifaswind)
+ * @version 20210929
+ */
+const EditorMainUtil = {
+
+    /**
+     * 语言
+     */
+    get language() {
+        return LANG;
+    },
+
+    /**
+     * i18n
+     * @param {string} key 关键词
+     * @returns {string}
+     */
+    translate(key) {
+        return I18n.get(LANG, key);
+    },
+
+    /**
+     * 打印信息到控制台(带标题)
+     * @param {'log' | 'info' | 'warn' | 'error' | any} type
+     * @param {any[]?} args 
+     */
+    print(type) {
+        const args = [`[${EXTENSION_NAME}]`];
+        for (let i = 1, l = arguments.length; i < l; i++) {
+            args.push(arguments[i]);
+        }
+        const object = Editor.log ? Editor : console;
+        switch (type) {
+            case 'log': {
+                object.log.apply(object, args);
+                break;
+            }
+            case 'info': {
+                object.info.apply(object, args);
+                break;
+            }
+            case 'warn': {
+                object.warn.apply(object, args);
+                break;
+            }
+            case 'error': {
+                object.error.apply(object, args);
+                break;
+            }
+            default: {
+                args.splice(1, 0, type);
+                object.log.apply(object, args);
+            }
+        }
+    },
+
+    /**
+     * 打印信息到控制台(不带标题)
+     * @param {'log' | 'info' | 'warn' | 'error' | any} type
+     * @param {any[]?} args 
+     */
+    pureWithoutTitle(type) {
+        const args = [];
+        for (let i = 1, l = arguments.length; i < l; i++) {
+            args.push(arguments[i]);
+        }
+        const object = Editor.log ? Editor : console;
+        switch (type) {
+            case 'log': {
+                object.log.apply(object, args);
+                break;
+            }
+            case 'info': {
+                object.info.apply(object, args);
+                break;
+            }
+            case 'warn': {
+                object.warn.apply(object, args);
+                break;
+            }
+            case 'error': {
+                object.error.apply(object, args);
+                break;
+            }
+            default: {
+                args.splice(1, 0, type);
+                object.log.apply(object, args);
+            }
+        }
+    },
+
+    /**
+     * 检查更新
+     * @param {boolean} logWhatever 无论有无更新都打印提示
+     */
+    async checkUpdate(logWhatever) {
+        // 编辑器本次启动是否已经检查过了
+        if (!logWhatever && (Editor[PACKAGE_NAME] && Editor[PACKAGE_NAME].hasCheckUpdate)) {
+            return;
+        }
+        Editor[PACKAGE_NAME] = { hasCheckUpdate: true };
+        // 是否有新版本
+        const hasNewVersion = await Updater.check();
+        // 打印到控制台
+        const { print, translate } = EditorMainUtil;
+        const localVersion = Updater.getLocalVersion();
+        if (hasNewVersion) {
+            const remoteVersion = await Updater.getRemoteVersion();
+            print('info', translate('has-new-version'));
+            print('info', `${translate('local-version')}${localVersion}`);
+            print('info', `${translate('latest-version')}${remoteVersion}`);
+            print('info', translate('git-releases'));
+            print('info', translate('cocos-store'));
+        } else if (logWhatever) {
+            print('info', translate('current-latest'));
+            print('info', `${translate('local-version')}${localVersion}`);
+        }
+    },
+
+    /**
+     * (3.x)重新加载扩展
+     */
+    async reload() {
+        const path = await Editor.Package.getPath(PACKAGE_NAME);
+        await Editor.Package.unregister(path);
+        await Editor.Package.register(path);
+        await Editor.Package.enable(path);
+    },
+
+};
+
+module.exports = EditorMainUtil;
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/editor-renderer-kit.js" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/editor-renderer-kit.js"
new file mode 100644
index 0000000000000000000000000000000000000000..238bfaef3d92f5fe2adaa861c0cb3819096a4ef7
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/editor-renderer-kit.js"
@@ -0,0 +1,26 @@
+const RendererEvent = require("./renderer-event");
+
+/**
+ * 编辑器渲染进程套件 (依赖 Cocos Creator 编辑器)
+ * @author 陈皮皮 (ifaswind)
+ * @version 20210818
+ */
+const EditorRendererKit = {
+
+    /**
+     * 打印信息到 Creator 编辑器控制台
+     * @param {'log' | 'info' | 'warn' | 'error' | any} type 
+     * @param {any[]?} args 
+     */
+    print(type) {
+        // return RendererEvent.send('print', type, ...args);
+        const args = ['print', type];
+        for (let i = 1, l = arguments.length; i < l; i++) {
+            args.push(arguments[i]);
+        }
+        return RendererEvent.send.apply(RendererEvent, args);
+    },
+
+};
+
+module.exports = EditorRendererKit;
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/file-util.js" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/file-util.js"
new file mode 100644
index 0000000000000000000000000000000000000000..99ab69661fe8e3a9deaf5e85d132bbb8028f6179
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/file-util.js"
@@ -0,0 +1,158 @@
+const Fs = require('fs');
+const Path = require('path');
+const { promisify } = require('util');
+
+/**
+ * 文件工具 (Promise 化)
+ * @author 陈皮皮 (ifaswind)
+ * @version 20210818
+ */
+const FileUtil = {
+
+    /**
+     * 获取文件状态
+     * @param {Fs.PathLike} path 路径
+     * @returns {Promise<Fs.stats>}
+     */
+    stat: promisify(Fs.stat),
+
+    /**
+     * 创建文件夹
+     * @param {Fs.PathLike} path 路径
+     * @param {Fs.MakeDirectoryOptions?} options 选项
+     * @returns {Promise<void>}
+     */
+    mkdir: promisify(Fs.mkdir),
+
+    /**
+     * 读取文件夹
+     * @param {Fs.PathLike} path 路径
+     * @param {any} options 选项
+     * @returns {Promise<string[]>}
+     */
+    readdir: promisify(Fs.readdir),
+
+    /**
+     * 移除文件夹
+     * @param {Fs.PathLike} path 路径
+     * @param {Fs.RmDirOptions?} options 选项
+     * @returns {Promise<void>}
+     */
+    rmdir: promisify(Fs.rmdir),
+
+    /**
+     * 读取文件
+     * @param {Fs.PathLike} path 路径
+     * @param {any} options 选项
+     * @returns {Promise<Buffer>}
+     */
+    readFile: promisify(Fs.readFile),
+
+    /**
+     * 创建文件
+     * @param {Fs.PathLike} path 路径
+     * @param {string | NodeJS.ArrayBufferView} data 数据
+     * @param {Fs.WriteFileOptions?} options 选项
+     * @returns {Promise<void>}
+     */
+    writeFile: promisify(Fs.writeFile),
+
+    /**
+     * 移除文件
+     * @param {Fs.PathLike} path 路径
+     * @returns {Promise<void>}
+     */
+    unlink: promisify(Fs.unlink),
+
+    /**
+     * 测试路径是否存在 (同步)
+     * @param {Fs.PathLike} path 路径
+     */
+    existsSync: Fs.existsSync,
+
+    /**
+     * 复制文件/文件夹
+     * @param {Fs.PathLike} srcPath 源路径
+     * @param {Fs.PathLike} destPath 目标路径
+     * @returns {Promise<boolean>}
+     */
+    async copy(srcPath, destPath) {
+        if (!FileUtil.existsSync(srcPath)) {
+            return false;
+        }
+        const stats = await FileUtil.stat(srcPath);
+        if (stats.isDirectory()) {
+            if (!FileUtil.existsSync(destPath)) {
+                await FileUtil.createDir(destPath);
+            }
+            const names = await FileUtil.readdir(srcPath);
+            for (const name of names) {
+                await FileUtil.copy(Path.join(srcPath, name), Path.join(destPath, name));
+            }
+        } else {
+            await FileUtil.writeFile(destPath, await FileUtil.readFile(srcPath));
+        }
+        return true;
+    },
+
+    /**
+     * 创建文件夹 (递归)
+     * @param {Fs.PathLike} path 路径
+     * @returns {Promise<boolean>}
+     */
+    async createDir(path) {
+        if (FileUtil.existsSync(path)) {
+            return true;
+        } else {
+            const dir = Path.dirname(path);
+            if (await FileUtil.createDir(dir)) {
+                await FileUtil.mkdir(path);
+                return true;
+            }
+        }
+        return false;
+    },
+
+    /**
+     * 移除文件/文件夹 (递归)
+     * @param {Fs.PathLike} path 路径
+     */
+    async remove(path) {
+        if (!FileUtil.existsSync(path)) {
+            return;
+        }
+        const stats = await FileUtil.stat(path);
+        if (stats.isDirectory()) {
+            const names = await FileUtil.readdir(path);
+            for (const name of names) {
+                await FileUtil.remove(Path.join(path, name));
+            }
+            await FileUtil.rmdir(path);
+        } else {
+            await FileUtil.unlink(path);
+        }
+    },
+
+    /**
+     * 遍历文件/文件夹并执行函数
+     * @param {Fs.PathLike} path 路径
+     * @param {(filePath: Fs.PathLike, stat: Fs.Stats) => void | Promise<void>} handler 处理函数
+     */
+    async map(path, handler) {
+        if (!FileUtil.existsSync(path)) {
+            return;
+        }
+        const stats = await FileUtil.stat(path);
+        if (stats.isDirectory()) {
+            const names = await FileUtil.readdir(path);
+            for (const name of names) {
+                await FileUtil.map(Path.join(path, name), handler);
+            }
+        } else {
+           await handler(path, stats);
+        }
+    },
+
+};
+
+module.exports = FileUtil;
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/i18n.js" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/i18n.js"
new file mode 100644
index 0000000000000000000000000000000000000000..d5186ee8259a3e4bc16b7677305472f7fcebc378
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/i18n.js"
@@ -0,0 +1,36 @@
+const zh = require('../../i18n/zh');
+const en = require('../../i18n/en');
+
+/**
+ * 多语言
+ * @author 陈皮皮 (ifaswind)
+ * @version 20210929
+ */
+const I18n = {
+
+    /**
+     * 中文
+     */
+    zh,
+
+    /**
+     * 英文
+     */
+    en,
+
+    /**
+     * 获取多语言文本
+     * @param {string} lang 语言
+     * @param {string} key 关键字
+     * @returns {string}
+     */
+    get(lang, key) {
+        if (I18n[lang] && I18n[lang][key]) {
+            return I18n[lang][key];
+        }
+        return key;
+    },
+
+};
+
+module.exports = I18n;
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/main-event.js" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/main-event.js"
new file mode 100644
index 0000000000000000000000000000000000000000..d74904ad5aa04bffdca63ee33f5664b7e78fbeb1
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/main-event.js"
@@ -0,0 +1,81 @@
+const { ipcMain } = require('electron');
+const PackageUtil = require('./package-util');
+
+/** 包名 */
+const PACKAGE_NAME = PackageUtil.name;
+
+/**
+ * 主进程 IPC 事件
+ * @author 陈皮皮 (ifaswind)
+ * @version 20210818
+ */
+const MainEvent = {
+
+    /**
+     * 监听事件(一次性)
+     * @param {string} channel 频道
+     * @param {Function} callback 回调
+     */
+    once(channel, callback) {
+        return ipcMain.once(`${PACKAGE_NAME}:${channel}`, callback);
+    },
+
+    /**
+     * 监听事件
+     * @param {string} channel 频道
+     * @param {Function} callback 回调
+     */
+    on(channel, callback) {
+        return ipcMain.on(`${PACKAGE_NAME}:${channel}`, callback);
+    },
+
+    /**
+     * 取消事件监听
+     * @param {string} channel 频道
+     * @param {Function} callback 回调
+     */
+    removeListener(channel, callback) {
+        return ipcMain.removeListener(`${PACKAGE_NAME}:${channel}`, callback);
+    },
+
+    /**
+     * 取消事件的所有监听
+     * @param {string} channel 频道
+     */
+    removeAllListeners(channel) {
+        return ipcMain.removeAllListeners(`${PACKAGE_NAME}:${channel}`);
+    },
+
+    /**
+     * 发送事件到指定渲染进程
+     * @param {Electron.WebContents} webContents 渲染进程事件对象
+     * @param {string} channel 频道
+     * @param {any[]?} args 参数
+     */
+    send(webContents, channel) {
+        // return webContents.send(`${PACKAGE_NAME}:${channel}`, ...args);
+        const args = [`${PACKAGE_NAME}:${channel}`];
+        for (let i = 2, l = arguments.length; i < l; i++) {
+            args.push(arguments[i]);
+        }
+        return webContents.send.apply(webContents, args);
+    },
+
+    /**
+     * 回复事件给渲染进程
+     * @param {Electron.IpcMainEvent} ipcMainEvent 事件对象
+     * @param {string} channel 频道
+     * @param {any[]?} args 参数
+     */
+    reply(ipcMainEvent, channel) {
+        // return ipcMainEvent.reply(`${PACKAGE_NAME}:${channel}`, ...args);
+        const args = [`${PACKAGE_NAME}:${channel}`];
+        for (let i = 2, l = arguments.length; i < l; i++) {
+            args.push(arguments[i]);
+        }
+        return ipcMainEvent.reply.apply(ipcMainEvent, args);
+    },
+
+};
+
+module.exports = MainEvent;
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/package-util.js" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/package-util.js"
new file mode 100644
index 0000000000000000000000000000000000000000..3675f885b7c4aeedf746e023a9c89beed1237b8c
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/package-util.js"
@@ -0,0 +1,47 @@
+const { shell } = require('electron');
+
+/** 包信息 */
+const PACKAGE_JSON = require('../../package.json');
+
+/**
+ * 包工具
+ * @author 陈皮皮 (ifaswind)
+ * @version 20210908
+ */
+const PackageUtil = {
+
+    /**
+     * 包名
+     * @type {string}
+     */
+    get name() {
+        return PACKAGE_JSON.name;
+    },
+
+    /**
+     * 版本
+     * @type {string}
+     */
+    get version() {
+        return PACKAGE_JSON.version;
+    },
+
+    /**
+     * 仓库地址
+     * @type {string}
+     */
+    get repository() {
+        return PACKAGE_JSON.repository;
+    },
+
+    /**
+     * 打开仓库页面
+     */
+    openRepository() {
+        const url = PackageUtil.repository;
+        shell.openExternal(url);
+    },
+
+};
+
+module.exports = PackageUtil;
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/renderer-event.js" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/renderer-event.js"
new file mode 100644
index 0000000000000000000000000000000000000000..82d84f0c92d3183ef55c2c63a8f1d83d542a079f
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/renderer-event.js"
@@ -0,0 +1,80 @@
+const { ipcRenderer } = require('electron');
+const PackageUtil = require('./package-util');
+
+/** 包名 */
+const PACKAGE_NAME = PackageUtil.name;
+
+/**
+ * 渲染进程 IPC 事件
+ * @author 陈皮皮 (ifaswind)
+ * @version 20210818
+ */
+const RendererEvent = {
+
+    /**
+     * 监听事件(一次性)
+     * @param {string} channel 频道
+     * @param {Function} callback 回调
+     */
+    once(channel, callback) {
+        return ipcRenderer.once(`${PACKAGE_NAME}:${channel}`, callback);
+    },
+
+    /**
+     * 监听事件
+     * @param {string} channel 频道
+     * @param {Function} callback 回调
+     */
+    on(channel, callback) {
+        return ipcRenderer.on(`${PACKAGE_NAME}:${channel}`, callback);
+    },
+
+    /**
+     * 取消事件监听
+     * @param {string} channel 频道
+     * @param {Function} callback 回调
+     */
+    removeListener(channel, callback) {
+        return ipcRenderer.removeListener(`${PACKAGE_NAME}:${channel}`, callback);
+    },
+
+    /**
+     * 取消事件的所有监听
+     * @param {string} channel 频道
+     */
+    removeAllListeners(channel) {
+        return ipcRenderer.removeAllListeners(`${PACKAGE_NAME}:${channel}`);
+    },
+
+    /**
+     * 发送事件到主进程
+     * @param {string} channel 频道
+     * @param {...any} args 参数
+     */
+    send(channel) {
+        // return ipcRenderer.send(`${PACKAGE_NAME}:${channel}`, ...args);
+        const args = [`${PACKAGE_NAME}:${channel}`];
+        for (let i = 1, l = arguments.length; i < l; i++) {
+            args.push(arguments[i]);
+        }
+        return ipcRenderer.send.apply(ipcRenderer, args);
+    },
+
+    /**
+     * 发送事件到主进程(同步)
+     * @param {string} channel 频道
+     * @param {...any} args 参数
+     * @returns {Promise<any>}
+     */
+    sendSync(channel) {
+        // return ipcRenderer.sendSync(`${PACKAGE_NAME}:${channel}`, ...args);
+        const args = [`${PACKAGE_NAME}:${channel}`];
+        for (let i = 1, l = arguments.length; i < l; i++) {
+            args.push(arguments[i]);
+        }
+        return ipcRenderer.sendSync.apply(ipcRenderer, args);
+    },
+
+};
+
+module.exports = RendererEvent;
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/updater.js" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/updater.js"
new file mode 100644
index 0000000000000000000000000000000000000000..67ee24a39865a1665a2f326fb302c0f8aa3d93b9
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/updater.js"
@@ -0,0 +1,92 @@
+const fetch = require('../../lib/node-fetch');
+const PackageUtil = require('./package-util');
+const { compareVersion } = require('./version-util');
+
+/** 本地版本 */
+const LOCAL_VERSION = PackageUtil.version;
+
+/** 远程仓库地址 */
+const REMOTE_URL = PackageUtil.repository;
+
+/**
+ * 更新器
+ * @author 陈皮皮 (ifaswind)
+ * @version 20210804
+ */
+const Updater = {
+
+    /**
+     * 远程仓库地址
+     * @type {string}
+     */
+    get remote() {
+        return REMOTE_URL;
+    },
+
+    /**
+     * 分支
+     * @type {string}
+     */
+    branch: 'master',
+
+    /**
+     * 获取远端的 package.json
+     * @returns {Promise<object>}
+     */
+    async getRemotePackageJson() {
+        const packageJsonUrl = `${Updater.remote}/raw/${Updater.branch}/package.json`;
+        // 发起网络请求
+        const response = await fetch(packageJsonUrl, {
+            method: 'GET',
+            cache: 'no-cache',
+            mode: 'no-cors',
+        });
+        // 请求结果
+        if (response.status !== 200) {
+            return null;
+        }
+        // 读取 json
+        const json = response.json();
+        return json;
+    },
+
+    /**
+     * 获取远端版本号
+     * @returns {Promise<string>}
+     */
+    async getRemoteVersion() {
+        const package = await Updater.getRemotePackageJson();
+        if (package && package.version) {
+            return package.version;
+        }
+        return null;
+    },
+
+    /**
+     * 获取本地版本号
+     * @returns {string}
+     */
+    getLocalVersion() {
+        return LOCAL_VERSION;
+    },
+
+    /**
+     * 检查远端是否有新版本
+     * @returns {Promise<boolean>}
+     */
+    async check() {
+        // 远端版本号
+        const remoteVersion = await Updater.getRemoteVersion();
+        if (!remoteVersion) {
+            return false;
+        }
+        // 本地版本号
+        const localVersion = Updater.getLocalVersion();
+        // 对比版本号
+        const result = compareVersion(localVersion, remoteVersion);
+        return (result < 0);
+    },
+
+};
+
+module.exports = Updater;
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/version-util.js" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/version-util.js"
new file mode 100644
index 0000000000000000000000000000000000000000..30bd3034634ec916edfa5fa850a84a4abe69fac7
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/version-util.js"
@@ -0,0 +1,61 @@
+/**
+ * 版本工具
+ * @author 陈皮皮 (ifaswind)
+ * @version 20210814
+ */
+const VersionUtil = {
+
+    /**
+     * 拆分版本号
+     * @param {string | number} version 版本号文本
+     * @returns {number[]}
+     * @example
+     * splitVersionString('1.2.0');  // [1, 2, 0]
+     */
+    splitVersionString(version) {
+        if (typeof version === 'number') {
+            return [version];
+        }
+        if (typeof version === 'string') {
+            return (
+                version.replace(/-/g, '.')
+                    .split('.')
+                    .map(v => (parseInt(v) || 0))
+            );
+        }
+        return [0];
+    },
+
+    /**
+     * 对比版本号
+     * @param {string | number} a 版本 a
+     * @param {string | number} b 版本 b
+     * @returns {-1 | 0 | 1}
+     * @example
+     * compareVersion('1.0.0', '1.0.1');    // -1
+     * compareVersion('1.1.0', '1.1.0');    // 0
+     * compareVersion('1.2.1', '1.2.0');    // 1
+     * compareVersion('1.2.0.1', '1.2.0');  // 1
+     */
+    compareVersion(a, b) {
+        const acs = VersionUtil.splitVersionString(a),
+            bcs = VersionUtil.splitVersionString(b);
+        const count = Math.max(acs.length, bcs.length);
+        for (let i = 0; i < count; i++) {
+            const ac = acs[i],
+                bc = bcs[i];
+            // 前者缺少分量或前者小于后者
+            if (ac == undefined || ac < bc) {
+                return -1;
+            }
+            // 后者缺少分量或前者大于后者
+            if (bc == undefined || ac > bc) {
+                return 1;
+            }
+        }
+        return 0;
+    },
+
+};
+
+module.exports = VersionUtil;
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/window-util.js" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/window-util.js"
new file mode 100644
index 0000000000000000000000000000000000000000..b6abd03f96f6752058532e3306a04b2394ba5f05
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/eazax/window-util.js"
@@ -0,0 +1,80 @@
+const { BrowserWindow } = require('electron');
+
+/**
+ * 窗口工具(主进程)
+ * @author 陈皮皮 (ifaswind)
+ * @version 20210825
+ */
+const WindowUtil = {
+
+    /**
+     * 最先打开的窗口
+     * @returns {BrowserWindow}
+     */
+    getFirstWindow() {
+        const wins = BrowserWindow.getAllWindows();
+        return wins[wins.length - 1];
+    },
+
+    /**
+     * 获取当前聚焦的窗口
+     * @returns {BrowserWindow}
+     */
+    getFocusedWindow() {
+        return BrowserWindow.getFocusedWindow();
+    },
+
+    /**
+     * 计算窗口位置(相对于最先打开的窗口)
+     * @param {[number, number]} size 窗口尺寸
+     * @param {'top' | 'center'} anchor 锚点
+     * @returns {[number, number]}
+     */
+    calcWindowPosition(size, anchor) {
+        const win = WindowUtil.getFirstWindow();
+        return WindowUtil.calcWindowPositionByTarget(size, anchor, win);
+    },
+
+    /**
+     * 计算窗口位置(相对于当前聚焦的窗口)
+     * @param {[number, number]} size 窗口尺寸
+     * @param {'top' | 'center'} anchor 锚点
+     * @returns {[number, number]}
+     */
+    calcWindowPositionByFocused(size, anchor) {
+        const win = WindowUtil.getFocusedWindow();
+        return WindowUtil.calcWindowPositionByTarget(size, anchor, win);
+    },
+
+    /**
+     * 计算窗口位置(相对于当前聚焦的窗口)
+     * @param {[number, number]} size 窗口尺寸
+     * @param {'top' | 'center'} anchor 锚点
+     * @param {BrowserWindow} win 目标窗口
+     * @returns {[number, number]}
+     */
+    calcWindowPositionByTarget(size, anchor, win) {
+        // 根据目标窗口的位置和尺寸来计算
+        const winSize = win.getSize(),
+            winPos = win.getPosition();
+        // 注意:原点 (0, 0) 在屏幕左上角
+        // 另外,窗口的位置值必须是整数,否则修改无效(像素的最小粒度为 1)
+        const x = Math.floor(winPos[0] + (winSize[0] / 2) - (size[0] / 2));
+        let y;
+        switch (anchor) {
+            case 'top': {
+                y = Math.floor(winPos[1]);
+                break;
+            }
+            default:
+            case 'center': {
+                y = Math.floor(winPos[1] + (winSize[1] / 2) - (size[1] / 2));
+                break;
+            }
+        }
+        return [x, y];
+    },
+
+};
+
+module.exports = WindowUtil;
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/main/editor-api.js" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/main/editor-api.js"
new file mode 100644
index 0000000000000000000000000000000000000000..cb768e5261252c5bcd3b527b680d9b6076117d10
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/main/editor-api.js"
@@ -0,0 +1,90 @@
+/**
+ * 编辑器 API(用于抹平不同版本编辑器之间的差异)
+ * @author 陈皮皮 (ifaswind)
+ * @version 20210830
+ */
+const EditorAPI = {
+
+    /**
+     * 当前语言
+     * @returns {string}
+     */
+    getLanguage() {
+        return Editor.lang || Editor.I18n.getLanguage();
+    },
+
+    /**
+     * 绝对路径转为编辑器资源路径
+     * @param {string} fspath 
+     */
+    fspathToUrl(fspath) {
+        return Editor.assetdb.fspathToUrl(fspath);
+    },
+
+    /**
+     * 编辑器资源路径转为绝对路径
+     * @param {string} url 
+     */
+    urlToFspath(url) {
+        return Editor.assetdb.urlToFspath(url);
+    },
+
+    /**
+     * 通过 uuid 获取资源信息
+     * @param {string} uuid 
+     */
+    assetInfoByUuid(uuid) {
+        return Editor.assetdb.assetInfoByUuid(uuid);
+    },
+
+    /**
+     * 通过 uuid 获取子资源信息
+     * @param {string} uuid 
+     */
+    subAssetInfosByUuid(uuid) {
+        return Editor.assetdb.subAssetInfosByUuid(uuid);
+    },
+
+    /**
+     * 获取当前选中的资源 uuid
+     * @returns {string[]}
+     */
+    getCurrentSelectedAssets() {
+        return Editor.Selection.curSelection('asset');
+    },
+
+    /**
+     * 获取当前选中的节点 uuid
+     * @returns {string[]}
+     */
+    getCurrentSelectedNodes() {
+        return Editor.Selection.curSelection('node');
+    },
+
+    /**
+     * 是否为 uuid
+     * @param {string} uuid 
+     */
+    isUuid(uuid) {
+        return Editor.Utils.UuidUtils.isUuid(uuid);
+    },
+
+    /**
+     * 压缩 uuid
+     * @param {string} uuid 
+     */
+    compressUuid(uuid) {
+        return Editor.Utils.UuidUtils.compressUuid(uuid);
+    },
+
+    /**
+     * 反压缩 uuid
+     * @param {string} uuid 
+     */
+    decompressUuid(uuid) {
+        return Editor.Utils.UuidUtils.decompressUuid(uuid);
+    },
+
+};
+
+module.exports = EditorAPI;
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/main/finder.js" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/main/finder.js"
new file mode 100644
index 0000000000000000000000000000000000000000..fbcd555664504d1242a6f9bc9cb0a6dfded4bb40
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/main/finder.js"
@@ -0,0 +1,269 @@
+const { extname, basename } = require("path");
+const EditorAPI = require("./editor-api");
+const { print, translate } = require("../eazax/editor-main-util");
+const FileUtil = require("../eazax/file-util");
+const { containsValue } = require("./object-util");
+const Parser = require("./parser");
+const { DefaultDeserializer } = require("v8");
+
+/** 扩展名对应文件类型 */
+const ASSET_TYPE_MAP = {
+    // 场景
+    '.fire': 'scene',
+    '.scene': 'scene',
+    // 预制体
+    '.prefab': 'prefab',
+    // 动画
+    '.anim': 'animation',
+    // 材质
+    '.mtl': 'material',
+    // 字体
+    '.fnt.meta': 'font',
+};
+
+/**
+ * 查找器
+ */
+const Finder = {
+
+    /**
+     * 使用 uuid 进行查找
+     * @param {string} uuid 
+     */
+    async findByUuid(uuid) {
+        // 是否为有效 uuid
+        if (!EditorAPI.isUuid(uuid)) {
+            print('log', translate('invalid-uuid'), uuid);
+            return [];
+        }
+        // 获取资源信息
+        const assetInfo = EditorAPI.assetInfoByUuid(uuid);
+        let sIndex = assetInfo.path.lastIndexOf("/");
+        let eIndex = assetInfo.path.lastIndexOf(".");
+        if(sIndex == -1) {
+            sIndex = 0;
+        }
+        if(eIndex == -1) {
+            sIndex = assetInfo.path.length-1;
+        }
+        const fileName = assetInfo.path.substring(sIndex+1, eIndex);
+
+        if (assetInfo) {
+            // 记录子资源 uuid
+            const subAssetUuids = [];
+            // 资源类型检查
+            if (assetInfo.type === 'texture') {
+                // 纹理子资源
+                const subAssetInfos = EditorAPI.subAssetInfosByUuid(uuid);
+                if (subAssetInfos && subAssetInfos.length > 0) {
+                    for (let i = 0; i < subAssetInfos.length; i++) {
+                        subAssetUuids.push(subAssetInfos[i].uuid);
+                    }
+                }
+            } else if (assetInfo.type === 'typescript' || assetInfo.type === 'javascript') {
+                // 脚本资源
+                uuid = EditorAPI.compressUuid(uuid);
+            }
+            // 查找资源引用
+            const results = [],
+                selfResults = await Finder.findRefs(uuid, fileName);
+            for (let i = 0, l = selfResults.length; i < l; i++) {
+                results.push(selfResults[i]);
+            }
+            // 查找子资源的引用
+            if (subAssetUuids.length > 0) {
+                for (let i = 0, l = subAssetUuids.length; i < l; i++) {
+                    const subResults = await Finder.findRefs(subAssetUuids[i]);
+                    for (let j = 0, l = subResults.length; j < l; j++) {
+                        results.push(subResults[j]);
+                    }
+                }
+            }
+            return results;
+        } else {
+            // 不存在的资源,直接查找 uuid
+            print('log', translate('find-asset-refs'), uuid);
+            return (await Finder.findRefs(uuid));
+        }
+    },
+
+    /**
+     * 查找引用
+     * @param {string} uuid 
+     * @returns {Promise<{ type: string, url: string, refs?: object[]}[]>}
+     */
+    async findRefs(uuid, fileName="") {
+        const result = [];
+        // 文件处理函数
+        const handler = async (path, stats) => {
+            const ext = extname(path);
+            if (ext === '.fire' || ext === '.scene' || ext === '.prefab') {
+                // 场景和预制体资源(转为节点树)
+                const tree = await Parser.getNodeTree(path);
+                if (!tree) {
+                    return;
+                }
+                // 遍历第一层节点查找引用
+                const refs = [];
+                for (let children = tree.children, i = 0, l = children.length; i < l; i++) {
+                    Finder.findRefsInNode(tree, children[i], uuid, refs);
+                }
+                // 保存当前文件引用结果
+                if (refs.length > 0) {
+                    result.push({
+                        type: ASSET_TYPE_MAP[ext],
+                        url: EditorAPI.fspathToUrl(path),
+                        refs: refs,
+                    });
+                }
+            } else if (ext === '.anim') {
+                // 动画资源
+                const data = JSON.parse(await FileUtil.readFile(path)),
+                    curveData = data['curveData'],
+                    contains = containsValue(curveData, uuid);
+                if (contains) {
+                    result.push({
+                        type: ASSET_TYPE_MAP[ext],
+                        url: EditorAPI.fspathToUrl(path),
+                    });
+                }
+            } else if (ext === '.mtl' || path.endsWith('.fnt.meta')) {
+                // 材质和字体资源
+                const data = JSON.parse(await FileUtil.readFile(path));
+                // 需排除自己
+                if ((data['uuid'] === uuid)) {
+                    return;
+                }
+                // 是否引用
+                const contains = containsValue(data, uuid);
+                if (contains) {
+                    const _ext = (ext === '.mtl') ? '.mtl' : '.fnt.meta';
+                    result.push({
+                        type: ASSET_TYPE_MAP[_ext],
+                        url: EditorAPI.fspathToUrl(path),
+                    });
+                }
+            } else if (ext === '.ts' || ext === '.js') {
+                 // 脚本代码
+                 const data = await FileUtil.readFile(path);
+                 const regCheckImport = new RegExp(fileName);
+                 if(regCheckImport.test(data.toString())) {
+                    result.push({
+                        type: "Script",
+                        url: EditorAPI.fspathToUrl(path),
+                    });
+                 }
+            }
+        };
+        // 遍历资源目录下的文件
+        const assetsPath = EditorAPI.urlToFspath('db://assets');
+        await FileUtil.map(assetsPath, handler);
+        return result;
+    },
+
+    /**
+     * 查找节点中的引用
+     * @param {object} tree 节点树
+     * @param {object} node 目标节点
+     * @param {string} uuid 查找的 uuid
+     * @param {object[]} result 结果
+     */
+    findRefsInNode(tree, node, uuid, result) {
+        // 检查节点上的组件是否有引用
+        const components = node.components;
+        if (components && components.length > 0) {
+            for (let i = 0, l = components.length; i < l; i++) {
+                const properties = Finder.getContainsUuidProperties(components[i], uuid);
+                if (properties.length === 0) {
+                    continue;
+                }
+                // 资源类型
+                let type = components[i]['__type__'];
+                // 是否为脚本资源
+                if (EditorAPI.isUuid(type)) {
+                    const scriptUuid = EditorAPI.decompressUuid(type),
+                        assetInfo = EditorAPI.assetInfoByUuid(scriptUuid);
+                    type = basename(assetInfo.url);
+                }
+                // 遍历相关属性名
+                for (let i = 0; i < properties.length; i++) {
+                    let property = properties[i];
+                    if (property === '__type__') {
+                        property = null;
+                    } else {
+                        // 处理属性名称(Label 组件需要特殊处理)
+                        if (type === 'cc.Label' && property === '_N$file') {
+                            property = 'font';
+                        }
+                        // 去除属性名的前缀
+                        if (property.startsWith('_N$')) {
+                            property = property.replace('_N$', '');
+                        } else if (property[0] === '_') {
+                            property = property.substring(1);
+                        }
+                    }
+                    // 保存结果
+                    result.push({
+                        node: node.path,
+                        component: type,
+                        property: property,
+                    });
+                }
+            }
+        }
+        // 检查预制体是否有引用
+        const prefab = node.prefab;
+        if (prefab) {
+            // 排除预制体自己
+            if (uuid !== tree.uuid) {
+                const contains = containsValue(prefab, uuid);
+                if (contains) {
+                    result.push({
+                        node: node.path,
+                    });
+                }
+            }
+        }
+        // 遍历子节点
+        const children = node.children;
+        if (children && children.length > 0) {
+            for (let i = 0, l = children.length; i < l; i++) {
+                Finder.findRefsInNode(tree, children[i], uuid, result);
+            }
+        }
+    },
+
+    /**
+     * 获取对象包含指定 uuid 的属性
+     * @param {object} object 对象
+     * @param {string} uuid 值
+     * @returns {string[]}
+     */
+    getContainsUuidProperties(object, uuid) {
+        const properties = [];
+        const search = (target, path) => {
+            if (Object.prototype.toString.call(target) === '[object Object]') {
+                for (const key in target) {
+                    const curPath = (path != null) ? `${path}.${key}` : key;
+                    if (target[key] === uuid) {
+                        properties.push(path || key);
+                    }
+                    search(target[key], curPath);
+                }
+            } else if (Array.isArray(target)) {
+                for (let i = 0, l = target.length; i < l; i++) {
+                    const curPath = (path != null) ? `${path}[${i}]` : `[${i}]`;
+                    if (target[i] === uuid) {
+                        properties.push(path || `[${i}]`);
+                    }
+                    search(target[i], curPath);
+                }
+            }
+        }
+        search(object, null);
+        return properties;
+    },
+
+};
+
+module.exports = Finder;
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/main/index.js" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/main/index.js"
new file mode 100644
index 0000000000000000000000000000000000000000..48319c9b20a23d7f6ffa47624ba266fb6189e010
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/main/index.js"
@@ -0,0 +1,155 @@
+const PanelManager = require('./panel-manager');
+const ConfigManager = require('../common/config-manager');
+const EditorMainKit = require('../eazax/editor-main-kit');
+const { checkUpdate, print, translate } = require('../eazax/editor-main-util');
+const { openRepository } = require('../eazax/package-util');
+const EditorAPI = require('./editor-api');
+const Parser = require('./parser');
+const Finder = require('./finder');
+const Printer = require('./printer');
+
+/**
+ * 生命周期:加载
+ */
+function load() {
+    // 监听事件
+    EditorMainKit.register();
+}
+
+/**
+ * 生命周期:卸载
+ */
+function unload() {
+    // 取消事件监听
+    EditorMainKit.unregister();
+}
+
+/**
+ * 查找当前选中资源
+ */
+async function findCurrentSelection() {
+    // 过滤选中的资源 uuid
+    const uuids = EditorAPI.getCurrentSelectedAssets();
+    for (let i = 0; i < uuids.length; i++) {
+        const assetInfo = EditorAPI.assetInfoByUuid(uuids[i]);
+        if (assetInfo.type === 'folder') {
+            uuids.splice(i--);
+        }
+    }
+    // 未选择资源
+    if (uuids.length === 0) {
+        print('log', translate('please-select-assets'));
+        return;
+    }
+    // 遍历查找
+    for (let i = 0; i < uuids.length; i++) {
+        const uuid = uuids[i],
+            assetInfo = EditorAPI.assetInfoByUuid(uuid),
+            shortUrl = assetInfo.url.replace('db://', '');
+        // 查找引用
+        print('log', '🔍', `${translate('find-asset-refs')} ${shortUrl}`);
+        const refs = await Finder.findByUuid(uuid);
+        if (refs.length === 0) {
+            print('log', '📂', `${translate('no-refs')} ${shortUrl}`);
+            continue;
+        }
+        // 打印结果
+        Printer.printResult({
+            type: assetInfo.type,
+            uuid: uuid,
+            url: assetInfo.url,
+            path: assetInfo.path,
+            refs: refs,
+        });
+    }
+}
+
+function getSelection() {
+
+}
+
+/**
+ * 资源变化回调
+ * @param {{ type: string, uuid: string }} info 
+ */
+function onAssetChanged(info) {
+    const { type, uuid } = info;
+    // 场景和预制体
+    if (type === 'scene' || type === 'prefab') {
+        const { url, path } = EditorAPI.assetInfoByUuid(uuid);
+        // 排除内置资源
+        if (url.indexOf('db://internal') !== -1) {
+            return;
+        }
+        // 更新节点树
+        Parser.updateCache(path);
+    }
+}
+
+module.exports = {
+
+    /**
+     * 扩展消息
+     */
+    messages: {
+
+        /**
+         * 查找当前选中资源
+         * @param {*} event 
+         */
+        'find-current-selection'(event) {
+            findCurrentSelection();
+        },
+
+        /**
+         * 打开设置面板
+         * @param {*} event 
+         */
+        'open-settings-panel'(event) {
+            PanelManager.openSettingsPanel();
+        },
+
+        /**
+         * 检查更新
+         * @param {*} event 
+         */
+        'menu-check-update'(event) {
+            checkUpdate(true);
+        },
+
+        /**
+         * 版本
+         * @param {*} event 
+         */
+        'menu-version'(event) {
+            openRepository();
+        },
+
+        /**
+         * 场景面板加载完成后
+         * @param {*} event 
+         */
+        'scene:ready'(event) {
+            // 自动检查更新
+            const config = ConfigManager.get();
+            if (config.autoCheckUpdate) {
+                checkUpdate(false);
+            }
+        },
+
+        /**
+         * 资源变化
+         * @param {*} event 
+         * @param {{ type: string, uuid: string }} info 
+         */
+        'asset-db:asset-changed'(event, info) {
+            onAssetChanged(info);
+        },
+
+    },
+
+    load,
+
+    unload,
+
+};
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/main/object-util.js" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/main/object-util.js"
new file mode 100644
index 0000000000000000000000000000000000000000..ee2ef48397321828d5d429215103cd805b5c1e87
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/main/object-util.js"
@@ -0,0 +1,70 @@
+/**
+ * 对象工具
+ * @author 陈皮皮 (ifaswind)
+ * @version 20210929
+ */
+const ObjectUtil = {
+
+    /**
+     * 判断指定值是否是一个对象
+     * @param {any} arg 参数
+     */
+    isObject(arg) {
+        return Object.prototype.toString.call(arg) === '[object Object]';
+    },
+
+    /**
+     * 对象中是否包含指定的属性
+     * @param {object} object 对象
+     * @param {string} name 属性名
+     */
+    containsProperty(object, name) {
+        let result = false;
+        const search = (_object) => {
+            if (ObjectUtil.isObject(_object)) {
+                for (const key in _object) {
+                    if (key == name) {
+                        result = true;
+                        return;
+                    }
+                    search(_object[key]);
+                }
+            } else if (Array.isArray(_object)) {
+                for (let i = 0, l = _object.length; i < l; i++) {
+                    search(_object[i]);
+                }
+            }
+        }
+        search(object);
+        return result;
+    },
+
+    /**
+     * 对象中是否包含指定的值
+     * @param {object} object 对象
+     * @param {any} value 值
+     */
+    containsValue(object, value) {
+        let result = false;
+        const search = (_object) => {
+            if (ObjectUtil.isObject(_object)) {
+                for (const key in _object) {
+                    if (_object[key] === value) {
+                        result = true;
+                        return;
+                    }
+                    search(_object[key]);
+                }
+            } else if (Array.isArray(_object)) {
+                for (let i = 0, l = _object.length; i < l; i++) {
+                    search(_object[i]);
+                }
+            }
+        }
+        search(object);
+        return result;
+    },
+
+};
+
+module.exports = ObjectUtil;
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/main/panel-manager.js" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/main/panel-manager.js"
new file mode 100644
index 0000000000000000000000000000000000000000..6374b02b2ee806e509b2f0d21670e262fa2d7bf0
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/main/panel-manager.js"
@@ -0,0 +1,86 @@
+const { BrowserWindow } = require('electron');
+const { join } = require('path');
+const { language, translate } = require('../eazax/editor-main-util');
+const { calcWindowPosition } = require('../eazax/window-util');
+
+/** 扩展名称 */
+const EXTENSION_NAME = translate('name');
+
+/**
+ * 面板管理器 (主进程)
+ */
+const PanelManager = {
+
+    /**
+     * 面板实例
+     * @type {BrowserWindow}
+     */
+    settings: null,
+
+    /**
+     * 打开设置面板
+     */
+    openSettingsPanel() {
+        // 已打开则直接展示
+        if (PanelManager.settings) {
+            PanelManager.settings.show();
+            return;
+        }
+        // 窗口尺寸和位置
+        const winSize = [500, 346],
+            winPos = calcWindowPosition(winSize, 'center');
+        // 创建窗口
+        const win = PanelManager.settings = new BrowserWindow({
+            width: winSize[0],
+            height: winSize[1],
+            minWidth: winSize[0],
+            minHeight: winSize[1],
+            x: winPos[0],
+            y: winPos[1] - 100,
+            useContentSize: true,
+            frame: true,
+            title: `${EXTENSION_NAME} | Cocos Creator`,
+            autoHideMenuBar: true,
+            resizable: true,
+            minimizable: false,
+            maximizable: false,
+            fullscreenable: false,
+            skipTaskbar: false,
+            alwaysOnTop: true,
+            hasShadow: true,
+            show: false,
+            webPreferences: {
+                nodeIntegration: true,
+                contextIsolation: false,
+            },
+        });
+        // 就绪后(展示,避免闪烁)
+        win.on('ready-to-show', () => win.show());
+        // 关闭后
+        win.on('closed', () => (PanelManager.settings = null));
+        // 监听按键
+        win.webContents.on('before-input-event', (event, input) => {
+            if (input.key === 'Escape') PanelManager.closeSettingsPanel();
+        });
+        // 调试用的 devtools
+        // win.webContents.openDevTools({ mode: 'detach' });
+        // 加载页面
+        const path = join(__dirname, '../renderer/settings/index.html');
+        win.loadURL(`file://${path}?lang=${language}`);
+    },
+
+    /**
+     * 关闭面板
+     */
+    closeSettingsPanel() {
+        if (!PanelManager.settings) {
+            return;
+        }
+        PanelManager.settings.hide();
+        PanelManager.settings.close();
+        PanelManager.settings = null;
+    },
+
+};
+
+module.exports = PanelManager;
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/main/parser.js" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/main/parser.js"
new file mode 100644
index 0000000000000000000000000000000000000000..fd582b2b7b578dd5a87abe9f6c5536a885ce3230
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/main/parser.js"
@@ -0,0 +1,161 @@
+const { print } = require("../eazax/editor-main-util");
+const FileUtil = require("../eazax/file-util");
+const { containsProperty } = require("./object-util");
+
+/**
+ * 解析器
+ */
+const Parser = {
+
+    /**
+     * 节点树缓存
+     * @type {{ [key: string]: object }}
+     */
+    caches: Object.create(null),
+
+    /**
+     * 获取节点树
+     * @param {string} path 路径
+     * @returns {Promise<object>}
+     */
+    async getNodeTree(path) {
+        if (!Parser.caches[path]) {
+            const file = await FileUtil.readFile(path);
+            let data = null;
+            try {
+                data = JSON.parse(file);
+            } catch (error) {
+                print('warn', '文件解析失败', path);
+                print('warn', error);
+            }
+            if (!data) {
+                return null;
+            }
+            Parser.caches[path] = Parser.convert(data);
+        }
+        return Parser.caches[path];
+    },
+
+    /**
+     * 更新缓存
+     * @param {string} path 路径
+     */
+    async updateCache(path) {
+        Parser.caches[path] = null;
+        await Parser.getNodeTree(path);
+    },
+
+    /**
+     * 将资源解析为节点树
+     * @param {object} source 源数据
+     * @returns {object}
+     */
+    convert(source) {
+        const tree = Object.create(null),
+            type = source[0]['__type__'];
+        if (type === 'cc.SceneAsset') {
+            // 场景资源
+            const sceneId = source[0]['scene']['__id__'],
+                children = source[sceneId]['_children'];
+            tree.type = 'cc.Scene';  // 类型
+            tree.id = sceneId;       // ID
+            // 场景下可以有多个一级节点
+            tree.children = [];
+            for (let i = 0, l = children.length; i < l; i++) {
+                const nodeId = children[i]['__id__'];
+                Parser.convertNode(source, nodeId, tree);
+            }
+        } else if (type === 'cc.Prefab') {
+            // 预制体资源 
+            const uuid = source[source.length - 1]['asset']['__uuid__'];
+            tree.type = 'cc.Prefab';  // 类型
+            tree.uuid = uuid;         // uuid
+            // 预制体本身就是一个节点
+            tree.children = [];
+            const nodeId = source[0]['data']['__id__'];
+            Parser.convertNode(source, nodeId, tree);
+        }
+        return tree;
+    },
+
+    /**
+     * 解析节点
+     * @param {object} source 源数据
+     * @param {number} nodeId 节点 ID
+     * @param {object} parent 父节点
+     */
+    convertNode(source, nodeId, parent) {
+        const srcNode = source[nodeId],
+            node = Object.create(null);
+        // 基本信息
+        node.name = srcNode['_name'];
+        node.id = nodeId;
+        node.type = srcNode['__type__'];
+
+        // 路径
+        const parentPath = parent.path || null;
+        node.path = parentPath ? `${parentPath}/${node.name}` : node.name;
+
+        // 预制体引用
+        const srcPrefab = srcNode['_prefab'];
+        if (srcPrefab) {
+            const id = srcPrefab['__id__'];
+            node.prefab = Parser.extractValidInfo(source[id]);
+        }
+
+        // 组件
+        node.components = [];
+        const srcComponents = srcNode['_components'];
+        if (srcComponents && srcComponents.length > 0) {
+            for (let i = 0, l = srcComponents.length; i < l; i++) {
+                const compId = srcComponents[i]['__id__'],
+                    component = Parser.extractValidInfo(source[compId]);
+                node.components.push(component);
+            }
+        }
+
+        // 子节点
+        node.children = [];
+        const srcChildren = srcNode['_children'];
+        if (srcChildren && srcChildren.length > 0) {
+            for (let i = 0, l = srcChildren.length; i < l; i++) {
+                const nodeId = srcChildren[i]['__id__'];
+                Parser.convertNode(source, nodeId, node);
+            }
+        }
+
+        // 保存到父节点
+        parent.children.push(node);
+    },
+
+    /**
+     * 提取有效信息(含有 uuid)
+     * @param {object} source 源数据
+     * @returns {{ __type__: string, _name: string, fileId?: string }}
+     */
+    extractValidInfo(source) {
+        const result = Object.create(null);
+
+        // 记录有用的属性
+        const keys = ['__type__', '_name', 'fileId'];
+        for (let i = 0, l = keys.length; i < l; i++) {
+            const key = keys[i];
+            if (source[key] !== undefined) {
+                result[key] = source[key];
+            }
+        }
+
+        // 记录包含 uuid 的属性
+        for (const key in source) {
+            const contains = containsProperty(source[key], '__uuid__');
+            if (contains) {
+                result[key] = source[key];
+            }
+        }
+
+        return result;
+    },
+
+};
+
+module.exports = Parser;
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/main/printer.js" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/main/printer.js"
new file mode 100644
index 0000000000000000000000000000000000000000..ef993ae4f79e38efb34d9587c3b8a85fd72d6ab6
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/main/printer.js"
@@ -0,0 +1,108 @@
+const { translate, print, pureWithoutTitle } = require('../eazax/editor-main-util');
+const ConfigManager = require('../common/config-manager');
+
+/** 图标表 */
+const ICON_MAP = {
+    'scene': '🔥',
+    'prefab': '💠',
+    'node': '🎲',
+    'component': '🧩',
+    'property': '📄',
+    'asset': '📦',
+    'asset-info': '📋',
+    'node-refs': '📙',
+    'asset-refs': '📗',
+};
+
+/**
+ * 打印机
+ */
+const Printer = {
+
+    /**
+     * 打印结果至控制台
+     * @param {object} result 
+     */
+    printResult(result) {
+        if (!result) {
+            return;
+        }
+        const { printDetails, printFolding } = ConfigManager.get();
+        // 标志位
+        const nodeRefs = [], assetRefs = [];
+        let nodeRefsCount = 0, assetRefsCount = 0;
+        // 遍历引用信息
+        for (let refs = result.refs, i = 0, l = refs.length; i < l; i++) {
+            const ref = refs[i],
+                type = ref.type,
+                url = ref.url.replace('db://', '').replace('.meta', '');
+            if (type === 'scene' || type === 'prefab') {
+                // 场景或预制体
+                nodeRefs.push(`  ${ICON_MAP[type]} [${translate(type)}] ${url}`);
+                // 节点引用
+                for (let details = ref.refs, j = 0, l = details.length; j < l; j++) {
+                    nodeRefsCount++;
+                    // 详情
+                    if (printDetails) {
+                        const detail = details[j];
+                        let item = `    ${ICON_MAP['node']} [${translate('node')}] ${detail.node}`;
+                        if (detail.component) {
+                            item += `  →  ${ICON_MAP['component']} [${translate('component')}] ${detail.component}`;
+                        }
+                        if (detail.property) {
+                            item += `  →  ${ICON_MAP['property']} [${translate('property')}] ${detail.property}`;
+                        }
+                        nodeRefs.push(item);
+                    }
+                }
+            } else {
+                // 资源引用
+                assetRefsCount++;
+                assetRefs.push(`  ${ICON_MAP['asset']} [${translate(type)}] ${url}`);
+            }
+        }
+        // 组装文本
+        const texts = [];
+        // 分割线
+        texts.push(`${'- - '.repeat(36)}`);
+        // 基础信息
+        texts.push(`${ICON_MAP['asset-info']} ${translate('asset-info')}`);
+        texts.push(`  - ${translate('asset-type')}${result.type}`);
+        texts.push(`  - ${translate('asset-uuid')}${result.uuid}`);
+        texts.push(`  - ${translate('asset-url')}${result.url}`);
+        texts.push(`  - ${translate('asset-path')}${result.path}`);
+        // 分割线
+        texts.push(`${'- - '.repeat(36)}`);
+        // 节点引用
+        if (nodeRefs.length > 0) {
+            texts.push(`${ICON_MAP['node-refs']} ${translate('node-refs')} x ${nodeRefsCount}`);
+            for (let i = 0, l = nodeRefs.length; i < l; i++) {
+                texts.push(nodeRefs[i]);
+            }
+        }
+        // 资源引用
+        if (assetRefs.length > 0) {
+            texts.push(`${ICON_MAP['asset-refs']} ${translate('asset-refs')} x ${assetRefsCount}`);
+            for (let i = 0, l = assetRefs.length; i < l; i++) {
+                texts.push(assetRefs[i]);
+            }
+        }
+        // 结尾分割线
+        texts.push(`${'- - '.repeat(36)}`);
+        // 打印到控制台
+        if (printFolding) {
+            // 单行打印
+            texts.unshift(`🗂 ${translate('result')} >>>`);
+            print('log', texts.join('\n'));
+        } else {
+            // 逐行打印
+            print('log', translate('result'));
+            for (let i = 0, l = texts.length; i < l; i++) {
+                pureWithoutTitle(`  ${texts[i]}`);
+            }
+        }
+    },
+
+};
+
+module.exports = Printer;
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/renderer/settings/index.css" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/renderer/settings/index.css"
new file mode 100644
index 0000000000000000000000000000000000000000..f4e3cd751f670cfc90398fe56516febed96ad952
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/renderer/settings/index.css"
@@ -0,0 +1,61 @@
+* {
+  box-sizing: border-box;
+}
+
+body {
+  margin: 0;
+  padding: 0 12px;
+  background-color: #454545;
+  color: #bdbdbd;
+  user-select: none;
+}
+
+#app {
+  width: 100%;
+  height: 100%;
+}
+
+/* 标题 */
+.title {
+  font-size: 20px;
+  font-weight: 800;
+  padding: 10px 0;
+}
+
+/* 属性容器 */
+.properties {
+  overflow: visible;
+}
+
+/* 应用按钮 */
+.apply-btn {
+  min-width: 20px;
+  height: 33px;
+  background-image: linear-gradient(#4281b6, #4281b6);
+  border: 1px solid #171717;
+  border-radius: 3px;
+  color: #fff;
+  font-size: 16px;
+  font-weight: 800;
+  text-align: center;
+  outline: none;
+  overflow: hidden;
+  cursor: pointer;
+}
+
+.apply-btn:hover {
+  background-image: none;
+  background-color: #4c87b6;
+}
+
+.apply-btn:active {
+  background-image: none;
+  background-color: #2e6da2;
+  border-color: #fd942b;
+  color: #cdcdcd;
+  box-shadow: 1px 1px 10px #262626 inset;
+}
+
+[v-cloak] {
+  display: none;
+}
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/renderer/settings/index.html" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/renderer/settings/index.html"
new file mode 100644
index 0000000000000000000000000000000000000000..46b0e32debc72d210fec0bc908cbc868705fab87
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/renderer/settings/index.html"
@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <meta charset="utf-8">
+    <!-- 样式 -->
+    <link rel="stylesheet" type="text/css" href="../../eazax/css/cocos-tag.css">
+    <link rel="stylesheet" type="text/css" href="../../eazax/css/cocos-class.css">
+    <link rel="stylesheet" type="text/css" href="index.css">
+    <!-- 脚本 -->
+    <script type="text/javascript" src="../../../lib/vue.global.prod.js" defer></script>
+    <script type="text/javascript" src="index.js" defer></script>
+</head>
+
+<body>
+    <div id="app" v-cloak>
+        <!-- 标题 -->
+        <div class="title">{{ t('settings') }}</div>
+        <!-- 配置 -->
+        <div class="properties">
+            <!-- 选择快捷键 -->
+            <div class="property">
+                <div class="label">
+                    <span class="text">{{ t('select-key') }}</span>
+                    <span class="tooltip">{{ t('select-key-tooltip') }}</span>
+                </div>
+                <div class="content">
+                    <select v-model="selectKey">
+                        <option v-for="item in presets" :key="item.key" :value="item.key">{{ item.name }}</option>
+                    </select>
+                </div>
+            </div>
+            <!-- 自定义快捷键 -->
+            <div class="property">
+                <div class="label">
+                    <span class="text">{{ t('custom-key') }}</span>
+                    <span class="tooltip">{{ t('custom-key-tooltip') }}</span>
+                </div>
+                <div class="content">
+                    <input v-model="customKey" :placeholder="t('custom-key-placeholder')" />
+                </div>
+            </div>
+            <!-- 展示详情 -->
+            <div class="property">
+                <div class="label">
+                    <span class="text">{{ t('print-details') }}</span>
+                    <span class="tooltip">{{ t('print-details-tooltip') }}</span>
+                </div>
+                <div class="content">
+                    <input type="checkbox" v-model="printDetails" />
+                </div>
+            </div>
+            <!-- 折叠结果 -->
+            <div class="property">
+                <div class="label">
+                    <span class="text">{{ t('print-folding') }}</span>
+                    <span class="tooltip">{{ t('print-folding-tooltip') }}</span>
+                </div>
+                <div class="content">
+                    <input type="checkbox" v-model="printFolding" />
+                </div>
+            </div>
+            <!-- 自动检查更新 -->
+            <div class="property">
+                <div class="label">
+                    <span class="text">{{ t('auto-check-update') }}</span>
+                    <span class="tooltip">{{ t('auto-check-update-tooltip') }}</span>
+                </div>
+                <div class="content">
+                    <input type="checkbox" v-model="autoCheckUpdate" />
+                </div>
+            </div>
+            <!-- 快捷键参考 -->
+            <div class="tip">
+                <span>{{ t('reference') }}</span>
+                <a href="https://www.electronjs.org/docs/api/accelerator" target="_blank">{{ t('accelerator') }}</a>
+            </div>
+            <!-- Git 仓库 -->
+            <div class="tip">
+                <span>{{ t('repository') }}</span>
+                <a :href="repositoryUrl" target="_blank">{{ packageName }}</a>
+            </div>
+            <div class="line"></div>
+            <!-- 应用按钮 -->
+            <button class="apply-btn" @click="onApplyBtnClick">{{ t('apply') }}</button>
+        </div>
+    </div>
+</body>
+
+</html>
\ No newline at end of file
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/renderer/settings/index.js" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/renderer/settings/index.js"
new file mode 100644
index 0000000000000000000000000000000000000000..a508ebec05a91497cf57cfb55c7bbc9d9c20bc39
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/src/renderer/settings/index.js"
@@ -0,0 +1,191 @@
+const { shell } = require('electron');
+const { getUrlParam } = require('../../eazax/browser-util');
+const I18n = require('../../eazax/i18n');
+const RendererEvent = require('../../eazax/renderer-event');
+const PackageUtil = require('../../eazax/package-util');
+const EditorRendererKit = require('../../eazax/editor-renderer-kit');
+const ConfigManager = require('../../common/config-manager');
+
+// 导入 Vue 工具函数
+const { ref, watch, onMounted, onBeforeUnmount, createApp } = Vue;
+
+/** 当前语言 */
+const LANG = getUrlParam('lang');
+
+// 构建 Vue 应用
+const App = {
+
+    /**
+     * 设置
+     * @param {*} props 
+     * @param {*} context 
+     */
+    setup(props, context) {
+
+        // 预设快捷键
+        const presets = ref([
+            { key: '', name: t('none') },
+            { key: 'custom', name: t('custom-key') },
+            { key: 'F1', name: 'F1' },
+            { key: 'F3', name: 'F3' },
+            { key: 'F4', name: 'F4' },
+            { key: 'F5', name: 'F5' },
+            { key: 'F6', name: 'F6' },
+            { key: 'CmdOrCtrl+F', name: 'Cmd/Ctrl + F' },
+            { key: 'CmdOrCtrl+B', name: 'Cmd/Ctrl + B' },
+            { key: 'CmdOrCtrl+Shift+F', name: 'Cmd/Ctrl + Shift + F' },
+        ]);
+        // 选择
+        const selectKey = ref('');
+        // 自定义
+        const customKey = ref('');
+        // 打印详情
+        const printDetails = ref(true);
+        // 单行打印
+        const printFolding = ref(true);
+        // 自动检查更新
+        const autoCheckUpdate = ref(false);
+
+        // 仓库地址
+        const repositoryUrl = PackageUtil.repository;
+        // 包名
+        const packageName = PackageUtil.name;
+
+        // 监听选择快捷键
+        watch(selectKey, (value) => {
+            if (value !== 'custom') {
+                customKey.value = '';
+            }
+        });
+
+        // 监听自定义
+        watch(customKey, (value) => {
+            if (value !== '' && selectKey.value !== 'custom') {
+                selectKey.value = 'custom';
+            }
+        });
+
+        /**
+         * 获取配置
+         */
+        function getConfig() {
+            const config = ConfigManager.get();
+            if (!config) return;
+            // 配置
+            printDetails.value = config.printDetails;
+            printFolding.value = config.printFolding;
+            autoCheckUpdate.value = config.autoCheckUpdate;
+            // 快捷键
+            const hotkey = config.hotkey;
+            if (!hotkey || hotkey === '') {
+                selectKey.value = '';
+                customKey.value = '';
+                return;
+            }
+            // 预设快捷键
+            for (let i = 0, l = presets.value.length; i < l; i++) {
+                if (presets.value[i].key === hotkey) {
+                    selectKey.value = hotkey;
+                    customKey.value = '';
+                    return;
+                }
+            }
+            // 自定义快捷键
+            selectKey.value = 'custom';
+            customKey.value = hotkey;
+        }
+
+        /**
+         * 保存配置
+         */
+        function setConfig() {
+            const config = {
+                hotkey: null,
+                printDetails: printDetails.value,
+                printFolding: printFolding.value,
+                autoCheckUpdate: autoCheckUpdate.value,
+            };
+            if (selectKey.value === 'custom') {
+                // 自定义输入是否有效
+                if (customKey.value === '') {
+                    EditorRendererKit.print('warn', t('custom-key-error'));
+                    return;
+                }
+                // 不可以使用双引号(避免 json 值中出现双引号而解析错误,导致插件加载失败)
+                if (customKey.value.includes('"')) {
+                    customKey.value = customKey.value.replace(/\"/g, '');
+                    EditorRendererKit.print('warn', t('quote-error'));
+                    return;
+                }
+                config.hotkey = customKey.value;
+            } else {
+                config.hotkey = selectKey.value;
+            }
+            // 保存到本地
+            ConfigManager.set(config);
+        }
+
+        /**
+         * 应用按钮点击回调
+         * @param {*} event 
+         */
+        function onApplyBtnClick(event) {
+            // 保存配置
+            setConfig();
+        }
+
+        /**
+         * 翻译
+         * @param {string} key 
+         */
+        function t(key) {
+            return I18n.get(LANG, key);
+        }
+
+        /**
+         * 生命周期:挂载后
+         */
+        onMounted(() => {
+            // 获取配置
+            getConfig();
+            // 覆盖 a 标签点击回调(使用默认浏览器打开网页)
+            const links = document.querySelectorAll('a[href]');
+            links.forEach((link) => {
+                link.addEventListener('click', (event) => {
+                    event.preventDefault();
+                    const url = link.getAttribute('href');
+                    shell.openExternal(url);
+                });
+            });
+            // (主进程)检查更新
+            RendererEvent.send('check-update', false);
+        });
+
+        /**
+         * 生命周期:卸载前
+         */
+        onBeforeUnmount(() => {
+
+        });
+
+        return {
+            presets,
+            selectKey,
+            customKey,
+            printDetails,
+            printFolding,
+            autoCheckUpdate,
+            repositoryUrl,
+            packageName,
+            onApplyBtnClick,
+            t,
+        };
+
+    },
+
+};
+
+// 创建实例
+const app = createApp(App);
+// 挂载
+app.mount('#app');
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/typings/cocos/editor.d.ts" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/typings/cocos/editor.d.ts"
new file mode 100644
index 0000000000000000000000000000000000000000..93278dfbe8bd7da080b9751a30102cc10223b7f9
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/typings/cocos/editor.d.ts"
@@ -0,0 +1,1053 @@
+/**
+ * Cocos Creator 编辑器模块
+ * @author 陈皮皮(ifaswind)
+ * @version 20210312
+ * @see https://gitee.com/ifaswind/eazax-ccc/blob/master/declarations/editor.d.ts
+ */
+declare module Editor {
+
+    /**
+     * Log the normal message and show on the console. The method will send ipc message editor:console-log to all windows.
+     * @param args Whatever arguments the message needs
+     */
+    function log(...args: any): void;
+
+    /**
+     * Log the normal message and show on the console. The method will send ipc message editor:console-log to all windows.
+     * @param args Whatever arguments the message needs
+     */
+    function info(...args: any): void;
+
+    /**
+     * Log the warnning message and show on the console, it also shows the call stack start from the function call it. The method will send ipc message editor:console-warn to all windows.
+     * @param args Whatever arguments the message needs
+     */
+    function warn(...args: any): void;
+
+    /**
+     * Log the error message and show on the console, it also shows the call stack start from the function call it. The method will sends ipc message editor:console-error to all windows.
+     * @param args Whatever arguments the message needs
+     */
+    function error(...args: any): void;
+
+    /**
+     * Log the success message and show on the console The method will send ipc message editor:console-success to all windows.
+     * @param args Whatever arguments the message needs
+     */
+    function success(...args: any): void;
+
+    /**
+     * Require the module by Editor.url. This is good for module exists in package, since the absolute path of package may be variant in different machine.
+     * @param url 
+     */
+    function require(url: string): any;
+
+    /**
+     * Returns the file path (if it is registered in custom protocol) or url (if it is a known public protocol).
+     * @param url 
+     * @param encode 
+     */
+    function url(url: string, encode?: string): string;
+
+    function T(key: string): string;
+
+}
+
+declare module Editor {
+    readonly let appPath: string;
+    readonly let frameworkPath: string;
+    readonly let importPath: string;
+    readonly let isWin32: boolean;
+    readonly let isDarwin: boolean;
+    readonly let lang: string;
+    readonly let libraryPath: string;
+    readonly let sceneScripts: { [packageName: string]: string };
+}
+
+declare module Editor {
+
+    /**
+     * 渲染进程
+     */
+    module RendererProcess {
+
+        /**
+        * AssetDB singleton class in renderer process, you can access the instance with `Editor.assetdb`.
+        */
+        class AssetDB {
+
+            /**
+             * The remote AssetDB instance of main process, same as `Editor.remote.assetdb`.
+             */
+            readonly remote: Remote;
+
+            /**
+             * The library path.
+             */
+            readonly library: string;
+
+            /**
+             * Reveal given url in native file system.
+             * @param url 
+             */
+            explore(url: string): string;
+
+            /**
+             * Reveal given url's library file in native file system.
+             * @param url 
+             */
+            exploreLib(url: string): string;
+
+            /**
+             * Get native file path by url.
+             * @param url 
+             * @param cb The callback function.
+             */
+            queryPathByUrl(url: string, cb?: (err: any, path: any) => void): void;
+
+            /**
+             * Get uuid by url.
+             * @param url 
+             * @param cb The callback function.
+             */
+            queryUuidByUrl(url: string, cb?: (err: any, uuid: any) => void): void;
+
+            /**
+             * Get native file path by uuid.
+             * @param uuid 
+             * @param cb The callback function.
+             */
+            queryPathByUuid(uuid: string, cb?: (err: any, path: any) => void): void;
+
+            /**
+             * Get asset url by uuid.
+             * @param uuid 
+             * @param cb The callback function.
+             */
+            queryUrlByUuid(uuid: string, cb?: (err: any, url: any) => void): void;
+
+            /**
+             * Get asset info by uuid.
+             * @param uuid 
+             * @param cb The callback function.
+             */
+            queryInfoByUuid(uuid: string, cb?: (err: any, info: any) => void): void;
+
+            /**
+             * Get meta info by uuid.
+             * @param uuid 
+             * @param cb The callback function.
+             */
+            queryMetaInfoByUuid(uuid: string, cb?: (err: any, info: any) => void): void;
+
+            /**
+             * Query all assets from asset-db.
+             * @param cb The callback function.
+             */
+            deepQuery(cb?: (err: any, results: any[]) => void): void;
+
+            /**
+             * Query assets by url pattern and asset-type.
+             * @param pattern The url pattern.
+             * @param assetTypes The asset type(s).
+             * @param cb The callback function.
+             */
+            queryAssets(pattern: string, assetTypes: string | string[], cb?: (err: any, results: any[]) => void): void;
+
+            /**
+             * Import files outside asset-db to specific url folder. 
+             * @param rawfiles Rawfile path list.
+             * @param destUrl The url of dest folder.
+             * @param showProgress Show progress or not.
+             * @param cb The callbak function.
+             */
+            import(rawfiles: string[], destUrl: string, showProgress?: boolean, cb?: (err: any, result: any) => void): void;
+
+            /**
+             * Create asset in specific url by sending string data to it.
+             * @param uuid 
+             * @param metaJson 
+             * @param cb the callback function.
+             */
+            create(url: string, data: string, cb?: (err: any, result: any) => void): void;
+
+            /**
+             * Move asset from src to dest.
+             * @param srcUrl 
+             * @param destUrl 
+             * @param showMessageBox 
+             */
+            move(srcUrl: string, destUrl: string, showMessageBox?: boolean): void;
+
+            /**
+             * Delete assets by url list.
+             * @param urls 
+             */
+            delete(urls: string[]): void;
+
+            /**
+             * Save specific asset by sending string data.
+             * @param url 
+             * @param data 
+             * @param cb the callback function.
+             */
+            saveExists(url: string, data: string, cb?: (err: any, result: any) => void): void;
+
+            /**
+             * Create or save assets by sending string data. If the url is already existed, it will be changed with new data. The behavior is same with method saveExists. Otherwise, a new asset will be created. The behavior is same with method create.
+             * @param url 
+             * @param data 
+             * @param cb the callback function.
+             */
+            createOrSave(url: string, data: string, cb?: (err: any, result: any) => void): void;
+
+            /**
+             * Save specific meta by sending meta's json string.
+             * @param uuid 
+             * @param metaJson 
+             * @param cb the callback function.
+             */
+            saveMeta(uuid: string, metaJson: string, cb?: (err: any, result: any) => void): void;
+
+            /**
+             * Refresh the assets in url, and return the results.
+             * @param url 
+             * @param cb 
+             */
+            refresh(url: string, cb?: (err: any, results: any[]) => void): void;
+
+        }
+
+    }
+
+    /**
+     * 主进程
+     */
+    module MainProcess {
+
+        /**
+         * AssetDB singleton class in main process, you can access the instance with `Editor.assetdb`.
+         */
+        class AssetDB {
+
+            /**
+             * Return uuid by url. If uuid not found, it will return null.
+             * @param url 
+             */
+            urlToUuid(url: string): string;
+
+            /**
+             * Return uuid by file path. If uuid not found, it will return null.
+             * @param fspath 
+             */
+            fspathToUuid(fspath: string): string;
+
+            /**
+             * Return file path by uuid. If file path not found, it will return null.
+             * @param url 
+             */
+            uuidToFspath(url: string): string;
+
+            /**
+             * Return url by uuid. If url not found, it will return null.
+             * @param uuid 
+             */
+            uuidToUrl(uuid: string): string;
+
+            /**
+             * Return url by file path. If file path not found, it will return null.
+             * @param fspath 
+             */
+            fspathToUrl(fspath: string): string;
+
+            /**
+             * Return file path by url. If url not found, it will return null.
+             * @param url 
+             */
+            urlToFspath(url: string): string;
+
+            /**
+             * Check existance by url.
+             * @param url 
+             */
+            exists(url: string): string;
+
+            /**
+             * Check existance by uuid.
+             * @param uuid 
+             */
+            existsByUuid(uuid: string): string;
+
+            /**
+             * Check existance by path.
+             * @param fspath 
+             */
+            existsByPath(fspath: string): string;
+
+            /**
+             * Check whether asset for a given url is a sub asset.
+             * @param url 
+             */
+            isSubAsset(url: string): boolean;
+
+            /**
+             * Check whether asset for a given uuid is a sub asset.
+             * @param uuid 
+             */
+            isSubAssetByUuid(uuid: string): boolean;
+
+            /**
+             * Check whether asset for a given path is a sub asset.
+             * @param fspath 
+             */
+            isSubAssetByPath(fspath: string): boolean;
+
+            /**
+             * Check whether asset contains sub assets for a given url.
+             * @param url
+             */
+            containsSubAssets(url: string): boolean;
+
+            /**
+             * Check whether asset contains sub assets for a given uuid.
+             * @param uuid
+             */
+            containsSubAssetsByUuid(uuid: string): boolean;
+
+            /**
+             * Check whether asset contains sub assets for a given path.
+             * @param fspath 
+             */
+            containsSubAssetsByPath(fspath: string): boolean;
+
+            /**
+             * Return asset info by a given url.
+             * @param url 
+             */
+            assetInfo(url: string): AssetInfo;
+
+            /**
+             * Return asset info by a given uuid.
+             * @param uuid 
+             */
+            assetInfoByUuid(uuid: string): AssetInfo;
+
+            /**
+             * Return asset info by a given file path.
+             * @param fspath 
+             */
+            assetInfoByPath(fspath: string): AssetInfo;
+
+            /**
+             * Return all sub assets info by url if the url contains sub assets.
+             * @param url 
+             */
+            subAssetInfos(url: string): AssetInfo[];
+
+            /**
+             * Return all sub assets info by uuid if the uuid contains sub assets.
+             * @param uuid 
+             */
+            subAssetInfosByUuid(uuid: string): AssetInfo[];
+
+            /**
+             * Return all sub assets info by path if the path contains sub assets.
+             * @param fspath 
+             */
+            subAssetInfosByPath(fspath: string): AssetInfo[];
+
+            /**
+             * Return meta instance by a given url.
+             * @param url 
+             */
+            loadMeta(url: string): MetaBase;
+
+            /**
+             * Return meta instance by a given uuid.
+             * @param uuid 
+             */
+            loadMetaByUuid(uuid: string): MetaBase;
+
+            /**
+             * Return meta instance by a given path.
+             * @param fspath 
+             */
+            loadMetaByPath(fspath: string): MetaBase;
+
+            /**
+             * Return whether a given url is reference to a mount.
+             * @param url 
+             */
+            isMount(url: string): boolean;
+
+            /**
+             * Return whether a given path is reference to a mount.
+             * @param fspath 
+             */
+            isMountByPath(fspath: string): boolean;
+
+            /**
+             * Return whether a given uuid is reference to a mount.
+             * @param uuid 
+             */
+            isMountByUuid(uuid: string): boolean;
+
+            /**
+             * Return mount info by url.
+             * @param url 
+             */
+            mountInfo(url: string): MountInfo;
+
+            /**
+             * Return mount info by uuid.
+             * @param uuid 
+             */
+            mountInfoByUuid(uuid: string): MountInfo;
+
+            /**
+             * Return mount info by path.
+             * @param fspath 
+             */
+            mountInfoByPath(fspath: string): MountInfo;
+
+            /**
+             * Mount a directory to assetdb, and give it a name. If you don't provide a name, it will mount to root.
+             * @param path file system path.
+             * @param mountPath the mount path (relative path).
+             * @param opts options.
+             * @param opts.hide if the mount hide in assets browser.
+             * @param opts.virtual if this is a virtual mount point.
+             * @param opts.icon icon for the mount.
+             * @param cb a callback function.
+             * @example Editor.assetdb.mount('path/to/mount', 'assets', function (err) {
+                            // mounted, do something ...
+                        });
+             */
+            mount(path: string, mountPath: string, opts: { hide: object, vitural: object, icon: object }, cb?: (err: any) => void): void;
+
+            /**
+             * Attach the specified mount path.
+             * @param mountPath the mount path (relative path).
+             * @param cb a callback function.
+             * @example Editor.assetdb.attachMountPath('assets', function (err, results) {
+                            // mount path attached, do something ...
+                            // results are the assets created
+                        });
+             */
+            attachMountPath(mountPath: string, cb?: (err: any, results: any[]) => void): void;
+
+            /**
+             * Unattach the specified mount path.
+             * @param mountPath the mount path (relative path).
+             * @param cb a callback function.
+             * @example Editor.assetdb.unattachMountPath('assets', function (err, results) {
+                            // mount path unattached, do something ...
+                            // results are the assets deleted
+                        });
+             */
+            unattachMountPath(mountPath: string, cb?: (err: any, results: any[]) => void): void;
+
+            /**
+             * Unmount by name.
+             * @param mountPath the mount path.
+             * @param cb a callback function.
+             * @example Editor.assetdb.unmount('assets', function (err) {
+                            // unmounted, do something ...
+                        });
+             */
+            unmount(mountPath: string, cb?: (err: any) => void): void;
+
+            /**
+             * Init assetdb, it will scan the mounted directories, and import unimported assets.
+             * @param cb a callback function.
+             * @example Editor.assetdb.init(function (err, results) {
+                            // assets that imported during init
+                            results.forEach(function (result) {
+                                // result.uuid
+                                // result.parentUuid
+                                // result.url
+                                // result.path
+                                // result.type
+                            });
+                        });
+             */
+            init(cb?: (err: any, results: any[]) => void): void;
+
+            /**
+             * Refresh the assets in url, and return the results.
+             * @param url 
+             * @param cb 
+             */
+            refresh(url: string, cb?: Function): void;
+
+            /**
+             * deepQuery
+             * @param cb 
+             * @example Editor.assetdb.deepQuery(function (err, results) {
+                          results.forEach(function (result) {
+                            // result.name
+                            // result.extname
+                            // result.uuid
+                            // result.type
+                            // result.isSubAsset
+                            // result.children - the array of children result
+                          });
+                        });
+             */
+            deepQuery(cb?: Function): void;
+
+            /**
+             * queryAssets
+             * @param pattern The url pattern.
+             * @param assetTypes The asset type(s).
+             * @param cb The callback function.
+             */
+            queryAssets(pattern: string, assetTypes: string | string[], cb?: (err: Error, results: any[]) => void): void;
+
+            /**
+             * queryMetas
+             * @param pattern The url pattern.
+             * @param type The asset type.
+             * @param cb The callback function.
+             */
+            queryMetas(pattern: string, type: string, cb?: (err: Error, results: any[]) => void): void;
+
+            /**
+             * move
+             * @param srcUrl The url pattern.
+             * @param destUrl The asset type.
+             * @param cb The callback function.
+             */
+            move(srcUrl: string, destUrl: string, cb?: (err: Error, results: any[]) => void): void;
+
+            /**
+             * delete
+             * @param urls 
+             * @param cb 
+             */
+            delete(urls: string[], cb?: (err: Error, results: any[]) => void): void;
+
+            /**
+             * Create asset at url with data.
+             * @param url 
+             * @param data 
+             * @param cb 
+             */
+            create(url: string, data: string, cb?: (err: Error, results: any[]) => void): void;
+
+            /**
+             * Save data to the exists asset at url.
+             * @param url 
+             * @param data 
+             * @param cb 
+             */
+            saveExists(url: string, data: string, cb?: (err: Error, meta: any) => void): void;
+
+            /**
+             * Import raw files to url
+             * @param rawfiles 
+             * @param url 
+             * @param cb 
+             */
+            import(rawfiles: string[], url: string, cb?: (err: Error, results: any[]) => void): void;
+
+            /**
+             * Overwrite the meta by loading it through uuid.
+             * @param uuid 
+             * @param jsonString 
+             * @param cb 
+             */
+            saveMeta(uuid: string, jsonString: string, cb?: (err: Error, meta: any) => void): void;
+
+            /**
+             * Exchange uuid for two assets.
+             * @param urlA 
+             * @param urlB 
+             * @param cb 
+             */
+            exchangeUuid(urlA: string, urlB: string, cb?: (err: Error, results: any[]) => void): void;
+
+            /**
+             * Clear imports.
+             * @param url 
+             * @param cb 
+             */
+            clearImports(url: string, cb?: (err: Error, results: any[]) => void): void;
+
+            /**
+             * Register meta type.
+             * @param extname 
+             * @param folder Whether it's a folder type.
+             * @param metaCtor 
+             */
+            register(extname: string, folder: boolean, metaCtor: object): void;
+
+            /**
+             * Unregister meta type.
+             * @param metaCtor 
+             */
+            unregister(metaCtor: object): void;
+
+            /**
+             * Get the relative path from mount path to the asset by fspath.
+             * @param fspath  
+             */
+            getRelativePath(fspath: string): string;
+
+            /**
+             * Get the backup file path of asset file.
+             * @param filePath 
+             */
+            getAssetBackupPath(filePath: string): string;
+
+        }
+
+    }
+
+    interface MetaBase {
+        ver: string;
+        uuid: string;
+    }
+
+    interface MountInfo {
+        path: string;
+        name: string;
+        type: string;
+    }
+
+    interface Metas {
+        asset: string[];
+        folder: string[];
+        mount: string[];
+        'custom-asset': string[];
+        'native-asset': string[];
+        'animation-clip': string[];
+        'audio-clip': string[];
+        'bitmap-font': string[];
+    }
+
+    interface App {
+        readonly home: string;
+        readonly name: string;
+        readonly path: string;
+        readonly version: string;
+    }
+
+    class Remote {
+        readonly App: App;
+        readonly isClosing: boolean;
+        readonly lang: string;
+        readonly isNode: boolean;
+        readonly isElectron: boolean;
+        readonly isNative: boolean;
+        readonly isPureWeb: boolean;
+        readonly isRendererProcess: boolean;
+        readonly isMainProcess: boolean;
+        readonly isDarwin: boolean;
+        readonly isWin32: boolean;
+        readonly isRetina: boolean;
+        readonly frameworkPath: string;
+        readonly dev: boolean;
+        readonly logfile: string;
+        readonly themePaths: string[];
+        readonly theme: string;
+        readonly showInternalMount: boolean;
+        readonly metas: Metas;
+        readonly metaBackupPath: string;
+        readonly assetBackupPath: string;
+        readonly libraryPath: string;
+        readonly importPath: string;
+        readonly externalMounts: any;
+        readonly mountsWritable: string;
+        readonly assetdb: MainProcess.AssetDB;
+        readonly assetdbInited: boolean;
+        readonly sceneList: string[];
+        readonly versions: {
+            'asset-db': string;
+            CocosCreator: string;
+            cocos2d: string;
+            'editor-framework': string;
+        }
+    }
+
+    /** Remote 实例 */
+    const remote: Remote;
+
+    /** AssetDB 实例 */
+    const assetdb: MainProcess.AssetDB;
+
+}
+
+interface AssetInfo {
+    uuid?: string;
+    path?: string;
+    url?: string;
+    type?: string;
+    isSubAsset?: boolean;
+    assetType?: string;
+    id?: string;
+    name?: string;
+    subAssetTypes?: string;
+}
+
+declare module Editor.Project {
+    readonly let id: string;
+    readonly let name: string;
+    /** Absolute path for current open project. */
+    readonly let path: string;
+}
+
+declare module Editor.Builder {
+
+    /**
+     * 
+     * @param eventName The name of the event
+     * @param callback The event callback
+     */
+    function on(eventName: string, callback: (options: BuildOptions, cb: Function) => void): void;
+
+    /**
+     * 
+     * @param eventName The name of the event
+     * @param callback The event callback
+     */
+    function once(eventName: string, callback: (options: BuildOptions, cb: Function) => void): void;
+
+    /**
+     * 
+     * @param eventName The name of the event
+     * @param callback The event callback
+     */
+    function removeListener(eventName: string, callback: Function): void;
+
+}
+
+declare module Editor.Scene {
+
+    /**
+     * 
+     * @param packageName 
+     * @param method 
+     * @param cb 
+     */
+    function callSceneScript(packageName: string, method: string, cb: (err: Error, msg: any) => void): void;
+
+}
+
+declare module Editor.Panel {
+
+    /**
+     * Open a panel via panelID.
+     * @param panelID The panel ID
+     * @param argv 
+     */
+    function open(panelID: string, argv?: object): void;
+
+    /**
+     * Close a panel via panelID.
+     * @param panelID The panel ID
+     */
+    function close(panelID: string): void;
+
+    /**
+     * Find panel frame via panelID.
+     * @param panelID The panel ID
+     */
+    function find(panelID: string): void;
+
+    /**
+     * Extends a panel.
+     * @param proto 
+     */
+    function extend(proto: object): void;
+
+}
+
+declare module Editor.Selection {
+
+    /**
+     * Select item with its id.
+     * @param type 
+     * @param id 
+     * @param unselectOthers 
+     * @param confirm 
+     */
+    function select(type: string, id: string, unselectOthers?: boolean, confirm?: boolean): void;
+
+    /**
+     * Unselect item with its id.
+     * @param type 
+     * @param id 
+     * @param confirm 
+     */
+    function unselect(type: string, id: string, confirm?: boolean): void;
+
+    /**
+     * Hover item with its id. If id is null, it means hover out.
+     * @param type 
+     * @param id 
+     */
+    function hover(type: string, id: string): string;
+
+    /**
+     * 
+     * @param type 
+     */
+    function clear(type: string): void;
+
+    /**
+     * 
+     * @param type 
+     */
+    function curActivate(type: string): string[];
+
+    /**
+     * 
+     * @param type 
+     */
+    function curGlobalActivate(type: string): string[];
+
+    /**
+     * 
+     * @param type 
+     */
+    function curSelection(type: string): string[];
+
+    /**
+     * 
+     * @param items 
+     * @param mode 'top-level', 'deep' and 'name'
+     * @param func 
+     */
+    function filter(items: string[], mode: string, func: Function): string[];
+
+}
+
+declare module Editor.Ipc {
+
+    /**
+     * Send message with ...args to main process asynchronously. It is possible to add a callback as the last or the 2nd last argument to receive replies from the IPC receiver.
+     * @param message Ipc message.
+     * @param args Whatever arguments the message needs.
+     * @param callback You can specify a callback function to receive IPC reply at the last or the 2nd last argument.
+     * @param timeout You can specify a timeout for the callback at the last argument. If no timeout specified, it will be 5000ms.
+     */
+    function sendToMain(message: string, ...args?: any, callback?: Function, timeout?: number): void;
+
+    /**
+     * Send message with ...args to panel defined in renderer process asynchronously. It is possible to add a callback as the last or the 2nd last argument to receive replies from the IPC receiver.
+     * @param panelID Panel ID.
+     * @param message Ipc message.
+     * @param args Whatever arguments the message needs.
+     * @param callback You can specify a callback function to receive IPC reply at the last or the 2nd last argument.
+     * @param timeout You can specify a timeout for the callback at the last argument. If no timeout specified, it will be 5000ms.
+     */
+    function sendToPanel(panelID: string, message: string, ...args?: any, callback?: Function, timeout?: number): void;
+
+    /**
+     * Send message with ...args to all opened window and to main process asynchronously.
+     * @param message Ipc message.
+     * @param args Whatever arguments the message needs.
+     * @param option You can indicate the last argument as an IPC option by Editor.Ipc.option({...}).
+     */
+    function sendToAll(message: string, ...args?: any, option?: object): void;
+
+    /**
+     * Send message with ...args to main process synchronized and return a result which is responded from main process.
+     * @param message Ipc message.
+     * @param args Whatever arguments the message needs.
+     */
+    function sendToMainSync(message: string, ...args?: any): void;
+
+    /**
+     * Send message with ...args to main process by package name and the short name of the message.
+     * @param pkgName Package name.
+     * @param message Ipc message.
+     * @param args Whatever arguments the message needs.
+     */
+    function sendToPackage(pkgName: string, message: string, ...args?: any): void;
+
+}
+
+declare module Editor.UI {
+
+    module Setting {
+
+        /**
+         * Control the default step for float point input element. Default is 0.1.
+         * @param value 
+         */
+        function stepFloat(value: number): void;
+
+        /**
+         * Control the default step for integer input element. Default is 1.
+         * @param value 
+         */
+        function stepInt(value: number): void;
+
+        /**
+         * Control the step when shift key press down. Default is 10.
+         * @param value 
+         */
+        function shiftStep(value: number): void;
+
+    }
+
+    module DragDrop {
+
+        readonly let dragging: boolean;
+
+        function start(e: any, t: any): void;
+
+        function end(): void;
+
+        function updateDropEffect(e: any, t: any);
+
+        function type(e: any);
+
+        function filterFiles(e: any);
+
+        function items(dataTransfer: DataTransfer): AssetInfo[];
+
+        function getDragIcon(e: any);
+
+        function options(e: any);
+
+        function getLength(e: any): number;
+
+    }
+
+}
+
+declare module Editor.GizmosUtils {
+
+    function addMoveHandles(e, n, t);
+
+    function getCenter(e);
+
+    function getCenterWorldPos(n);
+
+    function getCenterWorldPos3D(e);
+
+    function getRecursiveNodes(e, t);
+
+    function getRecursiveWorldBounds3D(e);
+
+    function getWorldBounds3D(n);
+
+    function snapPixel(e);
+
+    function snapPixelWihVec2(e);
+
+}
+
+declare module Editor.Utils {
+
+    /**
+     * Uuid 工具
+     */
+    module UuidUtils {
+
+        /**
+         * 压缩后的 uuid 可以减小保存时的尺寸,但不能做为文件名(因为无法区分大小写并且包含非法字符)。
+         * 默认将 uuid 的后面 27 位压缩成 18 位,前 5 位保留下来,方便调试。
+         * 如果启用 min 则将 uuid 的后面 30 位压缩成 20 位,前 2 位保留不变。
+         * @param uuid 
+         * @param min 
+         */
+        function compressUuid(uuid: string, min?: boolean): string;
+
+        function compressHex(hexString: string, reservedHeadLength?: number): string;
+
+        function decompressUuid(str: string): string;
+
+        function isUuid(str: string): boolean;
+
+        function uuid(): string;
+
+    }
+
+}
+
+declare interface BuildOptions {
+    actualPlatform: string;
+    android: { packageName: string };
+    'android-instant': {
+        REMOTE_SERVER_ROOT: string;
+        host: string;
+        packageName: string;
+        pathPattern: string;
+        recordPath: string;
+        scheme: string;
+        skipRecord: boolean;
+    }
+    apiLevel: string;
+    appABIs: string[];
+    appBundle: boolean;
+    buildPath: string;
+    buildScriptsOnly: boolean;
+    debug: string;
+    dest: string;
+    embedWebDebugger: boolean;
+    encryptJs: boolean;
+    excludeScenes: string[];
+    excludedModules: string[];
+    'fb-instant-games': object;
+    inlineSpriteFrames: boolean;
+    inlineSpriteFrames_native: boolean;
+    ios: { packageName: string };
+    mac: { packageName: string };
+    md5Cache: boolean;
+    mergeStartScene: boolean;
+    optimizeHotUpdate: boolean;
+    orientation: {
+        landscapeLeft: boolean;
+        landscapeRight: boolean;
+        portrait: boolean;
+        upsideDown: boolean;
+    };
+    packageName: string;
+    platform: string;
+    previewHeight: number;
+    previewWidth: number;
+    scenes: string[];
+    sourceMaps: boolean;
+    startScene: string;
+    template: string;
+    title: string;
+    useDebugKeystore: boolean;
+    vsVersion: string;
+    webOrientation: boolean;
+    win32: object;
+    xxteaKey: string;
+    zipCompressJs: string;
+    project: string;
+    projectName: string;
+    debugBuildWorker: boolean;
+    bundles: bundle[];
+}
+
+interface bundle {
+    /** bundle 的根目录 */
+    root: string;
+    /** bundle 的输出目录 */
+    dest: string;
+    /** 脚本的输出目录 */
+    scriptDest: string;
+    /** bundle 的名称 */
+    name: string;
+    /** bundle 的优先级 */
+    priority: number;
+    /** bundle 中包含的场景 */
+    scenes: string[];
+    /** bundle 的压缩类型 */
+    compressionType: 'subpackage' | 'normal' | 'none' | 'merge_all_json' | 'zip';
+    /** bundle 所构建出来的所有资源 */
+    buildResults: BuildResults;
+    /** bundle 的版本信息,由 config 生成 */
+    version: string;
+    /** bundle 的 config.json 文件 */
+    config: any;
+    /** bundle 是否是远程包 */
+    isRemote: boolean;
+}
diff --git "a/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/typings/vue.d.ts" "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/typings/vue.d.ts"
new file mode 100644
index 0000000000000000000000000000000000000000..fdf3a7b4d6cb0552b6b1af55230b6f0e4f86b481
--- /dev/null
+++ "b/packages/\345\274\225\347\224\250\346\237\245\346\211\276\345\231\250/typings/vue.d.ts"
@@ -0,0 +1 @@
+declare var Vue: any;